From 48a30487da8628cc375f72d3f13f0daa47287008 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 27 Jul 2023 14:42:29 +0100 Subject: [PATCH 01/13] Move doc/ out of the way (and .gitignore it) It'll be online at hexdocs.pm --- .gitignore | 2 - doc/.build | 39 + doc/404.html | 162 ++ doc/Makefile | 21 - doc/README.md | 184 --- doc/api-reference.html | 294 ++++ doc/build.sh | 21 - doc/changelog.html | 359 +++++ doc/dist/handlebars.runtime-NWIB6V2M.js | 30 + doc/dist/handlebars.templates-K7URE6B4.js | 224 +++ doc/dist/html-BHYOTRCH.js | 56 + doc/dist/html-erlang-EBZIIHAS.css | 6 + ...nconsolata-latin-400-normal-RGKDDNDD.woff2 | Bin 0 -> 16244 bytes ...nconsolata-latin-700-normal-DTS2D7TO.woff2 | Bin 0 -> 16368 bytes ...solata-latin-ext-400-normal-K7HVGTP7.woff2 | Bin 0 -> 14772 bytes ...solata-latin-ext-700-normal-4MPBLFZC.woff2 | Bin 0 -> 14908 bytes ...olata-vietnamese-400-normal-IGQPHHJH.woff2 | Bin 0 -> 6836 bytes ...olata-vietnamese-700-normal-LHEGSN35.woff2 | Bin 0 -> 6944 bytes doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 | Bin 0 -> 23236 bytes doc/dist/lato-latin-400-normal-W7754I4D.woff2 | Bin 0 -> 23580 bytes doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 | Bin 0 -> 23040 bytes .../lato-latin-ext-300-normal-VPGGJKJL.woff2 | Bin 0 -> 5624 bytes .../lato-latin-ext-400-normal-N27NCBWW.woff2 | Bin 0 -> 5472 bytes .../lato-latin-ext-700-normal-Q2L5DVMW.woff2 | Bin 0 -> 5368 bytes doc/dist/remixicon-NKANDIL5.woff2 | Bin 0 -> 1956 bytes doc/dist/search_data-EF5B6961.js | 1 + doc/dist/sidebar_items-FF1D4582.js | 1 + doc/edoc-info | 5 - doc/elli.epub | Bin 0 -> 48002 bytes doc/elli.html | 760 ++++++++++ doc/elli.md | 181 --- doc/elli_example_callback.html | 315 ++++ doc/elli_example_callback.md | 125 -- doc/elli_example_callback_handover.html | 267 ++++ doc/elli_example_callback_handover.md | 40 - doc/elli_example_middleware.md | 38 - doc/elli_handler.html | 601 ++++++++ doc/elli_handler.md | 58 - doc/elli_http.html | 736 +++++++++ doc/elli_http.md | 143 -- doc/elli_middleware.html | 182 +++ doc/elli_middleware.md | 43 - doc/elli_middleware_compress.html | 241 +++ doc/elli_middleware_compress.md | 35 - doc/elli_request.html | 1326 +++++++++++++++++ doc/elli_request.md | 295 ---- doc/elli_sendfile.html | 292 ++++ doc/elli_sendfile.md | 47 - doc/elli_tcp.html | 493 ++++++ doc/elli_tcp.md | 88 -- doc/elli_test.html | 241 +++ doc/elli_test.md | 39 - doc/elli_util.html | 371 +++++ doc/elli_util.md | 73 - doc/erlang.png | Bin 2109 -> 0 bytes doc/github-pandoc.css | 424 ------ doc/index.html | 10 + doc/index.md | 305 ---- doc/license.html | 207 +++ doc/overview.edoc | 167 --- doc/overview.html | 313 ++++ doc/readme.html | 308 ++++ doc/search.html | 160 ++ doc/stylesheet.css | 55 - doc/tpl.html | 86 -- 65 files changed, 7995 insertions(+), 2475 deletions(-) create mode 100644 doc/.build create mode 100644 doc/404.html delete mode 100644 doc/Makefile delete mode 100644 doc/README.md create mode 100644 doc/api-reference.html delete mode 100755 doc/build.sh create mode 100644 doc/changelog.html create mode 100644 doc/dist/handlebars.runtime-NWIB6V2M.js create mode 100644 doc/dist/handlebars.templates-K7URE6B4.js create mode 100644 doc/dist/html-BHYOTRCH.js create mode 100644 doc/dist/html-erlang-EBZIIHAS.css create mode 100644 doc/dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 create mode 100644 doc/dist/inconsolata-latin-700-normal-DTS2D7TO.woff2 create mode 100644 doc/dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 create mode 100644 doc/dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 create mode 100644 doc/dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 create mode 100644 doc/dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 create mode 100644 doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 create mode 100644 doc/dist/lato-latin-400-normal-W7754I4D.woff2 create mode 100644 doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 create mode 100644 doc/dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 create mode 100644 doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 create mode 100644 doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 create mode 100644 doc/dist/remixicon-NKANDIL5.woff2 create mode 100644 doc/dist/search_data-EF5B6961.js create mode 100644 doc/dist/sidebar_items-FF1D4582.js delete mode 100644 doc/edoc-info create mode 100644 doc/elli.epub create mode 100644 doc/elli.html delete mode 100644 doc/elli.md create mode 100644 doc/elli_example_callback.html delete mode 100644 doc/elli_example_callback.md create mode 100644 doc/elli_example_callback_handover.html delete mode 100644 doc/elli_example_callback_handover.md delete mode 100644 doc/elli_example_middleware.md create mode 100644 doc/elli_handler.html delete mode 100644 doc/elli_handler.md create mode 100644 doc/elli_http.html delete mode 100644 doc/elli_http.md create mode 100644 doc/elli_middleware.html delete mode 100644 doc/elli_middleware.md create mode 100644 doc/elli_middleware_compress.html delete mode 100644 doc/elli_middleware_compress.md create mode 100644 doc/elli_request.html delete mode 100644 doc/elli_request.md create mode 100644 doc/elli_sendfile.html delete mode 100644 doc/elli_sendfile.md create mode 100644 doc/elli_tcp.html delete mode 100644 doc/elli_tcp.md create mode 100644 doc/elli_test.html delete mode 100644 doc/elli_test.md create mode 100644 doc/elli_util.html delete mode 100644 doc/elli_util.md delete mode 100644 doc/erlang.png delete mode 100644 doc/github-pandoc.css create mode 100644 doc/index.html delete mode 100644 doc/index.md create mode 100644 doc/license.html delete mode 100644 doc/overview.edoc create mode 100644 doc/overview.html create mode 100644 doc/readme.html create mode 100644 doc/search.html delete mode 100644 doc/stylesheet.css delete mode 100644 doc/tpl.html diff --git a/.gitignore b/.gitignore index af9d429..4683826 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ .rebar3 -doc/*.html -!doc/tpl.html _build .dialyzer.plt .rebar diff --git a/doc/.build b/doc/.build new file mode 100644 index 0000000..69c71fc --- /dev/null +++ b/doc/.build @@ -0,0 +1,39 @@ +404.html +api-reference.html +changelog.html +dist/handlebars.runtime-NWIB6V2M.js +dist/handlebars.templates-K7URE6B4.js +dist/html-BHYOTRCH.js +dist/html-erlang-EBZIIHAS.css +dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 +dist/inconsolata-latin-700-normal-DTS2D7TO.woff2 +dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 +dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 +dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 +dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 +dist/lato-latin-300-normal-YUMVEFOL.woff2 +dist/lato-latin-400-normal-W7754I4D.woff2 +dist/lato-latin-700-normal-2XVSBPG4.woff2 +dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 +dist/lato-latin-ext-400-normal-N27NCBWW.woff2 +dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 +dist/remixicon-NKANDIL5.woff2 +dist/search_data-EF5B6961.js +dist/sidebar_items-FF1D4582.js +elli.html +elli_example_callback.html +elli_example_callback_handover.html +elli_handler.html +elli_http.html +elli_middleware.html +elli_middleware_compress.html +elli_request.html +elli_sendfile.html +elli_tcp.html +elli_test.html +elli_util.html +index.html +license.html +overview.html +readme.html +search.html diff --git a/doc/404.html b/doc/404.html new file mode 100644 index 0000000..d3735d8 --- /dev/null +++ b/doc/404.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + + 404 — elli v3.3.0 + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+ + +

+ Page not found +

+ +

Sorry, but the page you were trying to get to, does not exist. You +may want to try searching this site using the sidebar + + or using our API Reference page + +to find what you were looking for.

+ +
+
+
+ + + + diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100644 index 5d72b03..0000000 --- a/doc/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -SOURCE_DOCS := $(wildcard *.md) - -EXPORTED_DOCS=\ - $(SOURCE_DOCS:.md=.html) - -RM=/bin/rm - -PANDOC=pandoc - -PANDOC_HTML_OPTIONS=--standalone --highlight-style=tango --template tpl.html -f gfm --to html5 - -%.html : %.md - $(PANDOC) $(PANDOC_HTML_OPTIONS) -o $@ $< - - -.PHONY: all clean - -all : $(EXPORTED_DOCS) - -clean: - - $(RM) -f $(EXPORTED_DOCS) diff --git a/doc/README.md b/doc/README.md deleted file mode 100644 index f206730..0000000 --- a/doc/README.md +++ /dev/null @@ -1,184 +0,0 @@ - - -# elli # - -Copyright (c) 2012-2016 Knut Nesheim, 2016-2018 elli-lib team - -__Version:__ 3.0.0 - -__Authors:__ Knut Nesheim, elli-lib team. - -Erlang web server for HTTP APIs - -## Features - -Here's the features Elli _does_ have: - -* [Rack][]-style request-response. Your handler function gets a - complete request and returns a complete response. There's no - messaging, no receiving data directly from the socket, no writing - responses directly to the socket. It's a very simple and - straightforward API. Have a look at [`elli_example_callback`](elli_example_callback.md) -for examples. - -* Middlewares allow you to add useful features like compression, -encoding, stats, but only have it used when needed. No features you -don't use on the critical path. - -* Short-circuiting of responses using exceptions, allows you to use - "assertions" that return for example 403 permission - denied. `is_allowed(Req) orelse throw({403, [], <<"Permission - denied">>})`. - -* Every client connection gets its own process, isolating the failure -of a request from another. For the duration of the connection, only -one process is involved, resulting in very robust and efficient -code. - -* Binaries everywhere for strings. - -* Instrumentation inside the core of the webserver, triggering user - callbacks. For example when a request completes, the user callback - gets the `request_complete` event which contains timings of all the -different parts of handling a request. There's also events for -clients unexpectedly closing a connection, crashes in the user -callback, etc. - -* Keep alive, using one Erlang process per connection only active -when there is a request from the client. Number of connections is -only limited by RAM and CPU. - -* Chunked transfer in responses for real-time push to clients - -* Basic pipelining. HTTP verbs that does not have side-effects(`GET` - and `HEAD`) can be pipelined, ie. a client supporting pipelining -can send multiple requests down the line and expect the responses -to appear in the same order as requests. Elli processes the -requests one at a time in order, future work could make it possible -to process them in parallel. - -* SSL using built-in Erlang/OTP ssl, nice for low volume admin -interfaces, etc. For high volume, you should probably go with -nginx, stunnel or ELB if you're on AWS. - -* Implement your own connection handling, for WebSockets, streaming - uploads, etc. See [`elli_example_callback_handover`](elli_example_callback_handover.md). - -## Extensions - -* [elli_access_log](https://github.com/elli-lib/elli_access_log): -Access log -* [elli_basicauth](https://github.com/elli-lib/elli_basicauth): -Basic auth -* [elli_chatterbox](https://github.com/elli-lib/elli_chatterbox): -HTTP/2 support -* [elli_cloudfront](https://github.com/elli-lib/elli_cloudfront): -CloudFront signed URLs -* [elli_cookie](https://github.com/elli-lib/elli_cookie): -Cookies -* [elli_date](https://github.com/elli-lib/elli_date): -"Date" header -* [elli_fileserve](https://github.com/elli-lib/elli_fileserve): -Static content -* [elli_prometheus](https://github.com/elli-lib/elli_prometheus): -Prometheus -* [elli_stats](https://github.com/elli-lib/elli_stats): -Real-time statistics dashboard -* [elli_websockets](https://github.com/elli-lib/elli_websocket): -WebSockets -* [elli_xpblfe](https://github.com/elli-lib/elli_xpblfe): -X-Powered-By LFE - -## About - -From operating and debugging high-volume, low-latency apps we have -gained some valuable insight into what we want from a webserver. We -want simplicity, robustness, performance, ease of debugging, -visibility into strange client behaviour, really good instrumentation -and good tests. We are willing to sacrifice almost everything, even -basic features to achieve this. - -With this in mind we looked at the big names in the Erlang -community: [Yaws][], [Mochiweb][], [Misultin][] and [Cowboy][]. We -found [Mochiweb][] to be the best match. However, we also wanted to -see if we could take the architecture of [Mochiweb][] and improve on -it. `elli` takes the acceptor-turns-into-request-handler idea found -in [Mochiweb][], the binaries-only idea from [Cowboy][] and the -request-response idea from [WSGI][]/[Rack][] (with chunked transfer -being an exception). - -On top of this we built a handler that allows us to write HTTP -middleware modules to add practical features, like compression of -responses, HTTP access log with timings, a real-time statistics -dashboard and chaining multiple request handlers. - -## Aren't there enough webservers in the Erlang community already? - -There are a few very mature and robust projects with steady -development, one recently ceased development and one new kid on the -block with lots of interest. As `elli` is not a general purpose -webserver, but more of a specialized tool, we believe it has a very -different target audience and would not attract effort or users away -from the big names. - -## Why another webserver? Isn't this just the NIH syndrome? - -[Yaws][], [Mochiweb][], [Misultin][], and [Cowboy][] are great -projects, hardened over time and full of very useful features for web -development. If you value developer productivity, [Yaws][] is an -excellent choice. If you want a fast and lightweight -server, [Mochiweb][] and [Cowboy][] are excellent choices. - -Having used and studied all of these projects, we believed that if we -merged some of the existing ideas and added some ideas from other -communities, we could create a core that was better for our use cases. - -It started out as an experiment to see if it is at all possible to -significantly improve and it turns out that for our particular use -cases, there is enough improvement to warrant a new project. - -## What makes Elli different? - -Elli has a very simple architecture. It avoids using more processes -and messages than absolutely necessary. It uses binaries for -strings. The request-response programming model allows middlewares to -do much heavy lifting, so the core can stay very simple. It has been -instrumented so as a user you can understand where time is spent. When -things go wrong, like the client closed the connection before you -could send a response, you are notified about these things so you can -better understand your client behaviour. - -## Performance - -"Hello World!" micro-benchmarks are really useful when measuring the -performance of the webserver itself, but the numbers usually do more -harm than good when released. I encourage you to run your own -benchmarks, on your own hardware. Mark Nottingham has some -[very good pointers](http://www.mnot.net/blog/2011/05/18/http_benchmark_rules) -about benchmarking HTTP servers. - -[Yaws]: https://github.com/klacke/yaws -[Mochiweb]: https://github.com/mochi/mochiweb -[Misultin]: https://github.com/ostinelli/misultin -[Cowboy]: https://github.com/ninenines/cowboy -[WSGI]: https://www.python.org/dev/peps/pep-3333/ -[Rack]: https://github.com/rack/rack - - -## Modules ## - - - - - - - - - - - - - - -
elli
elli_example_callback
elli_example_callback_handover
elli_handler
elli_http
elli_middleware
elli_middleware_compress
elli_request
elli_sendfile
elli_tcp
elli_test
elli_util
- diff --git a/doc/api-reference.html b/doc/api-reference.html new file mode 100644 index 0000000..042693b --- /dev/null +++ b/doc/api-reference.html @@ -0,0 +1,294 @@ + + + + + + + + + + + API Reference — elli v3.3.0 + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+ + +
+

+ + + + View Source + + + + API Reference elli v3.3.0 +

+ + +
+

+ + + + Modules +

+ +
+
+
+ elli + +
+ +

Elli acceptor manager

+ +
+
+ + +

Elli example callback

+ +
+ +
+
+ elli_handler + +
+ +
+
+
+ elli_http + +
+ +

Elli HTTP request implementation

+ +
+
+ + +

HTTP request processing middleware.

+ +
+
+ + +

Response compression as Elli middleware.

+ +
+
+
+ elli_request + +
+ +
+
+ + +
+
+
+ elli_tcp + +
+ +

Wrapper for plain and SSL sockets. Based on mochiweb_socket.erl.

+ +
+
+
+ elli_test + +
+ +

Helper for calling your Elli callback in unit tests. Only the callback specified is actually run. Elli's response handling is not used, so the headers will for example not include a content length and the return format is not standardized. The unit tests below test elli_example_callback.

+ +
+
+
+ elli_util + +
+ +
+ +
+
+ + +
+ + + +
+
+
+ + + + diff --git a/doc/build.sh b/doc/build.sh deleted file mode 100755 index 188a5ee..0000000 --- a/doc/build.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -cd $(dirname $(realpath $0)) - -make clean -make - -# fix internal doc links -sed -i 's/https:\/\/github\.com\/doc\/\([a-zA-Z_-]*\)\.md/\1.html/g' *.html -sed -i 's/\"\([a-zA-Z_-]*\)\.md\([a-zA-Z_-#]*\)\"/\"\1.html\2\"/g' *.html -sed -i 's/\"doc\/\([a-zA-Z_-]*\)\.md\"/\"\1.html\"/g' *.html -sed -i 's/\"\([a-zA-Z_-]*\)\.md\"/\"\1.html\"/g' *.html - -# fix external doc links -sed -i 's/maps\.html\#/http:\/\/erlang.org\/doc\/man\/maps\.html#/g' *.html -sed -i 's/unicode\.html\#/http:\/\/erlang.org\/doc\/man\/unicode\.html#/g' *.html -sed -i 's/maps\.md\#/http:\/\/erlang.org\/doc\/man\/maps\.html#/g' *.html -sed -i 's/unicode\.md\#/http:\/\/erlang.org\/doc\/man\/unicode\.html#/g' *.html - -# cleans up the indentation of code blocks -sed -i 's/ + + + + + + + + + + CHANGELOG — elli v3.3.0 + + + + + + + + + + + + + + +
+ + + + + +
+ + +
+ + +
+

+ + + + View Source + + + + CHANGELOG +

+ +

+ + + + pre-v4.0.0 +

+
  • Headers are now properly treated as case-insensitive
  • Original headers that have not had string:casefold/1 run on each header +name are still available in the request through elli_request:original_headers

+ + + + v3.3.0 +

+
  • Do not use x-forwarded-for for peer #75
  • Handle arguments with no value in (post|get)_arg_decoded #82
  • Fix compile-time warnings on missing record info. from aleppo #81

+ + + + v3.2.0 +

+

+ + + + v3.1.0 +

+

+ + + + v3.0.0 +

+
  • scheme, host, and port added to the #req{} record. Corresponding +helper functions added to the elli_request module.

+ + + + v2.1.2 +

+
  • Update dependencies and re-enable linting

  • Increase test coverage

  • Declare optional callbacks to elli_handler

  • Add TLS sendfile implementation by James Fish (from Andrew Thompson)

  • Use hackney instead of httpc in tests, due to httpc bug

+ + + + v2.0.2 +

+
  • Adapt knutin/elli#108 by Michael Zazaian

  • Incomplete request regression fix by Evan Vigil-McClanahan

  • Handle binary URIs on OTP >=20

  • Bespoke uri_decode/1 to obviate inets dependency by Christoffer Vikström

+ + + + v2.0.1 +

+
  • Miscellaneous tooling, test, and type spec tweaks

  • Helper functions to reduce redundancy

  • Request start timing fix

+ + + + v2.0.0 +

+
  • Code and documentation cleanup

  • Instrumentation facilities

  • RFC 2616 section 8.2.3 implementation by Martin Karlsson

  • Send 500 and close connection if file operations fail

+ + + + v1.0.5 +

+
  • Optimization of SSL accept by Tristan Sloughter

  • Dependency cleanup by Adam Lindberg

+ + + + v1.0.4 +

+
  • OTP 18.0 compatibility, contributed by Florian Odronitz.

+ + + + v1.0.3 +

+
  • Various internal cleanup fixes from Andreas Stenius (github.com/kaos)

+ + + + v1.0.2 +

+

+ + + + v1.0.1 +

+
  • Fix bug in SSL acceptor pool where due to failed handshakes, Elli +runs out of acceptors. Thanks to Stefan Grundmann.

  • In case a handler (or middleware) returns a response Elli does not +understand, Elli will now respond with a 500 error. Thanks to +Johannes Huning.

  • Added elli_request:get_arg_decoded/2,3 which HTTP URI decodes the +value passed in the request. Thanks to Mariano Valles.

+ + + + v1.0 +

+
  • SSL using built-in ssl from Erlang/OTP. Thanks to Maas-Maarten Zeeman.

  • "Handover" a socket to user code, making it possible to implement +WebSockets(https://github.com/mmzeeman/elli_websocket).

  • Type fixes from Ingo Struck and Andreas Hasselberg.

+ + + + v0.4.1 +

+
  • Fix from Christian Lundgren for browsers that include spaces in the +value of the Content-Length header.

+ + + + v0.4 +

+
  • Added support for sending ranges of a file with sendfile by +returning {Code, Headers, {file, Filename, {Offset, Length}}}. If +no offset and length is specified, the entire file is sent. The +user must provide an appropriate "Content-Length" and +"Content-Range" header, see the example in +elli_example_callback.erl +(https://github.com/knutin/elli/blob/master/src/elli_example_callback.erl#L99). +Thanks Vincent Siliakus (zambal).

+ + + + v0.3 +

+
  • Breaking change: Timeouts used in the HTTP protocol are now +configurable. To implement this, changing a record and some +callbacks was necessary. To upgrade, a restart of Elli is needed.

  • Elli now supports pipelining of any type of request. Some proxies +or special clients (like ibrowse) will pipeline requests to reduce +latency.

  • If there are no more file descriptors, Elli will shut down. This +mimics the behaviour found in Yaws.

  • Chunked transfer responses will now exit the Elli process when the +client closes the connection. Sending a synchronous chunk will +return {error, closed} if client has closed the connection and +the chunk_complete event is sent to your callback including which +end closed the connection.

+ + + + v0.2.0 +

+
  • Breaking change: moved elli_access_log into a separate repository +at github.com/wooga/elli_access_log. Thanks martinrehfeld.

+ + + + v0.1.3 +

+
  • Added elli_test which makes it easy to write unit tests for your +callbacks. Thanks anha0825.

  • Added sendfile support. Thanks chrisavl.

+ + + + v0.1.2 +

+
  • Added option to specify listen IP address. Thanks hukl.

+ + + + v0.1.1 +

+
  • Don't look up the peer ip address on every request anymore, do it +on demand using elli_request:peer/1.

+ + + + v0.1 +

+
  • Initial release.
+
+ + + +
+
+
+ + + + diff --git a/doc/dist/handlebars.runtime-NWIB6V2M.js b/doc/dist/handlebars.runtime-NWIB6V2M.js new file mode 100644 index 0000000..117dc6c --- /dev/null +++ b/doc/dist/handlebars.runtime-NWIB6V2M.js @@ -0,0 +1,30 @@ +/**! + + @license + handlebars v4.7.7 + +Copyright (C) 2011-2019 by Yehuda Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*/(function(r,e){typeof exports=="object"&&typeof module=="object"?module.exports=e():typeof define=="function"&&define.amd?define([],e):typeof exports=="object"?exports.Handlebars=e():r.Handlebars=e()})(this,function(){return function(u){var r={};function e(n){if(r[n])return r[n].exports;var t=r[n]={exports:{},id:n,loaded:!1};return u[n].call(t.exports,t,t.exports,e),t.loaded=!0,t.exports}return e.m=u,e.c=r,e.p="",e(0)}([function(u,r,e){"use strict";var n=e(1).default,t=e(2).default;r.__esModule=!0;var f=e(3),a=n(f),i=e(36),l=t(i),h=e(5),v=t(h),P=e(4),H=n(P),C=e(37),E=n(C),I=e(43),o=t(I);function g(){var y=new a.HandlebarsEnvironment;return H.extend(y,a),y.SafeString=l.default,y.Exception=v.default,y.Utils=H,y.escapeExpression=H.escapeExpression,y.VM=E,y.template=function(p){return E.template(p,y)},y}var w=g();w.create=g,o.default(w),w.default=w,r.default=w,u.exports=r.default},function(u,r){"use strict";r.default=function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n[t]=e[t]);return n.default=e,n},r.__esModule=!0},function(u,r){"use strict";r.default=function(e){return e&&e.__esModule?e:{default:e}},r.__esModule=!0},function(u,r,e){"use strict";var n=e(2).default;r.__esModule=!0,r.HandlebarsEnvironment=g;var t=e(4),f=e(5),a=n(f),i=e(9),l=e(29),h=e(31),v=n(h),P=e(32),H="4.7.7";r.VERSION=H;var C=8;r.COMPILER_REVISION=C;var E=7;r.LAST_COMPATIBLE_COMPILER_REVISION=E;var I={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};r.REVISION_CHANGES=I;var o="[object Object]";function g(y,p,R){this.helpers=y||{},this.partials=p||{},this.decorators=R||{},i.registerDefaultHelpers(this),l.registerDefaultDecorators(this)}g.prototype={constructor:g,logger:v.default,log:v.default.log,registerHelper:function(p,R){if(t.toString.call(p)===o){if(R)throw new a.default("Arg not supported with multiple helpers");t.extend(this.helpers,p)}else this.helpers[p]=R},unregisterHelper:function(p){delete this.helpers[p]},registerPartial:function(p,R){if(t.toString.call(p)===o)t.extend(this.partials,p);else{if(typeof R>"u")throw new a.default('Attempting to register a partial called "'+p+'" as undefined');this.partials[p]=R}},unregisterPartial:function(p){delete this.partials[p]},registerDecorator:function(p,R){if(t.toString.call(p)===o){if(R)throw new a.default("Arg not supported with multiple decorators");t.extend(this.decorators,p)}else this.decorators[p]=R},unregisterDecorator:function(p){delete this.decorators[p]},resetLoggedPropertyAccesses:function(){P.resetLoggedProperties()}};var w=v.default.log;r.log=w,r.createFrame=t.createFrame,r.logger=v.default},function(u,r){"use strict";r.__esModule=!0,r.extend=a,r.indexOf=v,r.escapeExpression=P,r.isEmpty=H,r.createFrame=C,r.blockParams=E,r.appendContextPath=I;var e={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},n=/[&<>"'`=]/g,t=/[&<>"'`=]/;function f(o){return e[o]}function a(o){for(var g=1;g0?(a.ids&&(a.ids=[a.name]),t.helpers.each(f,a)):i(this);if(a.data&&a.ids){var h=n.createFrame(a.data);h.contextPath=n.appendContextPath(a.data.contextPath,a.name),a={data:h}}return l(f,a)})},u.exports=r.default},function(u,r,e){(function(n){"use strict";var t=e(12).default,f=e(2).default;r.__esModule=!0;var a=e(4),i=e(5),l=f(i);r.default=function(h){h.registerHelper("each",function(v,P){if(!P)throw new l.default("Must pass iterator to #each");var H=P.fn,C=P.inverse,E=0,I="",o=void 0,g=void 0;P.data&&P.ids&&(g=a.appendContextPath(P.data.contextPath,P.ids[0])+"."),a.isFunction(v)&&(v=v.call(this)),P.data&&(o=a.createFrame(P.data));function w(b,F,c){o&&(o.key=b,o.index=F,o.first=F===0,o.last=!!c,g&&(o.contextPath=g+b)),I=I+H(v[b],{data:o,blockParams:a.blockParams([v[b],b],[g+b,null])})}if(v&&typeof v=="object")if(a.isArray(v))for(var y=v.length;E=0?a=i:a=parseInt(a,10)}return a},log:function(a){if(a=t.lookupLevel(a),typeof console<"u"&&t.lookupLevel(t.level)<=a){var i=t.methodMap[a];console[i]||(i="log");for(var l=arguments.length,h=Array(l>1?l-1:0),v=1;v=P.LAST_COMPATIBLE_COMPILER_REVISION&&O<=P.COMPILER_REVISION))if(O{(function(){var d=Handlebars.template,y=Handlebars.templates=Handlebars.templates||{};y["autocomplete-suggestions"]=d({1:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return' +
+`+((o=t(a,"if").call(r,l!=null?t(l,"deprecated"):l,{name:"if",hash:{},fn:e.program(2,u,0),inverse:e.program(4,u,0),data:u,loc:{start:{line:16,column:10},end:{line:20,column:17}}}))!=null?o:"")+` +`+((o=t(a,"each").call(r,l!=null?t(l,"labels"):l,{name:"each",hash:{},fn:e.program(6,u,0),inverse:e.noop,data:u,loc:{start:{line:22,column:10},end:{line:24,column:19}}}))!=null?o:"")+`
+ +
+
+ +
+
+ +`+((o=t(a,"if").call(r,l!=null?t(l,"description"):l,{name:"if",hash:{},fn:e.program(8,u,0),inverse:e.noop,data:u,loc:{start:{line:39,column:8},end:{line:43,column:15}}}))!=null?o:"")+`
+`},2:function(e,l,a,p,u){var o,n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' '+((o=(n=(n=r(a,"title")||(l!=null?r(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:u,loc:{start:{line:17,column:49},end:{line:17,column:60}}}):n))!=null?o:"")+` +`},4:function(e,l,a,p,u){var o,n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' '+((o=(n=(n=r(a,"title")||(l!=null?r(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:u,loc:{start:{line:19,column:46},end:{line:19,column:57}}}):n))!=null?o:"")+` +`},6:function(e,l,a,p,u){return' '+e.escapeExpression(e.lambda(l,l))+` +`},8:function(e,l,a,p,u){var o,n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`
+ `+((o=(n=(n=r(a,"description")||(l!=null?r(l,"description"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"description",hash:{},data:u,loc:{start:{line:41,column:10},end:{line:41,column:27}}}):n))!=null?o:"")+` +
+`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
+
+
+
+ + Autocompletion results for "`+e.escapeExpression((n=(n=s(a,"term")||(l!=null?s(l,"term"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(r,{name:"term",hash:{},data:u,loc:{start:{line:6,column:55},end:{line:6,column:63}}}):n))+`" + + + Press RETURN for full-text search, TAB for previews + +
+
+`+((o=s(a,"each").call(r,l!=null?s(l,"suggestions"):l,{name:"each",hash:{},fn:e.program(1,u,0),inverse:e.noop,data:u,loc:{start:{line:13,column:6},end:{line:45,column:15}}}))!=null?o:"")+`
+
+
+`},useData:!0}),y["modal-layout"]=d({compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){return` +`},useData:!0}),y["quick-switch-modal-body"]=d({compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){return`
+ + +
+
+`},useData:!0}),y["quick-switch-results"]=d({1:function(e,l,a,p,u){var o,n=l??(e.nullContext||{}),r=e.hooks.helperMissing,s="function",i=e.escapeExpression,c=e.lookupProperty||function(t,f){if(Object.prototype.hasOwnProperty.call(t,f))return t[f]};return'
+ `+i((o=(o=c(a,"name")||(l!=null?c(l,"name"):l))!=null?o:r,typeof o===s?o.call(n,{name:"name",hash:{},data:u,loc:{start:{line:3,column:4},end:{line:3,column:12}}}):o))+` +
+`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(1,u,0),inverse:e.noop,data:u,loc:{start:{line:1,column:0},end:{line:5,column:9}}}))!=null?o:""},useData:!0}),y["search-results"]=d({1:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return" Search results for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:u,loc:{start:{line:3,column:27},end:{line:3,column:36}}}):o))+` +`},3:function(e,l,a,p,u){return` Invalid search +`},5:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(6,u,0),inverse:e.noop,data:u,loc:{start:{line:10,column:2},end:{line:21,column:11}}}))!=null?o:""},6:function(e,l,a,p,u){var o,n=e.lambda,r=e.escapeExpression,s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
+

+ + `+r(n(l!=null?s(l,"title"):l,l))+" ("+r(n(l!=null?s(l,"type"):l,l))+`) + +

+`+((o=s(a,"each").call(l??(e.nullContext||{}),l!=null?s(l,"excerpts"):l,{name:"each",hash:{},fn:e.program(7,u,0),inverse:e.noop,data:u,loc:{start:{line:17,column:8},end:{line:19,column:17}}}))!=null?o:"")+`
+`},7:function(e,l,a,p,u){var o;return'

'+((o=e.lambda(l,l))!=null?o:"")+`

+`},9:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return((o=(n(a,"isArray")||l&&n(l,"isArray")||e.hooks.helperMissing).call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"isArray",hash:{},fn:e.program(10,u,0),inverse:e.program(12,u,0),data:u,loc:{start:{line:23,column:2},end:{line:29,column:14}}}))!=null?o:"")+` +

The search functionality is full-text based. Here are some tips:

+ +
    +
  • Multiple words (such as foo bar) are searched as OR
  • +
  • Use * anywhere (such as fo*) as wildcard
  • +
  • Use + before a word (such as +foo) to make its presence required
  • +
  • Use - before a word (such as -foo) to make its absence required
  • +
  • Use : to search on a particular field (such as field:word). The available fields are title, doc and type
  • +
  • Use WORD^NUMBER (such as foo^2) to boost the given word
  • +
  • Use WORD~NUMBER (such as foo~2) to do a search with edit distance on word
  • +
+ +

To quickly go to a module, type, or function, use the autocompletion feature in the sidebar search.

+`},10:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return"

Sorry, we couldn't find anything for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:u,loc:{start:{line:24,column:48},end:{line:24,column:57}}}):o))+`.

+`},12:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"value"):l,{name:"if",hash:{},fn:e.program(13,u,0),inverse:e.program(15,u,0),data:u,loc:{start:{line:25,column:2},end:{line:29,column:2}}}))!=null?o:""},13:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return"

Invalid search: "+e.escapeExpression((o=(o=n(a,"errorMessage")||(l!=null?n(l,"errorMessage"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"errorMessage",hash:{},data:u,loc:{start:{line:26,column:23},end:{line:26,column:39}}}):o))+`.

+`},15:function(e,l,a,p,u){return`

Please type something into the search bar to perform a search.

+ `},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=l??(e.nullContext||{}),r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`

+`+((o=r(a,"if").call(n,l!=null?r(l,"value"):l,{name:"if",hash:{},fn:e.program(1,u,0),inverse:e.program(3,u,0),data:u,loc:{start:{line:2,column:2},end:{line:6,column:9}}}))!=null?o:"")+`

+ +`+((o=(r(a,"isNonEmptyArray")||l&&r(l,"isNonEmptyArray")||e.hooks.helperMissing).call(n,l!=null?r(l,"results"):l,{name:"isNonEmptyArray",hash:{},fn:e.program(5,u,0),inverse:e.program(9,u,0),data:u,loc:{start:{line:9,column:0},end:{line:44,column:20}}}))!=null?o:"")},useData:!0}),y["settings-modal-body"]=d({1:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"description"):l,{name:"if",hash:{},fn:e.program(2,u,0),inverse:e.noop,data:u,loc:{start:{line:40,column:6},end:{line:53,column:13}}}))!=null?o:""},2:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
+
+ `+e.escapeExpression(e.lambda(l!=null?n(l,"description"):l,l))+` +
+
+`+((o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"displayAs"):l,{name:"if",hash:{},fn:e.program(3,u,0),inverse:e.program(5,u,0),data:u,loc:{start:{line:46,column:12},end:{line:50,column:19}}}))!=null?o:"")+`
+
+`},3:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return" "+((o=e.lambda(l!=null?n(l,"displayAs"):l,l))!=null?o:"")+` +`},5:function(e,l,a,p,u){var o=e.lookupProperty||function(n,r){if(Object.prototype.hasOwnProperty.call(n,r))return n[r]};return" "+e.escapeExpression(e.lambda(l!=null?o(l,"key"):l,l))+` +`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
+
+ + + + +
+ +
+`},useData:!0}),y["sidebar-items"]=d({1:function(e,l,a,p,u,o,n){var r,s=l??(e.nullContext||{}),i=e.hooks.helperMissing,c=e.lookupProperty||function(t,f){if(Object.prototype.hasOwnProperty.call(t,f))return t[f]};return((r=(c(a,"groupChanged")||l&&c(l,"groupChanged")||i).call(s,n[1],(r=o[0][0])!=null?c(r,"group"):r,{name:"groupChanged",hash:{},fn:e.program(2,u,0,o,n),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:2,column:2},end:{line:6,column:19}}}))!=null?r:"")+` +`+((r=(c(a,"nestingChanged")||l&&c(l,"nestingChanged")||i).call(s,n[1],o[0][0],{name:"nestingChanged",hash:{},fn:e.program(7,u,0,o,n),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:8,column:2},end:{line:10,column:21}}}))!=null?r:"")+` +
  • + +`+((r=c(a,"if").call(s,(r=o[0][0])!=null?c(r,"nested_title"):r,{name:"if",hash:{},fn:e.program(17,u,0,o,n),inverse:e.program(19,u,0,o,n),data:u,blockParams:o,loc:{start:{line:14,column:6},end:{line:18,column:13}}}))!=null?r:"")+` + +`+((r=(c(a,"isEmptyArray")||l&&c(l,"isEmptyArray")||i).call(s,(r=o[0][0])!=null?c(r,"headers"):r,{name:"isEmptyArray",hash:{},fn:e.program(3,u,0,o,n),inverse:e.program(21,u,0,o,n),data:u,blockParams:o,loc:{start:{line:21,column:4},end:{line:24,column:21}}}))!=null?r:"")+` +`+((r=(c(a,"isArray")||l&&c(l,"isArray")||i).call(s,(r=o[0][0])!=null?c(r,"headers"):r,{name:"isArray",hash:{},fn:e.program(24,u,0,o,n),inverse:e.program(28,u,0,o,n),data:u,blockParams:o,loc:{start:{line:26,column:4},end:{line:74,column:16}}}))!=null?r:"")+`
  • +`},2:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return'
  • + `+e.escapeExpression(e.lambda((n=o[1][0])!=null?r(n,"group"):n,l))+` +
  • +`},3:function(e,l,a,p,u){return""},5:function(e,l,a,p,u){return'translate="no"'},7:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' +`},9:function(e,l,a,p,u){return"current-page open"},11:function(e,l,a,p,u){return"#content"},13:function(e,l,a,p,u){return"page"},15:function(e,l,a,p,u){return"false"},17:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return" "+((n=e.lambda((n=o[1][0])!=null?r(n,"nested_title"):n,l))!=null?n:"")+` +`},19:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return" "+((n=e.lambda((n=o[1][0])!=null?r(n,"title"):n,l))!=null?n:"")+` +`},21:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' +`},22:function(e,l,a,p,u){return"true"},24:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return(n=(r(a,"isNonEmptyArray")||l&&r(l,"isNonEmptyArray")||e.hooks.helperMissing).call(l??(e.nullContext||{}),(n=o[1][0])!=null?r(n,"headers"):n,{name:"isNonEmptyArray",hash:{},fn:e.program(25,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:27,column:6},end:{line:35,column:26}}}))!=null?n:""},25:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return'
      +`+((n=r(a,"each").call(l??(e.nullContext||{}),(n=o[2][0])!=null?r(n,"headers"):n,{name:"each",hash:{},fn:e.program(26,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:29,column:10},end:{line:33,column:19}}}))!=null?n:"")+`
    +`},26:function(e,l,a,p,u,o){var n,r,s=l??(e.nullContext||{}),i=e.hooks.helperMissing,c="function",t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return`
  • + '+((n=(r=(r=t(a,"id")||(l!=null?t(l,"id"):l))!=null?r:i,typeof r===c?r.call(s,{name:"id",hash:{},data:u,blockParams:o,loc:{start:{line:31,column:54},end:{line:31,column:62}}}):r))!=null?n:"")+` +
  • +`},28:function(e,l,a,p,u,o){var n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i=e.lookupProperty||function(c,t){if(Object.prototype.hasOwnProperty.call(c,t))return c[t]};return'
      +`+((n=(i(a,"showSections")||l&&i(l,"showSections")||s).call(r,o[1][0],{name:"showSections",hash:{},fn:e.program(29,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:38,column:8},end:{line:52,column:25}}}))!=null?n:"")+((n=(i(a,"showSummary")||l&&i(l,"showSummary")||s).call(r,o[1][0],{name:"showSummary",hash:{},fn:e.program(34,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:53,column:8},end:{line:57,column:24}}}))!=null?n:"")+((n=i(a,"each").call(r,(n=o[1][0])!=null?i(n,"nodeGroups"):n,{name:"each",hash:{},fn:e.program(36,u,1,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:58,column:8},end:{line:72,column:17}}}))!=null?n:"")+`
    +`},29:function(e,l,a,p,u,o){var n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i=e.lambda,c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return'
  • + + Sections + + +
      +`+((n=t(a,"each").call(r,l!=null?t(l,"sections"):l,{name:"each",hash:{},fn:e.program(32,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:45,column:14},end:{line:49,column:23}}}))!=null?n:"")+`
    +
  • +`},30:function(e,l,a,p,u){return"open"},32:function(e,l,a,p,u,o){var n,r,s=e.escapeExpression,i=l??(e.nullContext||{}),c=e.hooks.helperMissing,t="function",f=e.lookupProperty||function(m,v){if(Object.prototype.hasOwnProperty.call(m,v))return m[v]};return`
  • + '+((n=(r=(r=f(a,"id")||(l!=null?f(l,"id"):l))!=null?r:c,typeof r===t?r.call(i,{name:"id",hash:{},data:u,blockParams:o,loc:{start:{line:47,column:56},end:{line:47,column:64}}}):r))!=null?n:"")+` +
  • +`},34:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`
  • + Summary +
  • +`},36:function(e,l,a,p,u,o){var n,r=e.lambda,s=e.escapeExpression,i=e.lookupProperty||function(c,t){if(Object.prototype.hasOwnProperty.call(c,t))return c[t]};return`
  • + + `+s(r((n=o[0][0])!=null?i(n,"name"):n,l))+` + + +
      +`+((n=i(a,"each").call(l??(e.nullContext||{}),(n=o[0][0])!=null?i(n,"nodes"):n,{name:"each",hash:{},fn:e.program(37,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:65,column:14},end:{line:69,column:23}}}))!=null?n:"")+`
    +
  • +`},37:function(e,l,a,p,u,o){var n,r,s=e.escapeExpression,i=l??(e.nullContext||{}),c=e.hooks.helperMissing,t="function",f=e.lookupProperty||function(m,v){if(Object.prototype.hasOwnProperty.call(m,v))return m[v]};return`
  • + '+s((r=(r=f(a,"id")||(l!=null?f(l,"id"):l))!=null?r:c,typeof r===t?r.call(i,{name:"id",hash:{},data:u,blockParams:o,loc:{start:{line:67,column:89},end:{line:67,column:95}}}):r))+` +
  • +`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u,o,n){var r,s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return(r=s(a,"each").call(l??(e.nullContext||{}),l!=null?s(l,"nodes"):l,{name:"each",hash:{},fn:e.program(1,u,2,o,n),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:1,column:0},end:{line:76,column:9}}}))!=null?r:""},useData:!0,useDepths:!0,useBlockParams:!0}),y.tabset=d({1:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return' +`},2:function(e,l,a,p,u){return"-1"},4:function(e,l,a,p,u){return"0"},6:function(e,l,a,p,u){return"false"},8:function(e,l,a,p,u){return"true"},10:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return'
    +`+((o=t(a,"each").call(r,l!=null?t(l,"content"):l,{name:"each",hash:{},fn:e.program(13,u,0),inverse:e.noop,data:u,loc:{start:{line:16,column:4},end:{line:18,column:13}}}))!=null?o:"")+`
    +`},11:function(e,l,a,p,u){return"hidden"},13:function(e,l,a,p,u){var o;return" "+((o=e.lambda(l,l))!=null?o:"")+` +`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=l??(e.nullContext||{}),r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`
    +`+((o=r(a,"each").call(n,l!=null?r(l,"tabs"):l,{name:"each",hash:{},fn:e.program(1,u,0),inverse:e.noop,data:u,loc:{start:{line:2,column:2},end:{line:9,column:11}}}))!=null?o:"")+`
    + +`+((o=r(a,"each").call(n,l!=null?r(l,"tabs"):l,{name:"each",hash:{},fn:e.program(10,u,0),inverse:e.noop,data:u,loc:{start:{line:12,column:0},end:{line:20,column:9}}}))!=null?o:"")},useData:!0}),y["tooltip-body"]=d({1:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    + `+e.escapeExpression(e.lambda((o=l!=null?n(l,"hint"):l)!=null?n(o,"description"):o,l))+` +
    +`},3:function(e,l,a,p,u){var o,n=e.lambda,r=e.escapeExpression,s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
    +

    + `+r(n((o=l!=null?s(l,"hint"):l)!=null?s(o,"title"):o,l))+` +
    `+r(n((o=l!=null?s(l,"hint"):l)!=null?s(o,"version"):o,l))+`
    +

    +
    +`+((o=s(a,"if").call(l??(e.nullContext||{}),(o=l!=null?s(l,"hint"):l)!=null?s(o,"description"):o,{name:"if",hash:{},fn:e.program(4,u,0),inverse:e.noop,data:u,loc:{start:{line:12,column:2},end:{line:16,column:9}}}))!=null?o:"")},4:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    + `+((o=e.lambda((o=l!=null?n(l,"hint"):l)!=null?n(o,"description"):o,l))!=null?o:"")+` +
    +`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"isPlain"):l,{name:"if",hash:{},fn:e.program(1,u,0),inverse:e.program(3,u,0),data:u,loc:{start:{line:1,column:0},end:{line:17,column:7}}}))!=null?o:""},useData:!0}),y["tooltip-layout"]=d({compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){return`
    +
    +
    +`},useData:!0}),y["versions-dropdown"]=d({1:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return' +`},2:function(e,l,a,p,u){return" selected disabled"},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    + +
    +`},useData:!0})})();})(); diff --git a/doc/dist/html-BHYOTRCH.js b/doc/dist/html-BHYOTRCH.js new file mode 100644 index 0000000..5880235 --- /dev/null +++ b/doc/dist/html-BHYOTRCH.js @@ -0,0 +1,56 @@ +(()=>{var Zn=Object.create;var ut=Object.defineProperty;var ei=Object.getOwnPropertyDescriptor;var ti=Object.getOwnPropertyNames;var ni=Object.getPrototypeOf,ii=Object.prototype.hasOwnProperty;var dt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ri=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ti(t))!ii.call(e,r)&&r!==n&&ut(e,r,{get:()=>t[r],enumerable:!(i=ei(t,r))||i.enumerable});return e};var ft=(e,t,n)=>(n=e!=null?Zn(ni(e)):{},ri(t||!e||!e.__esModule?ut(n,"default",{value:e,enumerable:!0}):n,e));var kt=dt((ro,wt)=>{var Tt="Expected a function",Et=NaN,mi="[object Symbol]",gi=/^\s+|\s+$/g,yi=/^[-+]0x[0-9a-f]+$/i,vi=/^0b[01]+$/i,bi=/^0o[0-7]+$/i,Si=parseInt,xi=typeof global=="object"&&global&&global.Object===Object&&global,Ei=typeof self=="object"&&self&&self.Object===Object&&self,Li=xi||Ei||Function("return this")(),Ti=Object.prototype,wi=Ti.toString,ki=Math.max,_i=Math.min,Fe=function(){return Li.Date.now()};function Oi(e,t,n){var i,r,s,o,a,l,u=0,f=!1,y=!1,g=!0;if(typeof e!="function")throw new TypeError(Tt);t=Lt(t)||0,ve(n)&&(f=!!n.leading,y="maxWait"in n,s=y?ki(Lt(n.maxWait)||0,t):s,g="trailing"in n?!!n.trailing:g);function L(S){var C=i,D=r;return i=r=void 0,u=S,o=e.apply(D,C),o}function b(S){return u=S,a=setTimeout(h,t),f?L(S):o}function T(S){var C=S-l,D=S-u,V=t-C;return y?_i(V,s-D):V}function m(S){var C=S-l,D=S-u;return l===void 0||C>=t||C<0||y&&D>=s}function h(){var S=Fe();if(m(S))return _(S);a=setTimeout(h,T(S))}function _(S){return a=void 0,g&&i?L(S):(i=r=void 0,o)}function w(){a!==void 0&&clearTimeout(a),u=0,i=l=r=a=void 0}function N(){return a===void 0?o:_(Fe())}function F(){var S=Fe(),C=m(S);if(i=arguments,r=this,l=S,C){if(a===void 0)return b(l);if(y)return a=setTimeout(h,t),L(l)}return a===void 0&&(a=setTimeout(h,t)),o}return F.cancel=w,F.flush=N,F}function Ii(e,t,n){var i=!0,r=!0;if(typeof e!="function")throw new TypeError(Tt);return ve(n)&&(i="leading"in n?!!n.leading:i,r="trailing"in n?!!n.trailing:r),Oi(e,t,{leading:i,maxWait:t,trailing:r})}function ve(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function Ci(e){return!!e&&typeof e=="object"}function Ai(e){return typeof e=="symbol"||Ci(e)&&wi.call(e)==mi}function Lt(e){if(typeof e=="number")return e;if(Ai(e))return Et;if(ve(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=ve(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=e.replace(gi,"");var n=vi.test(e);return n||bi.test(e)?Si(e.slice(2),n?2:8):yi.test(e)?Et:+e}wt.exports=Ii});var ln=dt((an,cn)=>{(function(){var e=function(t){var n=new e.Builder;return n.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),n.searchPipeline.add(e.stemmer),t.call(n,n),n.build()};e.version="2.3.9";e.utils={},e.utils.warn=function(t){return function(n){t.console&&console.warn&&console.warn(n)}}(this),e.utils.asString=function(t){return t==null?"":t.toString()},e.utils.clone=function(t){if(t==null)return t;for(var n=Object.create(null),i=Object.keys(t),r=0;r0){var f=e.utils.clone(n)||{};f.position=[a,u],f.index=s.length,s.push(new e.Token(i.slice(a,o),f))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/;e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,n){n in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+n),t.label=n,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var n=t.label&&t.label in this.registeredFunctions;n||e.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,t)},e.Pipeline.load=function(t){var n=new e.Pipeline;return t.forEach(function(i){var r=e.Pipeline.registeredFunctions[i];if(r)n.add(r);else throw new Error("Cannot load unregistered function: "+i)}),n},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(n){e.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},e.Pipeline.prototype.after=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i=i+1,this._stack.splice(i,0,n)},e.Pipeline.prototype.before=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},e.Pipeline.prototype.remove=function(t){var n=this._stack.indexOf(t);n!=-1&&this._stack.splice(n,1)},e.Pipeline.prototype.run=function(t){for(var n=this._stack.length,i=0;i1&&(ot&&(i=s),o!=t);)r=i-n,s=n+Math.floor(r/2),o=this.elements[s*2];if(o==t||o>t)return s*2;if(ol?f+=2:a==l&&(n+=i[u+1]*r[f+1],u+=2,f+=2);return n},e.Vector.prototype.similarity=function(t){return this.dot(t)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var t=new Array(this.elements.length/2),n=1,i=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new e.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),r.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),r.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&r.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),r.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var f=s.str.charAt(0),y=s.str.charAt(1),g;y in s.node.edges?g=s.node.edges[y]:(g=new e.TokenSet,s.node.edges[y]=g),s.str.length==1&&(g.final=!0),r.push({node:g,editsRemaining:s.editsRemaining-1,str:f+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var n=new e.TokenSet,i=n,r=0,s=t.length;r=t;n--){var i=this.uncheckedNodes[n],r=i.child.toString();r in this.minimizedNodes?i.parent.edges[i.char]=this.minimizedNodes[r]:(i.child._str=r,this.minimizedNodes[r]=i.child),this.uncheckedNodes.pop()}};e.Index=function(t){this.invertedIndex=t.invertedIndex,this.fieldVectors=t.fieldVectors,this.tokenSet=t.tokenSet,this.fields=t.fields,this.pipeline=t.pipeline},e.Index.prototype.search=function(t){return this.query(function(n){var i=new e.QueryParser(t,n);i.parse()})},e.Index.prototype.query=function(t){for(var n=new e.Query(this.fields),i=Object.create(null),r=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=t},e.Builder.prototype.k1=function(t){this._k1=t},e.Builder.prototype.add=function(t,n){var i=t[this._ref],r=Object.keys(this._fields);this._documents[i]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,n;do t=this.next(),n=t.charCodeAt(0);while(n>47&&n<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var n=t.next();if(n==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){t.escapeCharacter();continue}if(n==":")return e.QueryLexer.lexField;if(n=="~")return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if(n=="^")return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if(n=="+"&&t.width()===1||n=="-"&&t.width()===1)return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(n.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}},e.QueryParser=function(t,n){this.lexer=new e.QueryLexer(t),this.query=n,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var t=this.peekLexeme();return this.lexemeIdx+=1,t},e.QueryParser.prototype.nextClause=function(){var t=this.currentClause;this.query.clause(t),this.currentClause={}},e.QueryParser.parseClause=function(t){var n=t.peekLexeme();if(n!=null)switch(n.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(i+=" with value '"+n.str+"'"),new e.QueryParseError(i,n.start,n.end)}},e.QueryParser.parsePresence=function(t){var n=t.consumeLexeme();if(n!=null){switch(n.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+n.str+"'";throw new e.QueryParseError(i,n.start,n.end)}var r=t.peekLexeme();if(r==null){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,n.start,n.end)}switch(r.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+r.type+"'";throw new e.QueryParseError(i,r.start,r.end)}}},e.QueryParser.parseField=function(t){var n=t.consumeLexeme();if(n!=null){if(t.query.allFields.indexOf(n.str)==-1){var i=t.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),r="unrecognised field '"+n.str+"', possible fields: "+i;throw new e.QueryParseError(r,n.start,n.end)}t.currentClause.fields=[n.str];var s=t.peekLexeme();if(s==null){var r="expecting term, found nothing";throw new e.QueryParseError(r,n.start,n.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var r="expecting term, found '"+s.type+"'";throw new e.QueryParseError(r,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var n=t.consumeLexeme();if(n!=null){t.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(i==null){t.nextClause();return}switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(r,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var n=t.consumeLexeme();if(n!=null){var i=parseInt(n.str,10);if(isNaN(i)){var r="edit distance must be numeric";throw new e.QueryParseError(r,n.start,n.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(s==null){t.nextClause();return}switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(r,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var n=t.consumeLexeme();if(n!=null){var i=parseInt(n.str,10);if(isNaN(i)){var r="boost must be numeric";throw new e.QueryParseError(r,n.start,n.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(s==null){t.nextClause();return}switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(r,s.start,s.end)}}},function(t,n){typeof define=="function"&&define.amd?define(n):typeof an=="object"?cn.exports=n():t.lunr=n()}(this,function(){return e})})()});Handlebars.registerHelper("groupChanged",function(e,t,n){let i=t||"";if(e.group!==i)return delete e.nestedContext,e.group=i,n.fn(this)});Handlebars.registerHelper("nestingChanged",function(e,t,n){if(t.nested_context&&t.nested_context!==e.nestedContext){if(e.nestedContext=t.nested_context,e.lastModuleSeenInGroup!==t.nested_context)return n.fn(this)}else e.lastModuleSeenInGroup=t.title});Handlebars.registerHelper("showSections",function(e,t){if(e.sections.length>0)return t.fn(this)});Handlebars.registerHelper("showSummary",function(e,t){if(e.nodeGroups)return t.fn(this)});Handlebars.registerHelper("isArray",function(e,t){return Array.isArray(e)?t.fn(this):t.inverse(this)});Handlebars.registerHelper("isNonEmptyArray",function(e,t){return Array.isArray(e)&&e.length>0?t.fn(this):t.inverse(this)});Handlebars.registerHelper("isEmptyArray",function(e,t){return Array.isArray(e)&&e.length===0?t.fn(this):t.inverse(this)});Handlebars.registerHelper("isLocal",function(e,t){let n=window.location.pathname.split("/").pop();return e+".html"===n?t.fn(this):t.inverse(this)});var c=document.querySelector.bind(document),k=document.querySelectorAll.bind(document);function pt(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function he(e){return String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function $(){return document.body.dataset.type}function ht(e,t){if(e){for(let n of e){let i=n.nodeGroups&&n.nodeGroups.find(r=>r.nodes.some(s=>s.anchor===t));if(i)return i.key}return null}}function me(e,t=!1){if(!e)return t?document.getElementById("top-content"):null;let n=document.getElementById(e);return n?n.matches(".detail")?n:["h1","h2","h3","h4","h5","h6"].includes(n.tagName.toLowerCase())?si(n):null:null}function si(e){let t=[e],n=e.nextElementSibling,i=e.tagName.toLowerCase();for(;n;){let s=n.tagName.toLowerCase();["h1","h2","h3","h4","h5","h6"].includes(s)&&s<=i?n=null:(t.push(n),n=n.nextElementSibling)}let r=document.createElement("div");return r.append(...t),r}function ee(){return window.location.hash.replace(/^#/,"")}function mt(e){return new URLSearchParams(window.location.search).get(e)}function gt(e){return fetch(e).then(t=>t.ok).catch(()=>!1)}function yt(e){document.readyState!=="loading"?e():document.addEventListener("DOMContentLoaded",e)}function te(e){return!e||e.trim()===""}function vt(e,t){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>{n=null,e(...r)},t)}}function ge(){return document.head.querySelector("meta[name=project][content]").content}function ye(){return/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)}var bt="ex_doc:settings",oi={tooltips:!0,theme:null,livebookUrl:null},He=class{constructor(){this._subscribers=[],this._settings=oi,this._loadSettings()}get(){return this._settings}update(t){let n=this._settings;this._settings={...this._settings,...t},this._subscribers.forEach(i=>i(this._settings,n)),this._storeSettings()}getAndSubscribe(t){this._subscribers.push(t),t(this._settings)}_loadSettings(){try{let t=localStorage.getItem(bt);if(t){let n=JSON.parse(t);this._settings={...this._settings,...n}}this._loadSettingsLegacy()}catch(t){console.error(`Failed to load settings: ${t}`)}}_storeSettings(){try{this._storeSettingsLegacy(),localStorage.setItem(bt,JSON.stringify(this._settings))}catch(t){console.error(`Failed to persist settings: ${t}`)}}_loadSettingsLegacy(){localStorage.getItem("tooltipsDisabled")!==null&&(this._settings={...this._settings,tooltips:!1}),localStorage.getItem("night-mode")==="true"&&(this._settings={...this._settings,nightMode:!0}),this._settings.nightMode===!0&&(this._settings={...this._settings,theme:"dark"})}_storeSettingsLegacy(){this._settings.tooltips?localStorage.removeItem("tooltipsDisabled"):localStorage.setItem("tooltipsDisabled","true"),this._settings.nightMode!==null?localStorage.setItem("night-mode",this._settings.nightMode===!0?"true":"false"):localStorage.removeItem("night-mode"),this._settings.theme!==null?(localStorage.setItem("night-mode",this._settings.theme==="dark"?"true":"false"),this._settings.nightMode=this._settings.theme==="dark"):(delete this._settings.nightMode,localStorage.removeItem("night-mode"))}},O=new He;var ai=".content",St=".content-inner",ci=".livebook-badge";function xt(e){e||di(),fi(),li(),ui()}function li(){c(ai).querySelectorAll("a").forEach(e=>{e.querySelector("code, img")&&e.classList.add("no-underline")})}function ui(){["warning","info","error","neutral","tip"].forEach(t=>{k(`blockquote h3.${t}, blockquote h4.${t}`).forEach(n=>{n.closest("blockquote").classList.add(t)})})}function di(){c(St).setAttribute("tabindex",-1),c(St).focus()}function fi(){let t=window.location.pathname.replace(/(\.html)?$/,".livemd"),n=new URL(t,window.location.href).toString();O.getAndSubscribe(i=>{let r=i.livebookUrl?hi(i.livebookUrl,n):pi(n);for(let s of k(ci))s.href=r})}function pi(e){return`https://livebook.dev/run?url=${encodeURIComponent(e)}`}function hi(e,t){return`${e}/import?url=${encodeURIComponent(t)}`}var Ot=ft(kt());var Pi=768,De=300,ne=".sidebar-toggle",Ri=".content",M={CLOSED:"closed",OPEN:"open",NO_PREF:"no_pref"},Q={opened:"sidebar-opened",openingStart:"sidebar-opening-start",opening:"sidebar-opening",closed:"sidebar-closed",closingStart:"sidebar-closing-start",closing:"sidebar-closing"},Ni=Object.values(Q),A={togglingTimeout:null,lastWindowWidth:window.innerWidth,sidebarPreference:M.NO_PREF};function It(){Ct(),Qi(),Hi()}function Qi(){let e=sessionStorage.getItem("sidebar_width");e&&_t(e),new ResizeObserver(n=>{for(let i of n)_t(i.contentRect.width)}).observe(document.getElementById("sidebar"))}function _t(e){sessionStorage.setItem("sidebar_width",e),document.body.style.setProperty("--sidebarWidth",`${e}px`)}function Ct(){sessionStorage.getItem("sidebar_state")==="closed"||At()?(q(Q.closed),c(ne).setAttribute("aria-expanded","false")):(q(Q.opened),c(ne).setAttribute("aria-expanded","true")),setTimeout(()=>c(ne).classList.add("sidebar-toggle--animated"),De)}function At(){return window.matchMedia(`screen and (max-width: ${Pi}px)`).matches}function q(...e){document.body.classList.remove(...Ni),document.body.classList.add(...e)}function Hi(){c(ne).addEventListener("click",e=>{Me(),Bi()}),c(Ri).addEventListener("click",e=>{Mi()}),window.addEventListener("resize",(0,Ot.default)(e=>{Di()},100))}function Me(){return Be()?Pt():Fi()}function Be(){return document.body.classList.contains(Q.opened)||document.body.classList.contains(Q.opening)}function Fi(){Rt(),sessionStorage.setItem("sidebar_state","opened"),c(ne).setAttribute("aria-expanded","true"),requestAnimationFrame(()=>{q(Q.openingStart),requestAnimationFrame(()=>(q(Q.opening),new Promise((e,t)=>{A.togglingTimeout=setTimeout(()=>{q(Q.opened),e()},De)})))})}function Pt(){Rt(),sessionStorage.setItem("sidebar_state","closed"),c(ne).setAttribute("aria-expanded","false"),requestAnimationFrame(()=>{q(Q.closingStart),requestAnimationFrame(()=>(q(Q.closing),new Promise((e,t)=>{A.togglingTimeout=setTimeout(()=>{q(Q.closed),e()},De)})))})}function Rt(){A.togglingTimeout&&(clearTimeout(A.togglingTimeout),A.togglingTimeout=null)}function Di(){A.lastWindowWidth!==window.innerWidth&&(A.lastWindowWidth=window.innerWidth,(A.sidebarPreference===M.OPEN||A.sidebarPreference===M.NO_PREF)&&Ct())}function Mi(){At()&&Be()&&Pt()}function Bi(){switch(A.sidebarPreference){case M.OPEN:A.sidebarPreference=M.CLOSED;break;case M.CLOSED:A.sidebarPreference=M.OPEN;break;case M.NO_PREF:Be()?A.sidebarPreference=M.OPEN:A.sidebarPreference=M.CLOSED}}function ce(){return window.sidebarNodes||{}}function Nt(){return window.versionNodes||[]}var ze={search:"search",extras:"extras",modules:"modules",tasks:"tasks"},$e=[ze.extras,ze.modules,ze.tasks],Se=e=>`#${e}-full-list`;function Qt(){$e.forEach(e=>{zi(ce(),e)}),be($()),Ft(),Ht(),Gi()}function zi(e,t){let n=e[t]||[],i=c(Se(t));if(!i)return;let r=Handlebars.templates["sidebar-items"]({nodes:n,group:""});i.innerHTML=r,i.querySelectorAll("ul").forEach(s=>{if(s.innerHTML.trim()===""){let o=s.previousElementSibling;o.classList.contains("expand")&&o.classList.remove("expand"),s.remove()}}),i.querySelectorAll("li a + button").forEach(s=>{s.addEventListener("click",o=>{let l=o.target.closest("li");qi(l)})}),i.querySelectorAll("li a").forEach(s=>{s.addEventListener("click",o=>{let l=o.target.closest("li"),u=i.querySelector(".current-section");u&&ji(u),s.matches(".expand")&&s.pathname===window.location.pathname&&qe(l)})})}function qe(e){e.classList.add("open"),e.querySelector("button[aria-controls]").setAttribute("aria-expanded","true")}function $i(e){e.classList.remove("open"),e.querySelector("button[aria-controls]").setAttribute("aria-expanded","false")}function qi(e){e.classList.contains("open")?$i(e):qe(e)}function Vi(e){e.classList.add("current-section"),e.querySelector("a").setAttribute("aria-current","true")}function ji(e){e.classList.remove("current-section"),e.querySelector("a").setAttribute("aria-current","false")}function Ui(e){e.classList.add("current-hash"),e.querySelector("a").setAttribute("aria-current","true")}function Wi(e){e.classList.remove("current-hash"),e.querySelector("a").setAttribute("aria-current","false")}function be(e){$e.forEach(t=>{let n=c(`#${t}-list-tab-button`);if(n){let i=c(`#${n.getAttribute("aria-controls")}`);t===e?(n.parentElement.classList.add("selected"),n.setAttribute("aria-selected","true"),n.setAttribute("tabindex","0"),i.removeAttribute("hidden")):(n.parentElement.classList.remove("selected"),n.setAttribute("aria-selected","false"),n.setAttribute("tabindex","-1"),i.setAttribute("hidden","hidden"))}})}function Ht(){let e=c(Se($()));if(!e)return;let t=e.querySelector("li.current-page");t&&(t.scrollIntoView(),e.scrollTop-=40)}function Ft(){let e=ee()||"content",n=ce()[$()]||[],i=ht(n,e),r=c(Se($()));if(!r)return;let s=r.querySelector(`li.current-page a.expand[href$="#${i}"]`);s&&qe(s.closest("li"));let o=r.querySelector(`li.current-page a[href$="#${e}"]`);if(o){let a=o.closest("ul");a.classList.contains("deflist")&&Vi(a.closest("li")),Ui(o.closest("li"))}}function Gi(){$e.forEach(t=>{let n=c(`#${t}-list-tab-button`);n&&n.addEventListener("click",i=>{be(t),Ht()})});let e=c("#sidebar-listNav");e.addEventListener("keydown",t=>{if(t.key!=="ArrowRight"&&t.key!=="ArrowLeft")return;let n=Array.from(e.querySelectorAll('[role="tab"]')).map(r=>r.dataset.type),i=e.querySelector('[role="tab"][aria-selected="true"]').dataset.type;if(t.key==="ArrowRight"){let r=n.indexOf(i)+1;r>=n.length&&(r=0);let s=n[r];be(s),c(`#${s}-list-tab-button`).focus()}else if(t.key==="ArrowLeft"){let r=n.indexOf(i)-1;r<0&&(r=n.length-1);let s=n[r];be(s),c(`#${s}-list-tab-button`).focus()}}),window.addEventListener("hashchange",t=>{let n=c(Se($()));if(!n)return;let i=n.querySelector("li.current-page li.current-hash");i&&Wi(i),Ft()})}var B={module:"module",moduleChild:"module-child",mixTask:"mix-task",extra:"extra",section:"section"};function Mt(e,t=8){if(te(e))return[];let n=ce(),i=[...Ve(n.modules,e,B.module,"module"),...Ki(n.modules,e,B.moduleChild),...Ve(n.tasks,e,B.mixTask,"mix task"),...Ve(n.extras,e,B.extra,"page"),...je(n.modules,e,B.section,"module"),...je(n.tasks,e,B.section,"mix task"),...je(n.extras,e,B.section,"page")].filter(r=>r!==null);return nr(i).slice(0,t)}function Ve(e,t,n,i){return e.map(r=>Ji(r,t,n,i))}function Ki(e,t,n){return e.filter(i=>i.nodeGroups).flatMap(i=>i.nodeGroups.flatMap(({key:r,nodes:s})=>{let o=tr(r);return s.map(a=>Xi(a,i.id,t,n,o)||er(a,i.id,t,n,o))}))}function je(e,t,n,i){return e.flatMap(r=>Yi(r).map(s=>Zi(r,s,t,n,i)))}function Yi(e){return(e.sections||[]).concat(e.headers||[])}function Ji(e,t,n,i){return Ee(e.title,t)?{link:`${e.id}.html`,title:we(e.title,t),description:null,matchQuality:Le(e.title,t),deprecated:e.deprecated,labels:[i],category:n}:null}function Xi(e,t,n,i,r){return Ee(e.id,n)?{link:`${t}.html#${e.anchor}`,title:we(e.id,n),labels:[r],description:t,matchQuality:Le(e.id,n),deprecated:e.deprecated,category:i}:null}function Zi(e,t,n,i,r){return Bt(t.id,n)?{link:`${e.id}.html#${t.anchor}`,title:we(t.id,n),description:e.title,matchQuality:Le(t.id,n),labels:[r,"section"],category:i}:null}function er(e,t,n,i,r){let s=`${t}.${e.id}`,o=`${t}:${e.id}`,a,l;if(Ee(s,n))a=s,l=/\./g;else if(Ee(o,n))a=o,l=/:/g;else return null;let u=n.replace(l," ");return Bt(e.id,u)?{link:`${t}.html#${e.anchor}`,title:we(e.id,u),label:r,description:t,matchQuality:Le(a,n),deprecated:e.deprecated,category:i}:null}function tr(e){switch(e){case"callbacks":return"callback";case"types":return"type";default:return"function"}}function nr(e){return e.slice().sort((t,n)=>t.matchQuality!==n.matchQuality?n.matchQuality-t.matchQuality:Dt(t.category)-Dt(n.category))}function Dt(e){switch(e){case B.module:return 1;case B.moduleChild:return 2;case B.mixTask:return 3;default:return 4}}function Bt(e,t){return Te(t).some(i=>zt(e,i))}function Ee(e,t){return Te(t).every(i=>zt(e,i))}function zt(e,t){return e.toLowerCase().includes(t.toLowerCase())}function Le(e,t){let n=Te(t),r=n.map(o=>o.length).reduce((o,a)=>o+a,0)/e.length,s=ir(e,n[0])?1:0;return r+s}function ir(e,t){return e.toLowerCase().startsWith(t.toLowerCase())}function Te(e){return e.trim().split(/\s+/)}function we(e,t){let n=Te(t).sort((i,r)=>r.length-i.length);return xe(e,n)}function xe(e,t){if(t.length===0)return e;let[n,...i]=t,r=e.match(new RegExp(`(.*)(${pt(n)})(.*)`,"i"));if(r){let[,s,o,a]=r;return xe(s,t)+""+he(o)+""+xe(a,t)}else return xe(e,i)}var ke=null,G=null;function $t(){G=document.getElementById("toast"),G.addEventListener("click",e=>{clearTimeout(ke),e.target.classList.remove("show")})}function Ue(e){G&&(clearTimeout(ke),G.innerText=e,G.classList.add("show"),ke=setTimeout(()=>{G.classList.remove("show"),ke=setTimeout(function(){G.innerText=""},1e3)},5e3))}var qt="dark",We=["system","dark","light"];function Vt(e){O.getAndSubscribe(t=>{document.body.classList.toggle(qt,Ut(e||t.theme))}),sr()}function jt(){let e=We[We.indexOf(Ge())+1]||We[0];O.update({theme:e}),Ue(`Set theme to "${e}"`)}function Ge(){return O.get().theme||"system"}function Ut(e){return e==="dark"||rr()&&(e==null||e==="system")}function rr(){return window.matchMedia("(prefers-color-scheme: dark)").matches}function sr(){window.matchMedia("(prefers-color-scheme: dark)").addListener(e=>{let t=O.get().theme,n=Ut(t);(t==null||t==="system")&&(document.body.classList.toggle(qt,n),Ue(`Browser changed theme to "${n?"dark":"light"}"`))})}var ie=".autocomplete",Oe=".autocomplete-suggestions",_e=".autocomplete-suggestion",I={autocompleteSuggestions:[],previewOpen:!1,selectedIdx:-1};function or(){c(ie).classList.add("shown")}function Ke(){c(ie).classList.remove("shown")}function Wt(){return c(ie).classList.contains("shown")}function Ye(e){I.autocompleteSuggestions=Mt(e),I.selectedIdx=-1,te(e)?Ke():(ar({term:e,suggestions:I.autocompleteSuggestions}),Ie(0),or())}function ar({term:e,suggestions:t}){let n=Handlebars.templates["autocomplete-suggestions"]({suggestions:t,term:e}),i=c(ie);i.innerHTML=n}function Gt(){return I.selectedIdx===-1?null:I.autocompleteSuggestions[I.selectedIdx]}function Ie(e){Yt(cr(e))}function Kt(e){if(e.data.type==="preview"){let{contentHeight:t}=e.data,n=c(".autocomplete-preview");n&&(n.style.height=`${t+32}px`,n.classList.remove("loading"))}}function Yt(e){I.selectedIdx=e;let t=c(Oe),n=c(`${_e}.selected`),i=c(`${_e}[data-index="${I.selectedIdx}"]`);if(n&&n.classList.remove("selected"),i){if(I.previewOpen){Xt(),window.addEventListener("message",Kt),t.classList.add("previewing");let r=document.createElement("div");r.classList.add("autocomplete-preview"),r.classList.add("loading");let s=i.href.replace(".html",`.html?preview=true&theme=${Ge()}`),o=document.createElement("iframe");o.setAttribute("src",s),r.appendChild(document.createElement("div")),r.appendChild(document.createElement("span")),r.appendChild(o),i.parentNode.insertBefore(r,i.nextSibling)}i.classList.add("selected"),i.scrollIntoView({block:"nearest"})}else t&&(t.scrollTop=0)}function Jt(){I.previewOpen?Ce():Je()}function Ce(){I.previewOpen=!1;let e=c(Oe);e&&e.classList.remove("previewing"),Xt()}function Je(e){I.previewOpen=!0,e?e=e.closest(_e):e=c(`${_e}[data-index="${I.selectedIdx}"]`),e&&Yt(parseInt(e.dataset.index))}function Xt(){let e=c(".autocomplete-preview");e&&(e.remove(),window.removeEventListener("message",Kt))}function cr(e){let t=I.autocompleteSuggestions.length+1;return(I.selectedIdx+e+1+t)%t-1}var le="form.search-bar input",lr="form.search-bar .search-close-button";function nn(){ur(),window.onTogglePreviewClick=function(e,t){e.preventDefault(),e.stopImmediatePropagation(),Xe(),t?Je(e.target):Ce()}}function rn(e){let t=c(le);t.value=e}function Xe(){let e=c(le);document.body.classList.add("search-focused"),e.focus()}function ur(){let e=c(le);if(document.querySelector('meta[name="exdoc:autocomplete"][content="off"]'))return e.addEventListener("keydown",t=>{t.key==="Enter"&&Zt(t)}),!0;e.addEventListener("keydown",t=>{let n=ye();t.key==="Escape"?(Ae(),e.blur()):t.key==="Enter"?Zt(t):t.key==="ArrowUp"||n&&t.ctrlKey&&t.key==="p"?(Ie(-1),t.preventDefault()):t.key==="ArrowDown"||n&&t.ctrlKey&&t.key==="n"?(Ie(1),t.preventDefault()):t.key==="Tab"&&(Jt(),t.preventDefault())}),e.addEventListener("input",t=>{Ye(t.target.value)}),e.addEventListener("focus",t=>{document.body.classList.contains("search-focused")||(document.body.classList.add("search-focused"),Ye(t.target.value))}),e.addEventListener("blur",t=>{let n=t.relatedTarget,i=c(Oe);if(n&&i&&i.contains(n))return setTimeout(()=>{Wt()&&e.focus()},1e3),null;Pe()}),c(ie).addEventListener("click",t=>{t.shiftKey||t.ctrlKey?e.focus():(Ae(),Pe())}),c(lr).addEventListener("click",t=>{Ae(),Pe()})}function Zt(e){let t=c(le),n=e.shiftKey||e.ctrlKey,i=Gt();e.preventDefault();let r=n?"_blank":"_self",s=document.createElement("a");if(s.setAttribute("target",r),i)s.setAttribute("href",i.link);else{let o=document.querySelector('meta[name="exdoc:full-text-search-url"]'),a=o?o.getAttribute("content"):"search.html?q=";s.setAttribute("href",`${a}${encodeURIComponent(t.value)}`)}s.click(),n||(Ae(),Pe())}function Ae(){let e=c(le);e.value=""}function Pe(){Ce(),document.body.classList.remove("search-focused"),Ke()}var en=window.scrollY,tn=70;window.addEventListener("scroll",function(){let e=window.scrollY;e>tn*2&&document.body.classList.add("scroll-sticky"),e===0&&document.body.classList.remove("scroll-sticky"),e>en&&e>tn?document.body.classList.remove("scroll-sticky"):document.body.classList.add("scroll-sticky"),en=e<=0?0:e},!1);var sn=".sidebar-projectVersion",dr=".sidebar-projectVersionsDropdown";function on(){let e=Nt();if(e.length>0){let n=c(sn).textContent.trim(),i=pr(e,n);fr({nodes:i})}}function fr({nodes:e}){let t=c(sn),n=Handlebars.templates["versions-dropdown"]({nodes:e});t.innerHTML=n,c(dr).addEventListener("change",mr)}function pr(e,t){return hr(e,t).map(i=>({...i,isCurrentVersion:i.version===t}))}function hr(e,t){return e.some(i=>i.version===t)?e:[{version:t,url:"#"},...e]}function mr(e){let t=e.target.value,n=window.location.pathname.split("/").pop()+window.location.hash,i=`${t}/${n}`;gt(i).then(r=>{r?window.location.href=i:window.location.href=t})}var H=ft(ln());var Re=80,gr="#search";function dn(){if(window.location.pathname.endsWith("/search.html")){let e=mt("q");yr(e)}}async function yr(e){if(te(e))Ze({value:e});else{rn(e);let t=await vr();try{let n=e.replaceAll(/(\B|\\):/g,"\\:"),i=Or(t.search(n));Ze({value:e,results:i})}catch(n){Ze({value:e,errorMessage:n.message})}}}function Ze({value:e,results:t,errorMessage:n}){let i=c(gr),r=Handlebars.templates["search-results"]({value:e,results:t,errorMessage:n});i.innerHTML=r}async function vr(){H.default.tokenizer.separator=/\s+/,H.default.QueryLexer.termSeparator=/\s+/,H.default.Pipeline.registerFunction(pn,"docTokenSplitter"),H.default.Pipeline.registerFunction(hn,"docTrimmer");let e=await br();if(e)return e;let t=wr();return Sr(t),t}async function br(){try{let e=sessionStorage.getItem(fn());if(e){let t=await Er(e);return H.default.Index.load(t)}else return null}catch(e){return console.error("Failed to load index: ",e),null}}async function Sr(e){try{let t=await xr(e);sessionStorage.setItem(fn(),t)}catch(t){console.error("Failed to save index: ",t)}}async function xr(e){let t=new Blob([JSON.stringify(e)],{type:"application/json"}).stream().pipeThrough(new window.CompressionStream("gzip")),i=await(await new Response(t).blob()).arrayBuffer();return Lr(i)}async function Er(e){let t=new Blob([Tr(e)],{type:"application/json"}).stream().pipeThrough(new window.DecompressionStream("gzip")),n=await new Response(t).text();return JSON.parse(n)}function Lr(e){let t="",n=new Uint8Array(e),i=n.byteLength;for(let r=0;r{this.add(e)})})}function kr(e){e.pipeline.before(H.default.stemmer,pn)}function pn(e){let t=e.toString().split(/\:|\.|\/|_|-/).map(n=>e.clone().update(()=>n));return t.length>1?[...t,e]:t}function _r(e){e.pipeline.before(H.default.stemmer,hn)}function hn(e){return e.update(function(t){return t.replace(/^[^@:\w]+/,"").replace(/[^\?\!\w]+$/,"")})}function Or(e){return e.filter(t=>un(t.ref)).map(t=>{let n=un(t.ref),i=t.matchData.metadata;return{...n,metadata:i,excerpts:Ir(n,i)}})}function un(e){return searchData.items.find(t=>t.ref===e)||null}function Ir(e,t){let{doc:n}=e,r=Object.keys(t).filter(s=>"doc"in t[s]).map(s=>t[s].doc.position.map(([o,a])=>Cr(n,o,a))).reduce((s,o)=>s.concat(o),[]);return r.length===0?[n.slice(0,Re*2)+(Re*20?"...":"",e.slice(i,t),""+he(e.slice(t,t+n))+"",e.slice(t+n,r),r{let n=t.getAttribute("data-group-id");t.addEventListener("mouseenter",i=>{mn(n,!0)}),t.addEventListener("mouseleave",i=>{mn(n,!1)})})}function mn(e,t){k(`[data-group-id="${e}"]`).forEach(i=>{i.classList.toggle(Ar,t)})}var K=".modal",Rr=".modal .modal-close",Nr=".modal .modal-title",Qr=".modal .modal-body",yn='button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',z={prevFocus:null,lastFocus:null,ignoreFocusChanges:!1};function vn(){Hr()}function Hr(){let e=Handlebars.templates["modal-layout"]();document.body.insertAdjacentHTML("beforeend",e),c(K).addEventListener("keydown",t=>{t.key==="Escape"&&re()}),c(Rr).addEventListener("click",t=>{re()}),c(K).addEventListener("click",t=>{t.target.classList.contains("modal")&&re()})}function bn(e){if(z.ignoreFocusChanges)return;let t=c(K);if(t.contains(e.target))z.lastFocus=e.target;else{z.ignoreFocusChanges=!0;let n=Fr(t);z.lastFocus===n?Dr(t).focus():n.focus(),z.ignoreFocusChanges=!1,z.lastFocus=document.activeElement}}function Fr(e){return e.querySelector(yn)}function Dr(e){let t=e.querySelectorAll(yn);return t[t.length-1]}function Ne({title:e,body:t}){z.prevFocus=document.activeElement,document.addEventListener("focus",bn,!0),c(Nr).innerHTML=e,c(Qr).innerHTML=t,c(K).classList.add("shown"),c(K).focus()}function re(){c(K).classList.remove("shown"),document.addEventListener("focus",bn,!0),z.prevFocus&&z.prevFocus.focus(),z.prevFocus=null}function Sn(){return c(K).classList.contains("shown")}var Mr="https://hexdocs.pm/%%",Br="https://hex.pm/api/packages?search=name:%%*",zr=".display-quick-switch",et="#quick-switch-input",En="#quick-switch-results",$r=".quick-switch-result",qr=300,Vr=9,jr=["elixir","eex","ex_unit","hex","iex","logger","mix"].map(e=>({name:e})),Ln=2,P={autocompleteResults:[],selectedIdx:null};function Tn(){Ur()}function Ur(){k(zr).forEach(e=>{e.addEventListener("click",t=>{nt()})})}function Wr(e){if(e.key==="Enter"){let t=e.target.value;Kr(t),e.preventDefault()}else e.key==="ArrowUp"?(xn(-1),e.preventDefault()):e.key==="ArrowDown"&&(xn(1),e.preventDefault())}function Gr(e){let t=e.target.value;if(t.lengthn.json()).then(n=>{Array.isArray(n)&&(P.autocompleteResults=Zr(e,n),P.selectedIdx=null,c(et).value.length>=Ln&&Xr({results:P.autocompleteResults}))})}function Xr({results:e}){let t=c(En),n=Handlebars.templates["quick-switch-results"]({results:e});t.innerHTML=n,k($r).forEach(i=>{i.addEventListener("click",r=>{let s=i.getAttribute("data-index"),o=P.autocompleteResults[s];tt(o.name)})})}function Zr(e,t){return jr.concat(t).filter(n=>n.name.toLowerCase().includes(e.toLowerCase())).filter(n=>n.releases===void 0||n.releases[0].has_docs===!0).slice(0,Vr)}function xn(e){P.selectedIdx=es(e);let t=c(".quick-switch-result.selected"),n=c(`.quick-switch-result[data-index="${P.selectedIdx}"]`);t&&t.classList.remove("selected"),n&&n.classList.add("selected")}function es(e){let t=P.autocompleteResults.length;if(P.selectedIdx===null){if(e>=0)return 0;if(e<0)return t-1}return(P.selectedIdx+e+t)%t}var ts=".display-settings",ns="#settings-modal-content",it="#modal-settings-tab",rt="#modal-keyboard-shortcuts-tab",kn="#settings-content",_n="#keyboard-shortcuts-content",is=[{title:"Settings",id:"modal-settings-tab"},{title:"Keyboard shortcuts",id:"modal-keyboard-shortcuts-tab"}];function On(){rs()}function rs(){k(ts).forEach(e=>{e.addEventListener("click",t=>{st()})})}function wn(){c(rt).classList.remove("active"),c(it).classList.add("active"),c(kn).classList.remove("hidden"),c(_n).classList.add("hidden")}function ss(){c(rt).classList.add("active"),c(it).classList.remove("active"),c(_n).classList.remove("hidden"),c(kn).classList.add("hidden")}function st(){Ne({title:is.map(({id:s,title:o})=>``).join(""),body:Handlebars.templates["settings-modal-body"]({shortcuts:ot})});let e=c(ns),t=e.querySelector('[name="theme"]'),n=e.querySelector('[name="tooltips"]'),i=e.querySelector('[name="direct_livebook_url"]'),r=e.querySelector('[name="livebook_url"]');O.getAndSubscribe(s=>{t.value=s.theme||"system",n.checked=s.tooltips,s.livebookUrl===null?(i.checked=!1,r.classList.add("hidden"),r.tabIndex=-1):(i.checked=!0,r.classList.remove("hidden"),r.tabIndex=0,r.value=s.livebookUrl)}),t.addEventListener("change",s=>{O.update({theme:s.target.value})}),n.addEventListener("change",s=>{O.update({tooltips:s.target.checked})}),i.addEventListener("change",s=>{let o=s.target.checked?r.value:null;O.update({livebookUrl:o})}),r.addEventListener("input",s=>{O.update({livebookUrl:s.target.value})}),c(it).addEventListener("click",s=>{wn()}),c(rt).addEventListener("click",s=>{ss()}),wn()}var os="#settings-modal-content",ot=[{key:"c",description:"Toggle sidebar",action:Me},{key:"n",description:"Cycle themes",action:jt},{key:"s",description:"Focus search bar",displayAs:"/ or s",action:at},{key:"/",action:at},{key:"k",hasModifier:!0,action:at},{key:"g",description:"Search HexDocs package",displayAs:"g",action:nt},{key:"?",displayAs:"?",description:"Bring up this modal",action:us}],ct={shortcutBeingPressed:null};function In(){as()}function as(){document.addEventListener("keydown",cs),document.addEventListener("keyup",ls)}function cs(e){if(ct.shortcutBeingPressed||e.target.matches("input, textarea"))return;let t=ot.find(n=>n.hasModifier?ye()&&e.metaKey||e.ctrlKey?n.key===e.key:!1:e.ctrlKey||e.metaKey||e.altKey?!1:n.key===e.key);t&&(ct.shortcutBeingPressed=t,e.preventDefault(),t.action(e))}function ls(e){ct.shortcutBeingPressed=null}function at(e){re(),Xe()}function us(){ds()?re():st()}function ds(){return Sn()&&c(os)}var Y={plain:"plain",function:"function",module:"module"},fs=[{href:"typespecs.html#basic-types",hint:{kind:Y.plain,description:"Basic type"}},{href:"typespecs.html#literals",hint:{kind:Y.plain,description:"Literal"}},{href:"typespecs.html#built-in-types",hint:{kind:Y.plain,description:"Built-in type"}}],Qe={cancelHintFetching:null};function Cn(e){if(Pn(e))return!0;let t=/#.*\//;return e.includes("#")&&!t.test(e)?!1:e.includes(".html")}function An(e){let t=Pn(e);return t?Promise.resolve(t):ps(e)}function Pn(e){let t=fs.find(n=>e.includes(n.href));return t?t.hint:null}function ps(e){let t=e.replace(".html",".html?hint=true");return new Promise((n,i)=>{let r=document.createElement("iframe");r.setAttribute("src",t),r.style.display="none";function s(a){let{href:l,hint:u}=a.data;t===l&&(o(),n(u))}Qe.cancelHintFetching=()=>{o(),i(new Error("cancelled"))};function o(){r.remove(),window.removeEventListener("message",s),Qe.cancelHintFetching=null}window.addEventListener("message",s),document.body.appendChild(r)})}function Rn(){Qe.cancelHintFetching&&Qe.cancelHintFetching()}function Nn(e){let n=e.querySelector("h1").textContent,i=e.querySelector(".docstring > p"),r=i?i.innerHTML:"";return{kind:Y.function,title:n.trim(),description:r.trim()}}function Qn(e){let n=e.querySelector("h1 > span").textContent,i=e.querySelector("#moduledoc p"),r=i?i.innerHTML:"";return{kind:Y.module,title:n.trim(),description:r.trim()}}var hs=".content a",lt=".tooltip",ms=".tooltip .tooltip-body",Fn="body .content-inner",gs="#content",Dn="tooltip-shown",ue=10,ys=ue*4,Hn={height:450,width:768},vs=100,se={currentLinkElement:null,hoverDelayTimeout:null};function Mn(){bs(),Ss()}function bs(){let e=Handlebars.templates["tooltip-layout"]();c(Fn).insertAdjacentHTML("beforeend",e)}function Ss(){k(hs).forEach(e=>{xs(e)&&(e.addEventListener("mouseenter",t=>{Ls(e)}),e.addEventListener("mouseleave",t=>{_s(e)}))})}function xs(e){return!(e.getAttribute("data-no-tooltip")!==null||Es(e.href)||!Cn(e.href))}function Es(e){let t=e.replace(gs,"");return window.location.href.split("#")[0]===t}function Ls(e){Ts()&&(se.currentLinkElement=e,se.hoverDelayTimeout=setTimeout(()=>{An(e.href).then(t=>{ws(t),ks()}).catch(()=>{})},vs))}function Ts(){let e=window.innerWidthe.firstElementChild&&e.firstElementChild.tagName==="CODE").forEach(e=>e.insertAdjacentHTML("beforeend",Hs)),Array.from(k(".copy-button")).forEach(e=>{let t;e.addEventListener("click",()=>{let n=e.querySelector("[aria-live]");t&&clearTimeout(t);let i=Array.from(e.parentElement.querySelector("code").childNodes).filter(r=>!(r.tagName==="SPAN"&&r.classList.contains("unselectable"))).map(r=>r.textContent).join("");navigator.clipboard.writeText(i),e.classList.add("clicked"),n.innerHTML="Copied! ✓",t=setTimeout(()=>{e.classList.remove("clicked"),n.innerHTML=""},3e3)})})}function Vn(){let t=/(Macintosh|iPhone|iPad|iPod)/.test(window.navigator.userAgent)?"apple-os":"non-apple-os";document.documentElement.classList.add(t)}var Ds="content",Ms="tabs-open",Bs="tabs-close",zs="H3",$s="tabset";function Un(){qs().map(Vs).forEach(n=>Ws(n))}function qs(){let e=document.createNodeIterator(document.getElementById(Ds),NodeFilter.SHOW_COMMENT,{acceptNode(i){return i.nodeValue.trim()===Ms?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),t=[],n;for(;n=e.nextNode();)t.push(n);return t}function Vs(e,t,n){let i=[],r=[],s={label:"",content:[]};for(;e=e.nextSibling;){if(js(e)){jn(s,r,t);break}i.push(e),e.nodeName===zs?(jn(s,r,t),s.label=e.innerText,s.content=[]):s.content.push(e.outerHTML)}let o=document.createElement("div");return o.className=$s,Us(i,o),o.innerHTML=Handlebars.templates.tabset({tabs:r}),o}function js(e){return e.nodeName==="#comment"&&e.nodeValue.trim()===Bs}function jn(e,t,n){if(e.label===""&&!e.content.length)return!1;let i=e.label,r=e.content;t.push({label:i,content:r,setIndex:n})}function Us(e,t){if(!e||!e.length)return!1;e[0].parentNode.insertBefore(t,e[0]),e.forEach(n=>t.appendChild(n))}function Ws(e){let t={tabs:e.querySelectorAll(':scope [role="tab"]'),panels:e.querySelectorAll(':scope [role="tabpanel"]'),activeIndex:0};t.tabs.forEach((n,i)=>{n.addEventListener("click",r=>{J(i,t)}),n.addEventListener("keydown",r=>{let s=t.tabs.length-1;r.code==="ArrowLeft"?(r.preventDefault(),t.activeIndex===0?J(s,t):J(t.activeIndex-1,t)):r.code==="ArrowRight"?(r.preventDefault(),t.activeIndex===s?J(0,t):J(t.activeIndex+1,t)):r.code==="Home"?(r.preventDefault(),J(0,t)):r.code==="End"&&(r.preventDefault(),J(s,t))})})}function J(e,t){t.tabs[t.activeIndex].setAttribute("aria-selected","false"),t.tabs[t.activeIndex].tabIndex=-1,t.tabs[e].setAttribute("aria-selected","true"),t.tabs[e].tabIndex=0,t.tabs[e].focus(),t.panels[t.activeIndex].setAttribute("hidden",""),t.panels[t.activeIndex].tabIndex=-1,t.panels[e].removeAttribute("hidden"),t.panels[e].tabIndex=0,t.activeIndex=e}function Gn(){let e=me(ee(),!0);e&&Gs(e)}function Gs(e){Js(e),Ks(),Ys(),Wn(),window.addEventListener("resize",t=>{Wn()})}function Wn(){let e=document.body.scrollHeight,t=document.getElementById("content").parentElement.offsetHeight,n={type:"preview",maxHeight:e,contentHeight:t};window.parent.postMessage(n,"*")}function Ks(){let e=document.getElementsByTagName("a");for(let t of e)t.getAttribute("target")!=="_blank"&&t.setAttribute("target","_parent")}function Ys(){window.scrollTo(0,0)}function Js(e){document.body.classList.add("preview");let t=document.getElementById("content");t.innerHTML=e.innerHTML}yt(()=>{let e=new URLSearchParams(window.location.search),t=e.has("preview");Vt(e.get("theme")),xt(t),gn(),Mn(),$n(),qn(),Vn(),Un(),t?Gn():(on(),It(),Qt(),nn(),vn(),In(),Tn(),$t(),dn(),On())});})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/doc/dist/html-erlang-EBZIIHAS.css b/doc/dist/html-erlang-EBZIIHAS.css new file mode 100644 index 0000000..e51da55 --- /dev/null +++ b/doc/dist/html-erlang-EBZIIHAS.css @@ -0,0 +1,6 @@ +:root{--main: hsl(0, 100%, 44%);--mainDark: hsl(0, 100%, 34%);--mainDarkest: hsl(0, 100%, 24%);--mainLight: hsl(0, 100%, 64%);--mainLightest: hsl(0, 100%, 74%);--searchBarFocusColor: hsl(0, 100%, 50%);--searchBarBorderColor: rgb(255, 71, 71, .1);--linksNoUnderline: #0969da;--linksNoUnderlineVisited: #085fc4}body.dark{--linksNoUnderline: #71b7ff;--linksNoUnderlineVisited: #65a4e5}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:300;src:url(./lato-latin-ext-300-normal-VPGGJKJL.woff2) format("woff2"),url(./lato-all-300-normal-GIV56FBX.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:300;src:url(./lato-latin-300-normal-YUMVEFOL.woff2) format("woff2"),url(./lato-all-300-normal-GIV56FBX.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:400;src:url(./lato-latin-ext-400-normal-N27NCBWW.woff2) format("woff2"),url(./lato-all-400-normal-MNITWADU.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:400;src:url(./lato-latin-400-normal-W7754I4D.woff2) format("woff2"),url(./lato-all-400-normal-MNITWADU.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:700;src:url(./lato-latin-ext-700-normal-Q2L5DVMW.woff2) format("woff2"),url(./lato-all-700-normal-XMT5XFBS.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:700;src:url(./lato-latin-700-normal-2XVSBPG4.woff2) format("woff2"),url(./lato-all-700-normal-XMT5XFBS.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(./inconsolata-vietnamese-400-normal-IGQPHHJH.woff2) format("woff2"),url(./inconsolata-all-400-normal-HMVRHNDU.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(./inconsolata-latin-ext-400-normal-K7HVGTP7.woff2) format("woff2"),url(./inconsolata-all-400-normal-HMVRHNDU.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(./inconsolata-latin-400-normal-RGKDDNDD.woff2) format("woff2"),url(./inconsolata-all-400-normal-HMVRHNDU.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(./inconsolata-vietnamese-700-normal-LHEGSN35.woff2) format("woff2"),url(./inconsolata-all-700-normal-WFUKXZPS.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(./inconsolata-latin-ext-700-normal-4MPBLFZC.woff2) format("woff2"),url(./inconsolata-all-700-normal-WFUKXZPS.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(./inconsolata-latin-700-normal-DTS2D7TO.woff2) format("woff2"),url(./inconsolata-all-700-normal-WFUKXZPS.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--content-width: 949px;--content-gutter: 60px;--borderRadius: 4px;--navTabBorderWidth: 4px;--defaultFontFamily: -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";--sansFontFamily: "Lato", sans-serif;--monoFontFamily: "Inconsolata", Menlo, Courier, monospace;--baseFontSize: 18px;--baseLineHeight: 1.5em;--gray25: hsl(207, 43%, 98%);--gray50: hsl(207, 43%, 96%);--gray100: hsl(212, 33%, 91%);--gray200: hsl(210, 29%, 88%);--gray300: hsl(210, 26%, 84%);--gray400: hsl(210, 21%, 64%);--gray450: hsl(210, 21%, 49%);--gray500: hsl(210, 21%, 34%);--gray600: hsl(210, 27%, 26%);--gray700: hsl(212, 35%, 17%);--gray750: hsl(214, 46%, 14%);--gray800: hsl(216, 52%, 11%);--gray800-opacity-0: hsla(216, 52%, 11%, 0%);--gray850: hsl(216, 63%, 8%);--gray900: hsl(218, 73%, 4%);--gray900-opacity-50: hsla(218, 73%, 4%, 50%);--gray900-opacity-0: hsla(218, 73%, 4%, 0%);--coldGrayFaint: hsl(240, 5%, 97%);--coldGrayLight: hsl(240, 5%, 88%);--coldGray-lightened-10: hsl(240, 5%, 56%);--coldGray: hsl(240, 5%, 46%);--coldGray-opacity-10: hsla(240, 5%, 46%, 10%);--coldGrayDark: hsl(240, 5%, 28%);--coldGrayDim: hsl(240, 5%, 18%);--yellowLight: hsl(60, 100%, 81%);--yellowDark: hsl(60, 100%, 43%, 62%);--yellow: hsl(60, 100%, 43%);--green-lightened-10: hsl(90, 100%, 45%);--green: hsl(90, 100%, 35%);--white: hsl(0, 0%, 100%);--white-opacity-50: hsla(0, 0%, 100%, 50%);--white-opacity-10: hsla(0, 0%, 100%, 10%);--white-opacity-0: hsla(0, 0%, 100%, 0%);--black: hsl(0, 0%, 0%);--black-opacity-10: hsla(0, 0%, 0%, 10%);--black-opacity-50: hsla(0, 0%, 0%, 50%)}@media screen and (max-width: 768px){:root{--content-width: 100%;--content-gutter: 20px}}:root{--background: var(--white);--contrast: var(--black);--textBody: var(--gray800);--textHeaders: var(--gray900);--textDetailAccent: var(--mainLight);--textDetailBackground: var(--coldGrayFaint);--textFooter: var(--gray700);--links: var(--black);--linksVisited: var(--black);--linksDecoration: var(--gray450);--iconAction: var(--coldGray);--iconActionHover: var(--gray800);--blockquoteBackground: var(--coldGrayFaint);--blockquoteBorder: var(--coldGrayLight);--tableHeadBorder: var(--gray100);--tableBodyBorder: var(--gray50);--warningBackground: hsl( 33, 100%, 97%);--warningHeadingBackground: hsl( 33, 87%, 64%);--warningHeading: var(--black);--errorBackground: hsl( 7, 81%, 96%);--errorHeadingBackground: hsl( 6, 80%, 60%);--errorHeading: var(--white);--infoBackground: hsl(206, 91%, 96%);--infoHeadingBackground: hsl(213, 92%, 62%);--infoHeading: var(--white);--neutralBackground: hsl(212, 29%, 92%);--neutralHeadingBackground: hsl(220, 43%, 11%);--neutralHeading: var(--white);--tipBackground: hsl(142, 31%, 93%);--tipHeadingBackground: hsl(134, 39%, 36%);--tipHeading: var(--white);--fnSpecAttr: var(--coldGray);--fnDeprecated: var(--yellowLight);--blink: var(--yellowLight);--codeBackground: var(--gray25);--codeBorder: var(--gray100);--codeScrollThumb: var(--gray400);--codeScrollBackground: var(--codeBorder);--admCodeBackground: var(--gray25);--admCodeBorder: var(--gray100);--admCodeColor: var(--black);--admInlineCodeColor: var(--black);--admInlineCodeBackground: var(--gray25);--admInlineCodeBorder: var(--gray100);--tabBackground: var(--white);--tabBorder: var(--gray300);--tabBorderTop: var(--gray100);--tab: var(--gray600);--tabShadow: var(--gray25);--bottomActionsBtnBorder: var(--black-opacity-10);--bottomActionsBtnSubheader: var(--mainDark);--modalBackground: var(--white);--settingsInput: var(--gray500);--settingsInputBackground: var(--white);--settingsInputBorder: var(--gray300);--settingsSectionBorder: var(--gray300);--quickSwitchInput: var(--gray500);--quickSwitchContour: var(--coldGray);--success: var(--green);--sidebarButtonBackground: linear-gradient(180deg, var(--white) 20%, var(--white-opacity-50) 70%, var(--white-opacity-0) 100%);--sidebarAccentMain: var(--gray50);--sidebarBackground: var(--gray800);--sidebarHeader: var(--gray700);--sidebarMuted: var(--gray300);--sidebarHover: var(--white);--sidebarScrollbarThumb: var(--coldGray);--sidebarScrollbarTrack: var(--sidebarBackground);--sidebarSubheadings: var(--gray400);--sidebarItem: var(--gray200);--sidebarInactiveItemMarker: var(--gray600);--sidebarLanguageAccentBar: var(--mainLight);--sidebarActiveItem: var(--mainLightest);--searchBarBorder: var(--gray200);--searchAccentMain: var(--gray-400);--searchLanguageAccentBar: var(--main);--searchSearch: var(--white);--autocompleteBorder: rgba(3, 9, 19, .1);--autocompletePreview: var(--gray25);--autocompleteHover: var(--grey50, #F0F5F9);--autocompleteBackground: var(--white);--suggestionBorder: var(--gray200);--autocompleteResults: var(--gray600);--autocompleteResultsBold: var(--gray800);--autocompleteSrollbarThumb: var(--gray200);--autocompleteSrollbarTrack: var(--gray50);--autocompleteLabelBack: var(--gray100);--autocompleteLabelFont: var(--gray600)}body.dark{--background: var(--gray900);--contrast: var(--white);--textBody: var(--gray200);--textHeaders: var(--gray100);--textDetailAccent: var(--mainLight);--textDetailBackground: var(--gray700);--textFooter: var(--gray300);--links: var(--gray100);--linksVisited: var(--gray100);--linksDecoration: var(--gray450);--iconAction: var(--coldGray-lightened-10);--iconActionHover: var(--white);--blockquoteBackground: var(--coldGray-opacity-10);--blockquoteBorder: var(--coldGrayDim);--tableHeadBorder: var(--gray600);--tableBodyBorder: var(--gray700);--warningBackground: hsla( 33, 30%, 60%, 10%);--warningHeadingBackground: hsla( 33, 66%, 35%, 80%);--warningHeading: var(--white);--errorBackground: hsla( 7, 30%, 60%, 10%);--errorHeadingBackground: hsla( 6, 70%, 40%, 80%);--errorHeading: var(--white);--infoBackground: hsla(206, 30%, 60%, 10%);--infoHeadingBackground: hsla(213, 55%, 35%, 80%);--infoHeading: var(--white);--neutralBackground: hsl(210, 30%, 60%, 10%);--neutralHeadingBackground: var(--gray600);--neutralHeading: var(--white);--tipBackground: hsla(142, 30%, 60%, 10%);--tipHeadingBackground: hsla(134, 45%, 30%, 80%);--tipHeading: var(--white);--fnSpecAttr: var(--gray400);--fnDeprecated: var(--yellowDark);--blink: var(--gray600);--codeBackground: var(--gray750);--codeBorder: var(--gray600);--codeScrollThumb: var(--gray500);--codeScrollBackground: var(--codeBorder);--admCodeBackground: var(--gray750);--admCodeBorder: var(--gray600);--admCodeColor: var(--gray100);--admInlineCodeColor: var(--gray100);--admInlineCodeBackground: var(--gray750);--admInlineCodeBorder: var(--gray600);--tabBackground: var(--gray900);--tabBorder: var(--gray700);--tabBorderTop: var(--gray700);--tab: var(--white);--tabShadow: var(--black);--bottomActionsBtnBorder: var(--white-opacity-10);--bottomActionsBtnSubheader: var(--mainLight);--modalBackground: var(--gray800);--settingsInput: var(--white);--settingsInputBackground: var(--gray700);--settingsInputBorder: var(--gray700);--settingsSectionBorder: var(--gray700);--quickSwitchInput: var(--gray300);--quickSwitchContour: var(--gray500);--success: var(--green-lightened-10);--sidebarButtonBackground: linear-gradient(180deg, var(--gray900) 20%, var(--gray900-opacity-50) 70%, var(--gray900-opacity-0) 100%);--sidebarAccentMain: var(--gray50);--sidebarBackground: var(--gray800);--sidebarHeader: var(--gray700);--sidebarMuted: var(--gray300);--sidebarHover: var(--white);--sidebarScrollbarThumb: var(--coldGray);--sidebarScrollbarTrack: var(--sidebarBackground);--sidebarSubheadings: var(--gray400);--sidebarItem: var(--gray200);--sidebarInactiveItemMarker: var(--gray600);--sidebarLanguageAccentBar: var(--mainLight);--sidebarActiveItem: var(--mainLightest);--searchBarBorder: var(--gray500);--searchAccentMain: var(--gray300);--searchSearch: var(--gray900);--autocompleteBorder: rgba(28,42,60,.75);--autocompletePreview: var(--gray750);--autocompleteHover: var(--gray700);--autocompleteBackground: var(--gray800);--suggestionBorder: var(--gray600);--autocompleteResults: var(--gray200);--autocompleteResultsBold: var(--gray100);--autocompleteSrollbarThumb: var(--gray600);--autocompleteSrollbarTrack: var(--gray850);--autocompleteLabelBack: var(--gray600);--autocompleteLabelFont: rgba(255, 255, 255, .8)}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}@font-face{font-family:remixicon;src:url(./remixicon-NKANDIL5.woff2) format("woff2");font-display:swap}[class^=ri-],[class*=" ri-"],.remix-icon{font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:root{--icon-arrow-up-s: "\ea78";--icon-arrow-down-s: "\ea4e";--icon-arrow-right-s: "\ea6e";--icon-add: "\ea13";--icon-subtract: "\f1af";--icon-error-warning: "\eca1";--icon-information: "\ee59";--icon-alert: "\ea21";--icon-double-quotes-l: "\ec51";--icon-link-m: "\eeaf";--icon-close-line: "\eb99";--icon-code-s-slash-line: "\ebad";--icon-menu-line: "\ef3e";--icon-search-2-line: "\f0cd";--icon-settings-3-line: "\f0e6";--icon-printer-line: "\f029"}.ri-lg{font-size:1.3333em;line-height:.75em;vertical-align:-.0667em}.ri-settings-3-line:before{content:var(--icon-settings-3-line)}.ri-add-line:before{content:var(--icon-add)}.ri-subtract-line:before{content:var(--icon-subtract)}.ri-arrow-up-s-line:before{content:var(--icon-arrow-up-s)}.ri-arrow-down-s-line:before{content:var(--icon-arrow-down-s)}.ri-arrow-right-s-line:before{content:var(--icon-arrow-right-s)}.ri-search-2-line:before{content:var(--icon-search-2-line)}.ri-menu-line:before{content:var(--icon-menu-line)}.ri-close-line:before{content:var(--icon-close-line)}.ri-link-m:before{content:var(--icon-link-m)}.ri-code-s-slash-line:before{content:var(--icon-code-s-slash-line)}.ri-error-warning-line:before{content:var(--icon-error-warning)}.ri-information-line:before{content:var(--icon-information)}.ri-alert-line:before{content:var(--icon-alert)}.ri-double-quotes-l:before{content:var(--icon-double-quotes-l)}.ri-printer-line:before{content:var(--icon-printer-line)}html,body{box-sizing:border-box;height:100%;width:100%}body{--sidebarWidth: 300px;--sidebarMinWidth: 300px;--sidebarTransitionDuration: .3s;background-color:var(--background);color:var(--textBody);font-size:16px;font-family:var(--sansFontFamily);line-height:1.6875em}*,*:before,*:after{box-sizing:inherit}.body-wrapper{display:flex;height:100%}.sidebar{display:flex;flex-direction:column;width:var(--sidebarWidth);min-width:var(--sidebarMinWidth);height:100%;position:fixed;top:0;left:0;z-index:100;resize:horizontal}.sidebar-button{padding:26px 12px 18px 19px;position:fixed;z-index:200;top:0;left:0;will-change:transform}.sidebar-toggle--animated.sidebar-button{transition:transform var(--sidebarTransitionDuration) ease-in-out}.content{width:calc(100% - var(--sidebarWidth));left:var(--sidebarWidth);height:100%;position:absolute}.content .content-inner{max-width:var(--content-width);min-height:100%;margin:0 auto;padding:0 var(--content-gutter) 10px}.content-inner:focus{outline:none}body:is(.sidebar-opening,.sidebar-opened) .sidebar-button{transform:translate(calc(var(--sidebarWidth) - 100%))}body.sidebar-opening-start .sidebar{left:calc(-1 * var(--sidebarWidth))}body.sidebar-opening-start .content{width:100%;left:0}body.sidebar-opening .sidebar{left:0;transition:left var(--sidebarTransitionDuration) ease-in-out}body.sidebar-opening .content{width:calc(100% - var(--sidebarWidth));left:var(--sidebarWidth);transition:all var(--sidebarTransitionDuration) ease-in-out}body.sidebar-closing .sidebar-button{transform:translate(0)}body.sidebar-closing .sidebar{left:calc(-1 * var(--sidebarWidth));transition:left var(--sidebarTransitionDuration) ease-in-out}body.sidebar-closing .content{width:100%;left:0;transition:all var(--sidebarTransitionDuration) ease-in-out}body.sidebar-closed .sidebar{left:calc(-1 * var(--sidebarWidth));display:none}body.sidebar-closed .content{width:100%;left:0}@media screen and (max-width: 768px){.content,body.sidebar-opening .content{left:0;width:100%}body.sidebar-closed .sidebar-button{position:absolute}}.sidebar{--sidebarFontSize: 16px;--sidebarLineHeight: 20px;font-family:var(--sansFontFamily);font-size:var(--sidebarFontSize);font-weight:300;line-height:var(--sidebarLineHeight);background-color:var(--sidebarBackground);color:var(--sidebarAccentMain);overflow:hidden;scrollbar-color:var(--sidebarScrollbarThumb) var(--sidebarScrollbarTrack)}.non-apple-os .sidebar{font-weight:400}.sidebar ul{list-style:none}.sidebar ul li{margin:0;padding:0 10px}.sidebar a{color:var(--sidebarAccentMain);text-decoration:none;transition:color .3s ease-in-out}.sidebar a:hover{color:var(--sidebarHover)}.sidebar .sidebar-header{background-color:var(--sidebarHeader);width:100%}.sidebar .sidebar-projectInfo{display:flex;justify-content:start;align-items:center;gap:16px;margin:12px 16px 12px 14px;max-width:235px}.sidebar .sidebar-projectImage{align-self:flex-end}.sidebar .sidebar-projectImage img{display:block;max-width:48px;max-height:48px}.sidebar .sidebar-projectName{font-weight:700;font-size:20px;line-height:24px;color:var(--sidebarAccentMain);margin:0;padding:0;max-width:230px;word-wrap:break-word}.sidebar .sidebar-projectVersion{display:block;position:relative;margin:0;padding:0;font-size:var(--sidebarFontSize);line-height:var(--sidebarLineHeight);color:var(--sidebarMuted)}.sidebar .sidebar-projectVersionsDropdown{cursor:pointer;position:relative;margin:0;padding:0 0 0 12px;border:none;-webkit-appearance:none;appearance:none;background-color:transparent;color:var(--sidebarMuted);z-index:2}.sidebar .sidebar-projectVersionsDropdown option{color:initial}.sidebar .sidebar-projectVersionsDropdownCaret{position:absolute;left:0;top:2px;z-index:1;font-size:8px;color:var(--sidebarMuted)}.sidebar .sidebar-projectVersionsDropdown::-ms-expand{display:none}.sidebar .sidebar-listNav{display:flex;margin:0;padding:4px 4px 0}.sidebar .sidebar-listNav :is(li,li button){text-transform:uppercase;letter-spacing:.02em;font-size:14px;color:var(--sidebarMuted)}.sidebar .sidebar-listNav li{display:inline-block;padding:0}.sidebar .sidebar-listNav li button{background:none;border:0;border-radius:0;-webkit-appearance:none;text-align:inherit;color:inherit;font-weight:inherit;cursor:pointer;display:inline-block;line-height:27px;padding:4px 10px 2px;transition:all .15s}.sidebar .sidebar-listNav li:is(.selected) button{background-color:var(--sidebarBackground);border-top:var(--navTabBorderWidth) solid var(--sidebarLanguageAccentBar)}.sidebar .sidebar-listNav li:not(.selected) button{border-top:var(--navTabBorderWidth) solid var(--sidebarHeader)}.sidebar .sidebar-listNav li:is(:hover):not(.selected) button{background-color:var(--gray600);border-top:var(--navTabBorderWidth) solid var(--gray400);color:var(--sidebarAccentMain);transition:all .15s}.sidebar .sidebar-tabpanel{flex:1 1 .01%;overflow-y:auto;overscroll-behavior:contain;position:relative;-webkit-overflow-scrolling:touch;margin-top:12px}.sidebar .full-list{margin:0;padding:0 0 20px;position:relative}.sidebar .full-list :is(li,a){overflow:hidden;text-overflow:ellipsis}.sidebar .full-list li{padding:0;margin-right:30px;line-height:27px;white-space:nowrap}.sidebar .full-list li.docs{margin-right:0}.sidebar .full-list li.open>ul{display:block;margin-left:10px}.sidebar .full-list li a.expand+button.icon-expand{appearance:none;background-color:transparent;border:0;padding:0;cursor:pointer;color:inherit;margin-right:10px;font-size:calc(1.2 * var(--sidebarFontSize));line-height:var(--sidebarLineHeight);position:absolute;display:flex;right:0;transform:translateY(calc(-100% - 4px))}.sidebar .full-list li a+button.icon-expand:after{font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sidebar .full-list li a.expand+button.icon-expand:after{content:var(--icon-arrow-down-s)}.sidebar .full-list li.open>a.expand+button.icon-expand:after{content:var(--icon-arrow-up-s)}.sidebar .full-list li.docs>a+button.icon-expand{margin-right:12px;font-size:var(--sidebarFontSize);line-height:var(--sidebarFontSize);transform:translateY(calc(-100% - 5px))}.sidebar .full-list li.docs>a+button.icon-expand:after{content:var(--icon-add)}.sidebar .full-list li.docs.open>a+button.icon-expand:after{content:var(--icon-subtract)}.sidebar .full-list li.nesting-context{font-weight:700;font-size:.9em;line-height:1.8em;color:var(--sidebarSubheadings);padding-left:15px}.sidebar .full-list li.group{text-transform:uppercase;font-weight:700;font-size:.8em;margin:1.5em 0 0;line-height:1.8em;color:var(--sidebarSubheadings);padding-left:15px}.sidebar .full-list li a{padding:3px 0 3px 15px;color:var(--sidebarItem)}.sidebar .full-list>li>a{display:block;width:100%;height:27px;line-height:var(--sidebarLineHeight)}.sidebar .full-list li .current-section>a{color:var(--sidebarActiveItem)}.sidebar .full-list li .current-section>a+button.icon-expand{color:var(--sidebarActiveItem)}.sidebar .full-list>li>a:hover{border-left:3px solid var(--sidebarLanguageAccentBar);padding-left:12px}.sidebar .full-list>li.current-page>a{color:var(--sidebarActiveItem);border-left:3px solid var(--sidebarLanguageAccentBar);padding-left:12px}.sidebar .full-list>li.current-page>a:after,.sidebar .full-list>li.current-page{color:var(--sidebarActiveItem)}.sidebar .full-list>li:last-child{margin-bottom:30px}.sidebar .full-list>li.group:first-child{margin-top:0}.sidebar .full-list ul{display:none;margin:10px 0 10px 15px;padding:0}.sidebar .full-list ul li{font-weight:300;line-height:var(--sidebarFontSize);padding:0 8px;margin-right:0;color:var(--sidebarAccentMain)}.non-apple-os .sidebar .full-list ul li{font-weight:400}.sidebar .full-list ul li.current-hash{color:var(--sidebarActiveItem)}.sidebar .full-list ul li.current-hash>a{color:var(--sidebarActiveItem)}.sidebar .full-list ul li.current-hash>a:before,.sidebar .full-list>li>ul>li>a:hover:before{content:"\2022";position:absolute;margin-left:-15px;color:var(--sidebarActiveItem)}.sidebar .full-list ul li a{padding-left:15px;display:block;width:100%;height:24px}.sidebar .full-list ul li ul{display:none;margin:9px 0 9px 20px}.sidebar .full-list ul li ul li{margin-right:0;height:20px;color:var(--sidebarAccentMain)}.sidebar .full-list ul li ul li a{border-left:1px solid var(--sidebarInactiveItemMarker);padding:0 10px;height:20px}.sidebar .full-list ul li ul li.current-hash>a:before{content:none}.sidebar .full-list ul li ul li>a:hover{border-color:var(--sidebarLanguageAccentBar)}.sidebar .full-list ul li ul li.current-hash>a{color:var(--sidebarActiveItem);border-color:var(--sidebarLanguageAccentBar)}.sidebar .full-list ul li ul li.current-hash>a{color:var(--sidebarActiveItem);margin-left:0}.sidebar ::-webkit-scrollbar{width:14px}::-webkit-scrollbar-track{background-color:var(--sidebarBackground)}.sidebar ::-webkit-scrollbar-thumb{background-color:var(--sidebarScrollbarThumb);border-radius:10px;border:3px solid var(--sidebarBackground)}.sidebar-button{cursor:pointer;background-color:transparent;border:none;font-size:var(--sidebarFontSize)}.sidebar-button:hover{color:var(--sidebarHover)}.sidebar-button{color:var(--sidebarAccentMain)}.sidebar-closed .sidebar-button{color:var(--contrast)}@media screen and (max-height: 500px){.sidebar{overflow-y:auto}.sidebar .full-list{overflow:visible}}.top-search{background-color:var(--background);top:0;z-index:99;position:relative;width:100%;padding:10px 0}.search-settings{display:flex;column-gap:12px;align-items:center;width:100%;position:relative}.search-bar{border:1px solid var(--searchBarBorder);border-radius:8px;height:48px;position:relative;width:100%}.top-search .search-bar .search-input{background-color:var(--searchSearch);border:none;border-radius:8px;color:var(--searchAccentMain);position:relative;height:46px;padding:8px 35px 8px 43px;width:100%}.top-search .search-bar .search-input::placeholder{color:var(--searchAccentMain);opacity:.5}.top-search .search-bar .search-input:focus{border:1px solid var(--searchBarFocusColor);border-radius:7px;position:relative;box-shadow:0 4px 20px 0 var(--searchBarBorderColor) inset}.top-search .search-bar .search-label{position:relative}.top-search .search-bar .search-button{font-size:14px;color:var(--searchAccentMain);background-color:transparent;border:none;cursor:pointer;left:11px;opacity:.5;padding:5px 1px 5px 5px;position:absolute;top:60%;transform:translateY(-60%);z-index:99}.top-search .search-bar.selected .search-button,.top-search .search-bar .search-button:hover,.top-search .search-bar .search-button:focus{color:var(--top-searchLanguageAccentBar);opacity:1}.top-search .search-bar .search-close-button{font-size:16px;color:var(--searchAccentMain);background-color:transparent;border:none;cursor:pointer;right:11px;margin:0;opacity:.5;padding:5px 1px 5px 0;position:absolute;transform:scaleY(0);top:calc(50% - 13px);transition:.15s transform ease-out;z-index:99}.top-search .search-bar .search-close-button:hover{opacity:.7}.top-search .search-settings button.icon-settings{display:flex;align-items:center;justify-content:flex-end}.top-search .search-settings .icon-settings{font-size:20px;float:right;color:var(--iconAction);text-decoration:none;border:none;transition:color .3s ease-in-out;background-color:transparent;cursor:pointer;padding:0}.top-search .search-settings .icon-settings:hover{color:var(--iconActionHover)}.top-search .search-settings .icon-settings:visited{color:var(--iconAction)}@media screen and (max-width: 768px){.top-search{padding-left:calc(var(--content-gutter) + 36px);padding-right:var(--content-gutter);margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter));width:calc(2 * var(--content-gutter) + 100%)}.search-settings{width:100%;box-sizing:border-box}}body.search-focused .search-bar .search-close-button{transform:scaleY(1);transition:transform .15s ease-out .15s}@media screen and (hover: hover){body.search-focused .top-search{position:sticky!important}body.search-focused.sidebar-closed .sidebar-button{position:fixed!important}}@media screen and (hover: none){body.scroll-sticky .top-search{position:sticky!important}body.scroll-sticky.sidebar-closed .sidebar-button{position:fixed!important}}*:focus,button:focus,[type=button]:focus,[type=reset]:focus,[type=submit]:focus{outline:2px solid var(--main);outline-offset:-2px}*:focus:not(:focus-visible),button:focus:not(:focus-visible),[type=button]:focus:not(:focus-visible),[type=reset]:focus:not(:focus-visible),[type=submit]:focus:not(:focus-visible){outline:0}input[type=text],input[type=number],input[type=date],input[type=datetime],input[type=datetime-local],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=time],input[type=url],input[type=week],textarea{outline:0}.content-inner{font-family:var(--defaultFontFamily);font-size:1em;line-height:1.6875em;position:relative;background-color:var(--background);color:var(--textBody)}.content-inner :is(h1,h2,h3,h4,h5,h6){font-family:var(--sansFontFamily);font-weight:700;line-height:1.5em;word-wrap:break-word;color:var(--textHeaders)}.content-inner h1{font-size:2em;margin:.5em 0}.content-inner h1.signature{margin:0}.content-inner h1.section-heading{margin:1.5em 0 .5em}.content-inner h1 small{font-weight:300}.content-inner h1 .icon-action{font-size:1.2rem;font-weight:400}.content-inner h2{font-size:1.6em;margin:1em 0 .5em;font-weight:700}.content-inner h3{font-size:1.375em;margin:1em 0 .5em;font-weight:700}.content-inner li+li{margin-top:.25em}.content-inner :is(a,.a-main){color:var(--links);text-decoration:underline;text-decoration-color:var(--linksDecoration);text-decoration-skip-ink:auto}.content-inner :is(a:visited,.a-main:visited){color:var(--linksVisited)}.content-inner .icon-action{float:right;color:var(--iconAction);text-decoration:none;border:none;transition:color .3s ease-in-out;background-color:transparent;cursor:pointer}.content-inner button.icon-action{margin-top:12px}.content-inner .icon-action:hover{color:var(--iconActionHover)}.content-inner .icon-action:visited{color:var(--iconAction)}.content-inner .livebook-badge-container{display:flex}.content-inner a.livebook-badge{display:inline-flex}.content-inner .note{color:var(--iconAction);margin-right:5px;font-size:14px;font-weight:400}.content-inner blockquote{border-left:3px solid var(--blockquoteBorder);position:relative;margin:1.5625em 0;padding:0 1.2rem;overflow:auto;background-color:var(--blockquoteBackground);border-radius:var(--borderRadius)}.content-inner blockquote p:last-child{padding-bottom:1em;margin-bottom:0}.content-inner table{margin:2em 0;border-collapse:collapse}.content-inner th{text-align:left;font-family:var(--sansFontFamily);text-transform:uppercase;font-weight:700;padding-bottom:.5em}.content-inner thead tr{border-bottom:1px solid var(--tableHeadBorder)}.content-inner tbody tr{border-bottom:1px solid var(--tableBodyBorder)}.content-inner tbody tr:last-child{border-bottom:none}.content-inner tr{vertical-align:bottom;height:2.5em}.content-inner :is(td,th){padding:.25em .25em .25em 1em;line-height:2em;vertical-align:top}.content-inner .section-heading{--icon-size: 16px;--icon-spacing: 5px;display:grid;grid-template:1fr / 1fr}.content-inner .section-heading>:is(.hover-link,.text){grid-row:1;grid-column:1}.content-inner .section-heading .hover-link{text-decoration:none}.content-inner .section-heading i{font-size:var(--icon-size);margin-top:.1em;margin-left:calc(-1 * (var(--icon-size) + var(--icon-spacing)));padding-right:var(--icon-spacing);opacity:0}@media screen and (max-width: 768px){.content-inner .section-heading i{margin-left:calc(-1 * (var(--icon-size)))}}.content-inner blockquote .section-heading i{display:none}.content-inner .section-heading .hover-link:is(:hover,:focus) i{opacity:1}.content-inner .section-heading .text{pointer-events:none}.content-inner .section-heading .text a{pointer-events:all}.content-inner .app-vsn{display:none!important;font-size:.6em;line-height:1.5em}@media screen and (max-width: 768px){.content-inner .app-vsn{display:block!important}}.content-inner img{max-width:100%}.content-inner strong>code{font-weight:700}.content-inner code{font-family:var(--monoFontFamily);font-style:normal;line-height:24px;font-weight:400}@media screen and (max-width: 768px){.content-inner :is(ol,ul){padding-left:calc(1.5 * var(--content-gutter))}}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip){border-radius:10px;border-left:0}.content-inner blockquote.warning{background-color:var(--warningBackground)}.content-inner blockquote.error{background-color:var(--errorBackground)}.content-inner blockquote.info{background-color:var(--infoBackground)}.content-inner blockquote.neutral{background-color:var(--neutralBackground)}.content-inner blockquote.tip{background-color:var(--tipBackground)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip){color:var(--contrast);margin:0 -1.2rem;padding:.7rem 1.2rem .7rem 3.3rem;font-weight:700;font-style:normal}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip):before{color:var(--contrast);position:absolute;left:1rem;font-size:1.8rem;font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.content-inner blockquote :is(h3,h4).warning{background-color:var(--warningHeadingBackground);color:var(--warningHeading)}.content-inner blockquote :is(h3,h4).warning:before{content:var(--icon-error-warning);color:var(--warningHeading)}.content-inner blockquote :is(h3,h4).error{background-color:var(--errorHeadingBackground);color:var(--errorHeading)}.content-inner blockquote :is(h3,h4).error:before{content:var(--icon-error-warning);color:var(--errorHeading)}.content-inner blockquote :is(h3,h4).info{background-color:var(--infoHeadingBackground);color:var(--infoHeading)}.content-inner blockquote :is(h3,h4).info:before{content:var(--icon-information);color:var(--infoHeading)}.content-inner blockquote :is(h3,h4).neutral{background-color:var(--neutralHeadingBackground);color:var(--neutralHeading)}.content-inner blockquote :is(h3,h4).neutral:before{content:var(--icon-double-quotes-l);color:var(--neutralHeading)}.content-inner blockquote :is(h3,h4).tip{background-color:var(--tipHeadingBackground);color:var(--tipHeading)}.content-inner blockquote :is(h3,h4).tip:before{content:var(--icon-information);color:var(--tipHeading)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip) code{margin:0 .5ch}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip) code{background-color:var(--admInlineCodeBackground);border:1px solid var(--admInlineCodeBorder);color:var(--admInlineCodeColor)}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip) pre code{background-color:var(--admCodeBackground);border:1px solid var(--admCodeBorder);color:var(--admCodeColor)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip) :is(a,a:visited){color:inherit;text-decoration-color:currentColor}@media screen and (max-width: 768px){.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip){margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter));padding-left:var(--content-gutter);padding-right:var(--content-gutter);border-radius:0}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip){margin:0 calc(-1 * var(--content-gutter))}}.content-inner .summary h2{font-weight:700}.content-inner .summary h2 a{text-decoration:none;border:none}.content-inner .summary span.deprecated{color:var(--darkDeprecated);font-weight:400;font-style:italic}.content-inner .summary .summary-row .summary-signature{font-family:var(--monoFontFamily);font-weight:700}.content-inner .summary .summary-row .summary-signature a{text-decoration:none;border:none}.content-inner .summary .summary-row .summary-synopsis{font-family:var(--defaultFontFamily);font-style:italic;padding:0 1.2em;margin:0 0 .5em}.content-inner .summary .summary-row .summary-synopsis p{margin:0;padding:0}.content-inner :is(a.no-underline,pre a){color:var(--linksNoUnderline);text-shadow:none;text-decoration:none;background-image:none}.content-inner :is(a.no-underline,pre a):is(:visited,:active,:focus,:hover){color:var(--linksNoUnderlineVisited)}.content-inner code{background-color:var(--codeBackground);vertical-align:baseline;border-radius:2px;padding:.1em .2em;border:1px solid var(--codeBorder);text-transform:none}.content-inner pre{margin:var(--baseLineHeight) 0}.content-inner pre code{display:block;overflow-x:auto;white-space:inherit;padding:.5em 1em}.content-inner pre code::-webkit-scrollbar{width:.4rem;height:.4rem}.content-inner pre code::-webkit-scrollbar-thumb{border-radius:.25rem;background-color:var(--codeScrollThumb)}.content-inner pre code::-webkit-scrollbar-track{background-color:var(--codeScrollBackground)}.content-inner pre code::-webkit-scrollbar-corner{background-color:var(--codeScrollBackground)}.content-inner pre code.output{margin:0 12px;max-height:400px;overflow:auto}.content-inner pre code.output+.copy-button{margin-right:12px}.content-inner pre code.output:before{content:"Output";display:block;position:absolute;top:-16px;left:12px;padding:2px 4px;font-size:12px;font-family:var(--monoFontFamily);line-height:1;color:var(--textHeaders);background-color:var(--codeBackground);border:1px solid var(--codeBorder);border-bottom:0;border-radius:2px}@media screen and (max-width: 768px){.content-inner>pre,.content-inner section>pre{margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter))}.content-inner>pre code,.content-inner section>pre code{padding-left:var(--content-gutter);padding-right:var(--content-gutter);border-radius:0;border-left-width:0;border-right-width:0}}@keyframes blink-background{0%{background-color:var(--textDetailBackground)}to{background-color:var(--blink)}}.content-inner .detail:target .detail-header{animation-duration:.55s;animation-name:blink-background;animation-iteration-count:1;animation-timing-function:ease-in-out}.content-inner .detail-header{margin:2 0 1em;padding:.5em 1em;background-color:var(--textDetailBackground);border-left:3px solid var(--textDetailAccent);font-size:1em;font-family:var(--monoFontFamily);position:relative}.content-inner .detail-header .note{float:right}.content-inner .detail-header .signature{display:inline-block;font-family:var(--monoFontFamily);font-size:1rem;font-weight:700}.content-inner .detail-header:hover a.detail-link,.content-inner .detail-header a.detail-link:focus{opacity:1;text-decoration:none}.content-inner .detail-header a.detail-link{transition:opacity .3s ease-in-out;position:absolute;top:0;left:0;display:block;opacity:0;padding:.6em;line-height:1.5em;margin-left:-2.5em;text-decoration:none;border:none}@media screen and (max-width: 768px){.content-inner .detail-header a.detail-link{margin-left:-30px}}.content-inner .specs pre{font-family:var(--monoFontFamily);font-size:.9em;font-style:normal;line-height:24px;white-space:pre-wrap;margin:0;padding:0}.content-inner .specs .attribute{color:var(--fnSpecAttr)}.content-inner .docstring{margin:1.2em 0 3em 1.2em}@media screen and (max-width: 768px){.content-inner .docstring{margin-left:0}}.content-inner .docstring:is(h2,h3,h4,h5){font-weight:700}.content-inner .docstring h2{font-size:1.1em}.content-inner .docstring h3{font-size:1em}.content-inner .docstring h4{font-size:.95em}.content-inner .docstring h5{font-size:.9em}.content-inner div.deprecated{display:block;padding:9px 15px;background-color:var(--fnDeprecated)}.content-inner .footer{margin:4em auto 1em;text-align:center;font-style:italic;font-size:14px}.content-inner .footer,.content-inner .footer :is(a,.footer-button){color:var(--textFooter)}.content-inner .footer .line{display:inline-block}.content-inner .footer .footer-button{background-color:transparent;border:0;cursor:pointer;font-style:italic;padding:0 4px}.content-inner .footer .footer-hex-package{margin-right:4px}.content-inner .bottom-actions{display:flex;justify-content:space-between;margin-top:4em}.content-inner .bottom-actions .bottom-actions-button{display:flex;text-decoration:none;flex-direction:column;border-radius:var(--borderRadius);border:1px solid var(--bottomActionsBtnBorder);padding:8px 16px;min-width:150px}.content-inner .bottom-actions .bottom-actions-button .subheader{font-size:.8em;color:var(--bottomActionsBtnSubheader);white-space:nowrap}.content-inner .bottom-actions .bottom-actions-button[rel=prev] .subheader{text-align:right}@media screen and (max-width: 768px){.content-inner .bottom-actions{flex-direction:column-reverse}.content-inner .bottom-actions .bottom-actions-item:not(:first-child){margin-bottom:16px}}.page-cheatmd .content-inner{--horizontal-space: 1.5em;--vertical-space: 1em}@media (max-width: 600px){.page-cheatmd .content-inner{--horizontal-space: 1em;--vertical-space: .75em}}.page-cheatmd .content-inner{max-width:1200px}.page-cheatmd .content-inner h1{margin-bottom:var(--vertical-space)}.page-cheatmd .content-inner h2{margin:var(--vertical-space) 0;column-span:all;color:var(--gray700);font-weight:500}.page-cheatmd.dark .content-inner h2{color:var(--gray200)}.page-cheatmd .content-inner h3{color:var(--main);text-decoration-color:var(--main);margin:0 0 1em;font-weight:400}.page-cheatmd .content-inner h3 :is(a,a:visited){color:var(--main);text-decoration-color:var(--main)}.page-cheatmd .content-inner section.h3{min-width:300px;margin:0;padding:0 0 calc(var(--vertical-space) * 2) 0;break-inside:avoid}.page-cheatmd .content-inner h3 .text{overflow:hidden}.page-cheatmd .content-inner h3 .text:after{content:"";margin-left:calc(var(--horizontal-space) / 2);vertical-align:baseline;display:inline-block;width:100%;height:1px;margin-right:-100%;margin-bottom:5px;background-color:var(--codeBorder)}.page-cheatmd .content-inner h4{display:block;margin:0;padding:.25em var(--horizontal-space);font-weight:400;background:var(--gray100);color:#567;border:solid 1px 1px 0 1px var(--gray100)}.page-cheatmd.dark .content-inner h4{background:#192f50;color:var(--textBody);border:1px solid #192f50;border-bottom:0}.page-cheatmd .content-inner .h2 p{margin:0;display:block;background:var(--gray50);padding:var(--vertical-space) var(--horizontal-space)}.page-cheatmd.dark .content-inner .h2 p{background:var(--gray700)}.page-cheatmd .content-inner .h2 p>code{color:#eb5757;border-radius:var(--borderRadius);padding:.2em .4em}.page-cheatmd .content-inner pre code{padding:var(--vertical-space) var(--horizontal-space)}.page-cheatmd .content-inner pre code::-webkit-scrollbar{width:.4rem;height:.6rem}.page-cheatmd .content-inner .h2 pre{margin:0}.page-cheatmd .content-inner .h2 pre+pre{margin-top:-1px}.page-cheatmd .content-inner pre.wrap{white-space:break-spaces}@media screen and (max-width: 768px){.page-cheatmd .content-inner pre code{border-left-width:1px!important;border-right-width:1px!important}}.page-cheatmd .content-inner .h2 table{display:table;box-sizing:border-box;width:100%;border-collapse:collapse;margin:0}.page-cheatmd .content-inner .h2 th{padding:var(--vertical-space) var(--horizontal-space);line-height:inherit;margin-bottom:-1px;vertical-align:middle;border-bottom:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 td{padding:var(--vertical-space) var(--horizontal-space);border:0;border-bottom:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 tr:first-child{border-top:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 td code{color:#eb5757;border-radius:var(--borderRadius);padding:.2em .4em}.page-cheatmd .content-inner .h2 thead{background-color:var(--gray50)}.page-cheatmd.dark .content-inner .h2 thead{background-color:var(--gray700)}.page-cheatmd .content-inner .h2 tbody{background-color:var(--codeBackground)}.page-cheatmd .content-inner .h2 :is(ul,ol){margin:0;padding:0}.page-cheatmd .content-inner .h2 li{list-style-position:inside;padding:.5em var(--horizontal-space);line-height:2em;vertical-align:middle;background-color:var(--codeBackground);border-bottom:1px solid var(--codeBorder);margin-top:0}.page-cheatmd .content-inner .h2 :is(ul,ol)+pre code{border-top:0}.page-cheatmd .content-inner .h2 li>code{color:#eb5757;border-radius:var(--borderRadius);padding:.2em .4em}.page-cheatmd .content-inner section.width-50{display:block;width:50%;margin:0}.page-cheatmd .content-inner section.width-50>section>table{width:100%}.page-cheatmd .content-inner section:is(.col-2,.col-2-left,.col-3){column-gap:40px}.page-cheatmd .content-inner section.col-2{column-count:2;height:auto}.page-cheatmd .content-inner section.col-2-left{display:grid;grid-template-columns:calc(100% / 3) auto}.page-cheatmd .content-inner section.col-2-left>h2{grid-column-end:span 2}.page-cheatmd .content-inner section.col-3{column-count:3;height:auto}.page-cheatmd .content-inner section.list-4>ul{display:flex;flex-wrap:wrap}.page-cheatmd .content-inner section.list-4>ul>li{flex:0 0 25%}.page-cheatmd .content-inner section.list-6>ul{display:flex;flex-wrap:wrap}.page-cheatmd .content-inner section.list-6>ul>li{flex:0 0 calc(100% / 6)}@media screen and (max-width: 1400px){.page-cheatmd .content-inner section.col-3{column-count:2}.page-cheatmd .content-inner section.col-2-left{display:flex;flex-direction:column}}@media screen and (max-width: 1200px){.page-cheatmd .content-inner section:is(.col-2,.col-3){display:flex;flex-direction:column}.page-cheatmd .content-inner section.list-6>ul>li{flex:0 0 25%}}@media screen and (max-width: 1000px){.page-cheatmd .content-inner section:is(.list-4,.list-6)>ul>li{flex:0 0 calc(100% / 3)}}@media screen and (max-width: 600px){.page-cheatmd .content-inner section:is(.list-4,.list-6)>ul>li{flex:0 0 50%}.page-cheatmd .content-inner section.width-50{width:100%}}#search{min-height:200px;position:relative}#search .loading{height:64px;width:64px;position:absolute;top:50%;left:calc(50% - 32px)}#search .loading div{box-sizing:border-box;display:block;position:absolute;width:51px;height:51px;margin:6px;border:6px solid var(--coldGray);border-radius:50%;animation:loading 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:var(--coldGray) transparent transparent transparent}#search .loading div:nth-child(1){animation-delay:-.45s}#search .loading div:nth-child(2){animation-delay:-.3s}#search .loading div:nth-child(3){animation-delay:-.15s}@keyframes loading{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#search .result{margin:2em 0 2.5em}#search .result p{margin:0}#search .result-id{font-size:1.4em;margin:0}#search .result-id a{text-decoration:none;transition:color .1s ease-in-out;color:var(--links)}#search .result-id a:is(:visited,:active,:focus){color:var(--linksVisited)}#search .result-id a:hover{color:var(--main)}#search :is(.result-id,.result-elem) em{font-style:normal;color:var(--main)}#search .result-id small{font-weight:400}@keyframes keyboard-shortcuts-show{0%{opacity:0}to{opacity:1}}.modal{animation-duration:.15s;animation-name:keyboard-shortcuts-show;animation-iteration-count:1;animation-timing-function:ease-in-out;display:none;background-color:#000000bf;position:fixed;inset:0;z-index:300}.modal.shown{display:block}.modal .modal-contents{margin:75px auto 0;max-width:500px;background-color:var(--modalBackground);border-radius:var(--borderRadius);box-shadow:2px 2px 8px #0003;padding:25px 35px 35px}@media screen and (max-width: 768px){.modal .modal-contents{padding:20px}}.modal .modal-header{display:flex;align-items:start}.modal .modal-title{display:inline-block;flex-grow:1;font-size:1.2rem;font-weight:700;margin-bottom:20px}.modal .modal-title button{border:none;background-color:transparent;color:var(--textHeaders);font-weight:700;margin-right:30px;padding-left:0;text-align:left;transition:color .15s}.modal .modal-title button:hover{color:var(--main);cursor:pointer}.modal .modal-title button.active{color:var(--main)}.modal .modal-close{cursor:pointer;display:block;font-size:1.5rem;margin:-8px -8px 0 0;padding:8px;opacity:.7;background-color:transparent;color:var(--textHeaders);border:none;transition:opacity .15s}.modal .modal-close:hover{opacity:1}#keyboard-shortcuts-content dl.shortcut-row{display:flex;align-items:center;justify-content:space-between;margin:0;padding:6px 0 8px;border-bottom:1px solid var(--settingsSectionBorder)}#keyboard-shortcuts-content dl.shortcut-row:last-of-type{border-bottom-style:none}#keyboard-shortcuts-content dl.shortcut-row:first-child{padding-top:0}#keyboard-shortcuts-content :is(.shortcut-keys,.shortcut-description){display:inline-block}#keyboard-shortcuts-content kbd>kbd{background-color:var(--settingsInputBorder);color:var(--contrast);border-radius:var(--borderRadius);font-family:inherit;font-weight:700;display:inline-block;line-height:1;padding:4px 7px 6px;min-width:26px;text-align:center}#keyboard-shortcuts-content :is(.shortcut-keys,.shortcut-description){margin:0}#quick-switch-modal-body{width:100%;position:relative}#quick-switch-modal-body .ri-search-2-line{position:absolute;left:0;top:0;padding:4px 10px;color:var(--quickSwitchContour);font-weight:700}#quick-switch-modal-body #quick-switch-input{width:100%;padding:8px 6px 8px 38px;border:none;color:var(--quickSwitchInput);background-color:transparent;border-bottom:1px solid var(--quickSwitchContour);box-sizing:border-box;transition:all .12s ease-out}#quick-switch-modal-body #quick-switch-results{margin:0}#quick-switch-modal-body .quick-switch-result{padding:2px 5px;border-bottom:1px dotted var(--quickSwitchContour);transition:all .12s ease-out}#quick-switch-modal-body .quick-switch-result:last-child{border-bottom:none}#quick-switch-modal-body .quick-switch-result:hover{cursor:pointer}#quick-switch-modal-body .quick-switch-result:is(:hover,.selected){border-left:4px solid var(--main);background-color:var(--codeBackground)}.autocomplete{display:none;position:absolute;width:calc(100% - 32px);top:55px}.autocomplete .triangle{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-bottom:12px solid var(--autocompleteBackground);position:absolute;top:8px;left:26px;transform:translate(-50%);z-index:100;background-color:transparent}.autocomplete-preview{width:100%;margin:0;height:100%;line-height:20px;background-color:var(--background);font-family:var(--sansFontFamily);border:4px solid var(--autocompleteBorder);padding:12px 16px}.autocomplete-preview div,.autocomplete-preview span{display:none}.autocomplete-preview.loading div{float:left;display:block;border:5px solid var(--autocompleteBorder);border-radius:50%;border-top:5px solid var(--textDetailAccent);width:20px;height:20px;animation:spinner 4s linear infinite}.autocomplete-preview.loading span{color:var(--autocompleteResults);display:inline;margin-left:6px}.autocomplete-preview.loading span:after{color:var(--autocompleteResults);content:"Loading"}@keyframes spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.autocomplete-preview.loading iframe{height:0}.autocomplete-preview iframe{width:100%;height:100%;border:0}.autocomplete-results{list-style:none;margin:0;padding:15px 20px;display:flex;justify-content:space-between;color:var(--autocompleteResults);font-family:var(--sansFontFamily);font-weight:300;font-size:.9rem}.autocomplete-results .bold{color:var(--autocompleteResultsBold);font-weight:400}.autocomplete.shown{display:block}.autocomplete-container{position:absolute;top:15px;width:100%;z-index:200}.autocomplete-suggestions{background-color:var(--autocompleteBackground);border-radius:8px;box-shadow:0 15px 99px 0 var(--autocompleteBorder);overflow-y:auto;max-height:450px;white-space:normal;overflow-x:hidden;overscroll-behavior-y:contain}.autocomplete-suggestions.previewing:has(.selected){max-height:80vh}.autocomplete-suggestions.previewing:has(.selected) .autocomplete-suggestion:not(.selected){display:none}.autocomplete-suggestions.previewing:not(:has(.selected)) .autocomplete-preview{display:none}.autocomplete-suggestions:not(.previewing) .autocomplete-preview{display:none}.autocomplete-suggestion{color:inherit;display:block;padding:12px 20px;text-decoration:none;transition:background-color .3s ease-in-out;border-top:1px solid var(--suggestionBorder);font-size:.9rem}.autocomplete-suggestion:hover,.autocomplete-suggestion.selected{background-color:var(--autocompleteHover)}.autocomplete-suggestion:not(.selected) .autocomplete-preview-indicator{display:none}.autocomplete-preview-indicator{float:right}.autocomplete-preview-indicator button{color:var(--iconAction);display:flex;align-items:center;text-decoration:none;border:1px solid var(--suggestionBorder);border-radius:8px;transition:color .3s ease-in-out;background-color:var(--autocompletePreview);cursor:pointer;padding:4px 8px;font-size:14px}.autocomplete-preview-indicator button:hover{color:var(--iconActionHover);background-color:var(--autocompleteHover)}.autocomplete-preview-indicator button i{margin-right:4px}.autocomplete-suggestions.previewing .autocomplete-preview-indicator-closed{display:none}.autocomplete-suggestions:not(.previewing) .autocomplete-preview-indicator-open{display:none}.autocomplete-suggestion:hover:not(.selected) .autocomplete-preview-indicator-closed{display:block}.autocomplete-suggestion em{font-style:normal;font-weight:700}.autocomplete-suggestion .description{opacity:.6;padding-top:3px}.autocomplete-suggestion .label{background-color:var(--autocompleteLabelBack);opacity:.6;color:var(--autocompleteLabelFont);padding:4px 8px;border-radius:4px;margin-left:5px;text-transform:uppercase;font-family:var(--sansFontFamily);font-size:.7rem}.autocomplete-suggestion .header{margin-right:5px}.autocomplete-suggestion .title,.autocomplete-suggestion .description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.autocomplete-suggestions a{text-decoration:none!important}.autocomplete-suggestions::-webkit-scrollbar{width:5px;border-radius:7px;flex-shrink:0}.autocomplete-suggestions::-webkit-scrollbar-thumb{background-color:var(--autocompleteSrollbarThumb);border-radius:7px}.autocomplete-suggestions::-webkit-scrollbar-track{background-color:var(--autocompleteSrollbarTrack)}@media screen and (max-width: 1023px){.autocomplete-results .press-return{display:none}}.tooltip{box-shadow:0 0 10px var(--black-opacity-10);max-height:300px;max-width:500px;padding:0;position:absolute;pointer-events:none;margin:0;z-index:99;top:0;left:0;visibility:hidden;transform:translateY(20px);opacity:0;transition:.2s visibility ease-out,.2s transform ease-out,.2s opacity ease-out}.tooltip.tooltip-shown{visibility:visible;transform:translateY(0);opacity:1}.tooltip .tooltip-body{border:1px solid var(--codeBorder)}.tooltip .tooltip-body .signature{min-width:320px;width:100%}.tooltip .tooltip-body .detail-header{border-left:0;margin-bottom:0;margin-top:0}.tooltip .tooltip-body .docstring{background-color:var(--background);padding:1.2em;margin:0;width:498px}.tooltip .tooltip-body .docstring-plain{max-width:498px;width:auto}.tooltip .tooltip-body .version-info{float:right;line-height:1.6rem;font-family:var(--monoFontFamily);font-size:.9rem;font-weight:400;margin-bottom:-6px;opacity:.3;padding-left:.3em}pre{position:relative}pre:hover .copy-button,pre .copy-button:focus{opacity:1}.copy-button{display:flex;opacity:0;position:absolute;top:5px;right:5px;padding:4px;background-color:var(--codeBackground);border:none;cursor:pointer;transition:all .15s;font-family:var(--defaultFontFamily);font-size:14px;line-height:24px;color:currentColor}.copy-button svg{opacity:.5;transition:all .15s}pre .copy-button:hover svg,pre .copy-button:focus-visible svg{opacity:1}.copy-button svg{width:20px}.copy-button.clicked{opacity:1;color:var(--success)}.copy-button.clicked svg{display:none;color:currentColor}#settings-modal-content{margin-top:10px}#settings-modal-content .hidden{display:none}#settings-modal-content .input{box-sizing:border-box;width:80%;padding:8px;font-size:14px;background-color:var(--settingsInputBackground);color:var(--settingsInput);border:1px solid var(--settingsInputBorder);border-radius:8px;transition:border-color .15s}#settings-modal-content .input:focus{border-color:var(--main)}#settings-modal-content .input::placeholder{color:var(--gray400)}#settings-modal-content .switch-button-container{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--settingsSectionBorder);padding:10px 0}#settings-modal-content .switch-button-container:first-of-type{border-top-style:none;padding-top:0}#settings-modal-content .switch-button-container>div>span{font-size:18px}#settings-modal-content .switch-button-container>div>p{font-size:14px;font-weight:300;line-height:1.4;margin:0;padding-bottom:6px;padding-right:10px}#settings-modal-content .switch-button{position:relative;display:inline-block;flex-shrink:0;width:40px;height:20px;user-select:none;transition:all .15s}#settings-modal-content .switch-button__checkbox{appearance:none;position:absolute;display:block;width:20px;height:20px;border-radius:1000px;background-color:#91a4b7;border:3px solid #e5edf5;cursor:pointer;transition:all .3s}#settings-modal-content .switch-button__bg{display:block;width:100%;height:100%;border-radius:1000px;background-color:#e5edf5;cursor:pointer;transition:all .3s}#settings-modal-content .switch-button__checkbox:checked{background-color:#fff;border-color:var(--main);transform:translate(100%)}#settings-modal-content .switch-button__checkbox:checked+.switch-button__bg{background-color:var(--main)}#settings-modal-content .switch-button__checkbox:focus{outline:0}#settings-modal-content .switch-button__checkbox:focus+.switch-button__bg{outline:2px solid var(--main);outline-offset:2px}#settings-modal-content .switch-button__checkbox:focus:not(:focus-visible)+.switch-button__bg{outline:0}#settings-modal-content .settings-select{cursor:pointer;position:relative;border:none;background-color:transparent;color:var(--textBody)}#settings-modal-content .settings-select option{color:initial}#toast{opacity:0;position:fixed;z-index:1;left:50%;bottom:1rem;min-width:3rem;margin:0 -1.2rem;padding:.7rem 1.2rem;text-align:center;font-weight:700;border-radius:10px;border:1px solid var(--codeBorder);background-color:var(--codeBackground);color:var(--textBody);transition:opacity .4s ease-in-out,transform .3s ease-out;cursor:default}#toast.show{opacity:1;transform:translateY(-.75rem)}@media (prefers-reduced-motion: reduce){#toast{transition:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0;user-select:none}@media print{.body-wrapper{display:block}.sidebar,.sidebar-button,.top-search{display:none}.content{padding-left:0;overflow:visible;left:0;width:100%}.summary-row{break-inside:avoid}#toast{display:none}.content-inner{padding:0}.content-inner .section-heading a.hover-link,.content-inner button.icon-action,.content-inner a.icon-action,.content-inner .bottom-actions{display:none}.footer p:first-of-type{display:none}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip){border:2px solid var(--gray400)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip){color:var(--textHeaders);border-bottom:2px solid var(--gray400)}.content-inner pre code.makeup{border-color:var(--gray400);white-space:break-spaces;break-inside:avoid}.content-inner blockquote code.inline,.content-inner code.inline{border-color:var(--gray400)}}@media print{.page-cheatmd .content-inner *{background-color:transparent!important;border-color:var(--gray400)!important}.page-cheatmd .content-inner{max-width:100%;width:100%;padding:0;font-size:.7em}.page-cheatmd .content-inner section:is(.col-2,.col-2-left,.col-3){column-gap:30px}.page-cheatmd .content-inner section.col-2{column-count:2}.page-cheatmd .content-inner section.col-2-left{display:grid}.page-cheatmd .content-inner section.col-3{column-count:3}.page-cheatmd .content-inner h1{margin-top:0;margin-bottom:.5em}.page-cheatmd .content-inner h2.section-heading{font-weight:700;margin-top:1em;column-span:all}.page-cheatmd .content-inner section.h2{break-inside:avoid}.page-cheatmd .content-inner h3{font-weight:700;color:var(--mainDark)}.page-cheatmd .content-inner h3:after{height:2px;background-color:var(--gray400)}.page-cheatmd .content-inner section.h3{min-width:300px;break-inside:avoid}.page-cheatmd .content-inner h4{padding:.5em 0;border:none;font-weight:700;color:#000}.page-cheatmd .content-inner .h2 p{padding-left:0;padding-right:0;border:none!important}.page-cheatmd .content-inner code{line-height:1.5em}.page-cheatmd .content-inner .h2 table{font-variant-numeric:tabular-nums;break-inside:avoid}.page-cheatmd .content-inner .h2 :is(th,td){vertical-align:top;padding-left:0;padding-right:0}.page-cheatmd .content-inner .h2 thead{border-style:solid none;border-width:1px}.page-cheatmd .content-inner .h2 tr{border-bottom:none}.page-cheatmd .content-inner .h2 th{font-weight:700}.page-cheatmd .content-inner .h2 li{padding-left:0;padding-right:0;vertical-align:middle;border-bottom:none}.page-cheatmd .content-inner pre:hover button.copy-button,.page-cheatmd .content-inner div.tooltip{display:none}.page-cheatmd .content-inner footer p:not(.built-using){display:none}}code.makeup .unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.makeup .hll{background-color:#ffc}.makeup .bp{color:#3465a4}.makeup .c,.makeup .c1,.makeup .ch,.makeup .cm,.makeup .cp,.makeup .cpf,.makeup .cs{color:#4d4d4d}.makeup .dl{color:#408200}.makeup .err{color:#a40000;border:#ef2929}.makeup .fm,.makeup .g{color:#4d4d4c}.makeup .gd{color:#a40000}.makeup .ge{color:#4d4d4c;font-style:italic}.makeup .gh{color:navy;font-weight:700}.makeup .gi{color:#00a000}.makeup .go{color:#4d4d4c;font-style:italic}.makeup .gp{color:#4d4d4d}.makeup .gr{color:#ef2929}.makeup .gs{color:#4d4d4c;font-weight:700}.makeup .gt{color:#a40000;font-weight:700}.makeup .gu{color:purple;font-weight:700}.makeup .il{color:#0000cf;font-weight:700}.makeup .k,.makeup .kc,.makeup .kd,.makeup .kn,.makeup .kp,.makeup .kr,.makeup .kt{color:#204a87}.makeup .l{color:#4d4d4c}.makeup .ld{color:#c00}.makeup .m,.makeup .mb,.makeup .mf,.makeup .mh,.makeup .mi,.makeup .mo{color:#2937ab}.makeup .n{color:#4d4d4c}.makeup .na{color:#8a7000}.makeup .nb{color:#204a87}.makeup .nc{color:#0000cf}.makeup .nd{color:#5c35cc;font-weight:700}.makeup .ne{color:#c00;font-weight:700}.makeup .nf{color:#b65800}.makeup .ni{color:#bc5400}.makeup .nl{color:#b65800}.makeup .nn{color:#4d4d4c}.makeup .no{color:#a06600}.makeup .nt{color:#204a87;font-weight:700}.makeup .nv,.makeup .nx{color:#4d4d4c}.makeup .o{color:#bc5400}.makeup .ow{color:#204a87}.makeup .p,.makeup .py{color:#4d4d4c}.makeup .s,.makeup .s1,.makeup .s2,.makeup .sa,.makeup .sb,.makeup .sc{color:#408200}.makeup .sd{color:#8f5902;font-style:italic}.makeup .se{color:#204a87}.makeup .sh{color:#408200}.makeup .si{color:#204a87}.makeup .sr{color:#c00}.makeup .ss{color:#a06600}.makeup .sx{color:#408200}.makeup .vc,.makeup .vg,.makeup .vi,.makeup .vm,.makeup .x{color:#4d4d4c}.dark .makeup{color:#dce1e6}.dark .makeup .hll{background-color:#49483e}.dark .makeup .bp{color:#dce1e6}.dark .makeup .c,.dark .makeup .c1,.dark .makeup .ch,.dark .makeup .cm,.dark .makeup .cp,.dark .makeup .cpf,.dark .makeup .cs{color:#969386}.dark .makeup .dl{color:#e6db74}.dark .makeup .err{color:#960050;background-color:#1e0010}.dark .makeup .fm{color:#a6e22e}.dark .makeup .gd{color:#ff5385}.dark .makeup .ge{font-style:italic}.dark .makeup .gi{color:#a6e22e}.dark .makeup .gp{color:#969386}.dark .makeup .gs{font-weight:700}.dark .makeup .gu{color:#969386}.dark .makeup .gt{color:#ff5385;font-weight:700}.dark .makeup .il{color:#ae81ff}.dark .makeup .k,.dark .makeup .kc,.dark .makeup .kd{color:#66d9ef}.dark .makeup .kn{color:#ff5385}.dark .makeup .kp,.dark .makeup .kr,.dark .makeup .kt{color:#66d9ef}.dark .makeup .l,.dark .makeup .ld,.dark .makeup .m,.dark .makeup .mb,.dark .makeup .mf,.dark .makeup .mh,.dark .makeup .mi,.dark .makeup .mo{color:#ae81ff}.dark .makeup .n{color:#dce1e6}.dark .makeup .na{color:#a6e22e}.dark .makeup .nb{color:#dce1e6}.dark .makeup .nc,.dark .makeup .nd,.dark .makeup .ne,.dark .makeup .nf{color:#a6e22e}.dark .makeup .ni,.dark .makeup .nl,.dark .makeup .nn{color:#dce1e6}.dark .makeup .no{color:#66d9ef}.dark .makeup .nt{color:#ff5385}.dark .makeup .nv{color:#dce1e6}.dark .makeup .nx{color:#a6e22e}.dark .makeup .o,.dark .makeup .ow{color:#ff5385}.dark .makeup .p,.dark .makeup .py{color:#dce1e6}.dark .makeup .s,.dark .makeup .s1,.dark .makeup .s2,.dark .makeup .sa,.dark .makeup .sb,.dark .makeup .sc,.dark .makeup .sd{color:#e6db74}.dark .makeup .se{color:#ae81ff}.dark .makeup .sh,.dark .makeup .si,.dark .makeup .sr,.dark .makeup .ss,.dark .makeup .sx{color:#e6db74}.dark .makeup .vc,.dark .makeup .vg,.dark .makeup .vi,.dark .makeup .vm{color:#dce1e6}.tabset{--borderWidth: 1px;--tabsetPadding: var(--baseLineHeight);margin:var(--baseLineHeight) 0}.tabset-tablist{display:flex;overflow-x:auto}.tabset-tab{padding:.6rem var(--tabsetPadding);min-height:46px;font-family:var(--sansFontFamily);background-color:var(--tabBackground);color:var(--tab);border:var(--borderWidth) solid var(--tabBorder);margin-right:calc(-1 * var(--borderWidth));border-top-width:4px;border-top-color:var(--tabBorderTop);border-radius:0;border-top-left-radius:var(--borderRadius);border-top-right-radius:var(--borderRadius);box-shadow:0 -3px 4px var(--tabShadow) inset;cursor:pointer}.tabset-tab[aria-selected=true]{border-bottom-color:var(--tabBackground);border-top-color:var(--mainLight);box-shadow:none}.tabset-tab[aria-selected=true]:focus-visible{background-color:var(--mainLight);border-color:var(--mainLight);color:var(--white)}.tabset-panel{padding:0 var(--tabsetPadding);border:var(--borderWidth) solid var(--tabBorder);margin-top:calc(-1 * var(--borderWidth));border-bottom-left-radius:var(--borderRadius);border-bottom-right-radius:var(--borderRadius)}@media screen and (max-width: 768px){.tabset{--tabsetPadding: calc(var(--baseLineHeight) / 2)}.tabset-panel{padding-top:calc(var(--tabsetPadding) / 2);padding-bottom:calc(var(--tabsetPadding) / 2)}.tabset-panel pre,.tabset-panel blockquote{margin-left:calc(-1 * var(--tabsetPadding))!important;margin-right:calc(-1 * var(--tabsetPadding))!important}.tabset-panel>pre code{border-left-width:0;border-right-width:0}}body.preview{--sidebarWidth: 0px;overflow:hidden}body.preview .content{height:auto}body.preview .content-inner{padding:0}body.preview .sidebar,body.preview #sidebar-menu,body.preview .hover-link,body.preview .detail-link{display:none}body.preview :is(h1,h2,h3):first-of-type{margin-top:0}body:not(.dark) .content-inner img[src*="#gh-dark-mode-only"],body.dark .content-inner img[src*="#gh-light-mode-only"]{display:none} +/*! Bundled license information: + +normalize.css/normalize.css: + (*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css *) +*/ diff --git a/doc/dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 b/doc/dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6119e5971bfa1b7c5e50dc64d751d21f10038e8d GIT binary patch literal 16244 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 literal 0 HcmV?d00001 diff --git a/doc/dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 b/doc/dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..50cb547f74653d30dafe5455fb8323b72ae6af4e GIT binary patch literal 14772 zcmV;lIZMWOPew8T0RR9106DY(5&!@I0E4su069$n0RR9100000000000000000000 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 z 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 O=l0uVfJ`3CtKbGC-+{#d literal 0 HcmV?d00001 diff --git a/doc/dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 b/doc/dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8a20d54f18d011a61c005912388b1f72fcd237ba GIT binary patch literal 14908 zcmV-CI>W_xPew8T0RR9106IJX5&!@I0E3VK06EeC0RR9100000000000000000000 z0000Qf>IkG9DxJ|U_Vn-K~z8hhhzwWa0#Cj5eN!_xg>#~OACeu00A}vBm;~H1Rw>3 zP6r?ig*zL2auws4l_2f_+>v65WhBC8O;S&m{eQxNk}>uh-W~zStdvp}iA8Y7Se=r& zF)-$G9B7YFW}mLZzUGtL`E%`ew!eW$@(Y!`nxT@@xZ*$f{)nf?S~`YNVY`+_X%1)J zByRbJ5zdJZjX#k=!u5~tlx9dFfaa>Ki>%b&3f2foW)EnacMlj5?~8zipl@Vjp;$p# zi*#8mn?<=wSw*=_ad_J1yUl_J2Ym;3a8w$AVp9?ZA`0q(iiN0CQCHzI-2Nik<&X8R zDAxu5&##&1{-2%6l!z4)D3k!8P_3%10#?gVrsPp23s&_i1PKBXoFqX=g83Kvjj(@n zsVjHaB*SGKKnHZANC6;k0D%LfqDoWh0@OFxARZz95eGN110O_^L<0&UQSR@q ztq58SA_m)FnhefaiB0VA=oJ7Pb=+rrLO$C+JL~|+TC6S5bTqT@Q!PuDyLePw8I?ce0U zBv&_*Q&T_+2-4=@?cI9=Iw40_+u9M3W&PoQb^d!LU0bpwL+p_4Fh8KYPsr6de{P1k z(@Z#Zm~mM<_5VyY+nJpmY6y$(h|7`Z6ncni_^v5kI+weDW;r`MJK%B&m{>s6fyw|c z03>AtBo!#qHZDWXy2|e=S22^g%+rOGN{0}dHdW3=(Vks~RFsup@6LX?`ey%3@7bH| zCtT5ROAs#d$t|3MPG(zV!g+Bm`ktn7=dxX|MzRFduDh@>HN}V zr6$BKcnKS^P|SO#1oro;RbrW@ZZKrp!AM|1U%&45-+pO*U^VA9y(Zhb8c`7u5jl)t zwEf?yfDo8)`6nI+BcKuJf*4{7V!;Ap#TsIZf^c|3ya^z_f+3+oA<^O?i4q|xQXpw^ zAbG@)3RRFAO^_BHkO2lj1{n?+X%b|L>5!S`Ll#;BS#Awvz0HtqwnKJ04AD3VIqe+e zf*X)qZbR<64|(Vz!m=MgbTB-AqRNt?DE@JVcfKuc||y znX++9jTAgS69EE!9&)zM#H1-16nOn)XHq~jL$dq3A-TeNNQtoOW5uM^(2URu!bD+6 z255@m0Z50=xEMMn0ANKBF<60}kb$^-nZ^IfON14H>pLTCaRB2zr~ZIv zUZw%~R0RMO1_+`D0e}?(01jf$n#K+Uz&$HF8W912iJ63(l|!u>Rlxb~P|O)LgB3Wz zHO=%_zO$ubu;7=GN4XlI8B%G1R;pY3b(Yt>)A96YJo9;7Neg}9oA8r#CS6G`=}ijB zU^1LcCG*KLvWZlXL&%1=G>Cw>>z6w7`Cz2vLq!%e5gUB#4j?5rS$qG_R4kEjnp6ZEwJ!CaC-hS|Y zhs5O-*H+rW!;C^}Je>X|HXg?T$&>VoegC~pT& zRh|kYQmMqM&_n)vB_r!T1$rEW_$nZ+Km$JQ8;u}@oEAoX_eMI%M zl9sXQfHFf+WB{`CU`Un*XJJt0CdM{4(#Y&h$kphajE^!ko|$=>Wnr|%1z40nkU7Xc{)kp9KJJXm&AK0(PJr|$@E&5H*)ln_(PMw zg#94oJFyU&VnAEQ(4GlM(*=3@(2*$&%f|3*P0G!v^6_jSrj?B6MG(a$s2*BE=OZFim14h%4#xL~s*HQe`AbG;cvV zSSXId@kyF6p-Q>yaQ-ST*D#)Oo!r+dno+z)r}hyiSwBZ`PcY;NdMtK0k@}&r)*H6aaAp0z zB`&or^u16O12O#Omp7d9aNG#hx(sg7GRw%Sp{r!?s{qPff==glPe_-HaQ8gGJsg&0 z0t~CUn81>7EGJ_%K84bslWhHA$43hdRJUDeF%ayzf$|fGahXjvJrV9)7_AFS-sjfQiXSGn?N%aa zO9H=)BwctZDv<=CuUYU

    DD?!_feV3n2bp7iu_eL|n68f6Ld z>Z@MzKLSvM9|_iwLKT^m|6G)K7NzDX{$S?dqVeJ!dJ47!Ky)^MEkQ#X1p1;XP=O*>V0R9wV(yNA}W)#CRQ z?GHV*U#rM!i3&|td)}5}Vp|7CTC&Y!xRL;4yv9vKe{W`uXmXL4Je8#HYC(%=XyJ{{ zEVNyI*lv{(6)n4g$%_J-?}=QjFVi!JM&Nl4X67DW&Ub^tz$( z{b=Sm`9v%&y}QIP95NPJBNKh1v}}33re`t~UG4fyQF|p?bv5X`pAg{6D?Ex7wYrPN zb%UGUm3NA$8l*hs>-@nR;x6hc?@_GE=$Qh4+POPCXe5~%>*1=-tWGvZySWsy4{p2m zz@JXWaj_sdlp0jS6ns>HK_ihhckC5u9UTjNZa7khH7>dZ|9Pr+CH8|-J?bsSgV%c6V^z~&waRWrb8o2l7) z(zT#R7_|+Vpz(3@OBDrSAvkz)UsoA^N~e!tp(+kUi$iKETdJr-W{#rCU<86bME(Yd zS}c^DmA}nVxaHEqF?k~)cgNLCG4+N77!?ec>i{9ozgHx*{%QpVUck|2(yozWIAu{k zj36Cb!?=+^kpzW^MYkO|JziN53}uiXq|jqQ zkDTyc?*T(MhKQDD!aqea1?Z{Stmfv+tnJwVBvVd zY#e|n->g{o`#-NpM@R?q0vS{hdY3z?xl(Rvv?gM)2jZ9`KhH>S&Y?@_YPe)Dd%-&) zTKEzz#v6^M=VC3}V;O;IdL)cFE!7G?Ycw1L2KTuWm7QF4!i#3WIFZ&J)#CXA)C#%!TD5T|W}Q$?PT#BN2oc>>51wOH;;WH`|$U z7pDlHm{Y4yD3y`Jx}DiTivfc!uO<%t z5KSBbK(VsCRG87+X9BNWyQPNJi06BppwB#e7B;o3DDduuYLp|+w=VEl3PR&=cLkpO z^grC}?Mk(I-tql7>kq&}UJwQ3K{l$;WqNhbI6ae3prz!$^^UQ)D*LX?k4*@I>7Bph zR=L3^%c^%@1)nd>=}m;2mm*#cX~GK*RGux) z{tz2=Dt`uVCH4j|Qt+zE)0gh$&y>6zQSNrrV<*R@NK8~$-)O>q36MRMCKHblp zF*G3gjMHTLrf}7-G5@4dCyo4Z^>%;TQx*{GOrXecmET%D)MZ%Ycb2MSaQ;G$ECcup z0~fp+z69czRPIndp#&j12rH7dszHmkoR@Pb`2o~okz1QEVMVTbi=V((R*#Nd`xS7v z80S9u8&_jWhLaXVFWkK+wqECTmMvETW4|v#7M?{rG=$z*vzrlt*c^m3IRw2d22DRQ zx~K>|bJsF)l@*WQ9jF0h_Cg}7=9A{14LM61LBC*}$9pJ+q(XTzOZq{ypg=(_V1DI- zAPI0ydaYtdwhr7U~WnqjbZu@}Q4Qfdq#8Q+4Z{m0nhom&gDE$^17Uli7LrZIb~gN z{c@m45GZzdT?mX_$B(z~gwtGdh0IXXg(I3!|!uES5X+X2 zmz8wYY1-OOab)ZO)I0yb-c{BKIRt97Mzsctar=(-{~ACkDRn#pCVh4EJ?Fm8(hMi| zyvRc@iqLEJ0~kP|^}Tt(2%>rkHPxZspzMAEM^1{h1#y{t35`M0Y|t@o!<{L&ebDuQ zT%cDtCkPneoU4X2N`+j~a#icZuXWJzzk<;dg2LpEUP?L~gRI-3twA6b_AVaB?atq* zV1+*_>!Tgr_Ca+X=fs<^dRC#Dl9Xc;`kac$4uu~qu+p>f^H`Tc(9^W2-uT~|m;&}~ zh*nDT0U#I@l;_{(MgmCdk4@&G{Ew3bi7Jy^QsnrbQ&D|nT!R7U)csVy(9mp&&}kC0sl@-|(`_a)x{HM7<6iE$@AZ@O}1=Mzvm9FC17jl+s8%*!o;Utf1v_01)8JLPf>h$+t41%�#c@2U3#`>rMwF?6%z&ALOS3$_4zPHjx!@ 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 literal 0 HcmV?d00001 diff --git a/doc/dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 b/doc/dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ab70f18a843f16dfb1d3b54a2ea0442adadb29b9 GIT binary patch literal 6836 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%0AweD$$Gt)CQ;s3M4>7q3!HjNDP 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 literal 0 HcmV?d00001 diff --git a/doc/dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 b/doc/dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a8140081e44d7ef2b1cd92a2dda930874c57fa73 GIT binary patch literal 6944 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 literal 0 HcmV?d00001 diff --git a/doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 b/doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..aad98a339043040c3bcb72f319e55a8f028562f1 GIT binary patch literal 23236 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 literal 0 HcmV?d00001 diff --git a/doc/dist/lato-latin-400-normal-W7754I4D.woff2 b/doc/dist/lato-latin-400-normal-W7754I4D.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ff60934dd0ea9cdd93f961d2dfd1e158357f2a77 GIT binary patch literal 23580 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 QOFh<%JiLFgmWQ+r07g396aWAK literal 0 HcmV?d00001 diff --git a/doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 b/doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..11de83feaf0fb872c91fce89534fd4e2d8bbda28 GIT binary patch literal 23040 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 literal 0 HcmV?d00001 diff --git a/doc/dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 b/doc/dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..486d3ecf0a97553e0ad751a183466d10bcb98167 GIT binary patch literal 5624 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 S&~TTeYt5jdfCpaS$|L}V4$a&E literal 0 HcmV?d00001 diff --git a/doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 b/doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..edb9fa6f492362a9ab1f1d674b8f6e6f4e2085d0 GIT binary patch literal 5472 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 WhF)K4IGNT+hd8;|K8&%*Sz!P*WW1>W literal 0 HcmV?d00001 diff --git a/doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 b/doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2c8aaa866eee8bee09ee05a9809c2fda7cd87bd1 GIT binary patch literal 5368 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 q3kxY4?d;kys!X?dVp*I literal 0 HcmV?d00001 diff --git a/doc/dist/search_data-EF5B6961.js b/doc/dist/search_data-EF5B6961.js new file mode 100644 index 0000000..93a0a33 --- /dev/null +++ b/doc/dist/search_data-EF5B6961.js @@ -0,0 +1 @@ +searchData={"items":[{"type":"module","title":"elli","doc":"Elli acceptor manager This gen_server owns the listen socket and manages the processes accepting on that socket. When a process waiting for accept gets a request, it notifies this gen_server so we can start up another acceptor.","ref":"elli.html"},{"type":"function","title":"elli.get_acceptors/1","doc":null,"ref":"elli.html#get_acceptors/1"},{"type":"function","title":"elli.get_open_reqs/1","doc":null,"ref":"elli.html#get_open_reqs/1"},{"type":"function","title":"elli.get_open_reqs/2","doc":null,"ref":"elli.html#get_open_reqs/2"},{"type":"function","title":"elli.set_callback/3","doc":null,"ref":"elli.html#set_callback/3"},{"type":"function","title":"elli.start_link/0","doc":"Create an Elli server process as part of a supervision tree, using the default configuration. The same as start_link({callback, elli_example_callback}, {callback_args, []}) .","ref":"elli.html#start_link/0"},{"type":"function","title":"elli.start_link/1","doc":null,"ref":"elli.html#start_link/1"},{"type":"function","title":"elli.stop/1","doc":"Stop Server .","ref":"elli.html#stop/1"},{"type":"type","title":"elli.body/0","doc":"A binary or iolist.","ref":"elli.html#t:body/0"},{"type":"type","title":"elli.header/0","doc":null,"ref":"elli.html#t:header/0"},{"type":"type","title":"elli.headers/0","doc":null,"ref":"elli.html#t:headers/0"},{"type":"type","title":"elli.http_method/0","doc":"An uppercase atom representing a known HTTP verb or a binary for other verbs.","ref":"elli.html#t:http_method/0"},{"type":"type","title":"elli.req/0","doc":null,"ref":"elli.html#t:req/0"},{"type":"type","title":"elli.response_code/0","doc":null,"ref":"elli.html#t:response_code/0"},{"type":"opaque","title":"elli.state/0","doc":"Internal state.","ref":"elli.html#t:state/0"},{"type":"module","title":"elli_example_callback","doc":"Elli example callback Your callback needs to implement two functions, handle/2 and handle_event/3 . For every request, Elli will call your handle function with the request. When an event happens, like Elli completed a request, there was a parsing error or your handler threw an error, handle_event/3 is called.","ref":"elli_example_callback.html"},{"type":"function","title":"elli_example_callback.chunk_loop/1","doc":"Send 10 separate chunks to the client. The same as chunk_loop(Ref, 10)","ref":"elli_example_callback.html#chunk_loop/1"},{"type":"function","title":"elli_example_callback.handle/2","doc":"Handle a Req uest. Delegate to our handler function. See handle/3","ref":"elli_example_callback.html#handle/2"},{"type":"function","title":"elli_example_callback.handle_event/3","doc":"Handle Elli events, fired throughout processing a request. elli_startup is sent when Elli is starting up. If you are implementing a middleware, you can use it to spawn processes, create ETS tables or start supervised processes in a supervisor tree. request_complete fires *after* Elli has sent the response to the client. Timings contains timestamps (native units) of events like when the connection was accepted, when headers/body parsing finished, when the user callback returns, response sent, etc. Sizes contains response sizes like response headers size, response body or file size. This allows you to collect performance statistics for monitoring your app. request_throw , request_error and request_exit events are sent if the user callback code throws an exception, has an error or exits. After triggering this event, a generated response is sent to the user. invalid_return is sent if the user callback code returns a term not understood by elli, see elli_http:execute_callback/1 . After triggering this event, a generated response is sent to the user. chunk_complete fires when a chunked response is completely sent. It's identical to the request_complete event, except instead of the response body you get the atom client or server depending on who closed the connection. Sizes will have the key chunks , which is the total size of all chunks plus encoding overhead. request_closed is sent if the client closes the connection when Elli is waiting for the next request on a keep alive connection. request_timeout is sent if the client times out when Elli is waiting for the request. request_parse_error fires if the request is invalid and cannot be parsed by [ erlang:decode_packet/3 ][decode_packet/3] or it contains a path Elli cannot parse or does not support. [decode_packet/3]: http://erlang.org/doc/man/erlang.html#decode_packet-3 client_closed can be sent from multiple parts of the request handling. It's sent when the client closes the connection or if for any reason the socket is closed unexpectedly. The Where atom tells you in which part of the request processing the closed socket was detected: receiving_headers , receiving_body or before_response . client_timeout can as with client_closed be sent from multiple parts of the request handling. If Elli tries to receive data from the client socket and does not receive anything within a timeout, this event fires and the socket is closed. bad_request is sent when Elli detects a request is not well formatted or does not conform to the configured limits. Currently the Reason variable can be {too_many_headers, Headers} or {body_size, ContentLength} . file_error is sent when the user wants to return a file as a response, but for some reason it cannot be opened.","ref":"elli_example_callback.html#handle_event/3"},{"type":"module","title":"elli_example_callback_handover","doc":null,"ref":"elli_example_callback_handover.html"},{"type":"function","title":"elli_example_callback_handover.handle/2","doc":null,"ref":"elli_example_callback_handover.html#handle/2"},{"type":"function","title":"elli_example_callback_handover.init/2","doc":"Return {ok, handover} if Req 's path is /hello/world , otherwise ignore .","ref":"elli_example_callback_handover.html#init/2"},{"type":"behaviour","title":"elli_handler","doc":null,"ref":"elli_handler.html"},{"type":"callback","title":"elli_handler.handle/2","doc":null,"ref":"elli_handler.html#c:handle/2"},{"type":"callback","title":"elli_handler.handle_event/3","doc":null,"ref":"elli_handler.html#c:handle_event/3"},{"type":"callback","title":"elli_handler.init/2","doc":null,"ref":"elli_handler.html#c:init/2"},{"type":"callback","title":"elli_handler.postprocess/3","doc":null,"ref":"elli_handler.html#c:postprocess/3"},{"type":"callback","title":"elli_handler.preprocess/2","doc":null,"ref":"elli_handler.html#c:preprocess/2"},{"type":"type","title":"elli_handler.callback/0","doc":"A tuple of a t:callback_mod() and t:callback_args() .","ref":"elli_handler.html#t:callback/0"},{"type":"type","title":"elli_handler.callback_args/0","doc":"Arguments to pass to a t:callback_mod()","ref":"elli_handler.html#t:callback_args/0"},{"type":"type","title":"elli_handler.callback_mod/0","doc":"A callback module.","ref":"elli_handler.html#t:callback_mod/0"},{"type":"type","title":"elli_handler.event/0","doc":"Fired throughout processing a request. See elli_example_callback:handle_event/3 for descriptions.","ref":"elli_handler.html#t:event/0"},{"type":"type","title":"elli_handler.result/0","doc":null,"ref":"elli_handler.html#t:result/0"},{"type":"module","title":"elli_http","doc":"Elli HTTP request implementation An elli_http process blocks in elli_tcp:accept/3 until a client connects. It then handles requests on that connection until it's closed either by the client timing out or explicitly by the user.","ref":"elli_http.html"},{"type":"function","title":"elli_http.accept/4","doc":"Accept on the socket until a client connects. Handle the request, then loop if we're using keep alive or chunked transfer. If elli_tcp:accept/3 doesn't return a socket within a configurable timeout, loop to allow code upgrades of this module.","ref":"elli_http.html#accept/4"},{"type":"function","title":"elli_http.chunk_loop/1","doc":null,"ref":"elli_http.html#chunk_loop/1"},{"type":"function","title":"elli_http.close_or_keepalive/2","doc":"Return the preferred session handling setting to close or keep the current session alive based on the presence of a header or the standard default based on the version of HTTP of the request.","ref":"elli_http.html#close_or_keepalive/2"},{"type":"function","title":"elli_http.handle_request/4","doc":"Handle a HTTP request that will possibly come on the socket. Returns the appropriate connection token and any buffer containing (parts of) the next request.","ref":"elli_http.html#handle_request/4"},{"type":"function","title":"elli_http.keepalive_loop/3","doc":"Handle multiple requests on the same connection, i.e. "keep alive" .","ref":"elli_http.html#keepalive_loop/3"},{"type":"function","title":"elli_http.keepalive_loop/5","doc":null,"ref":"elli_http.html#keepalive_loop/5"},{"type":"function","title":"elli_http.mk_req/8","doc":null,"ref":"elli_http.html#mk_req/8"},{"type":"function","title":"elli_http.mk_req/11","doc":null,"ref":"elli_http.html#mk_req/11"},{"type":"function","title":"elli_http.parse_path/1","doc":null,"ref":"elli_http.html#parse_path/1"},{"type":"function","title":"elli_http.send_file/5","doc":"Send a HTTP response to the client where the body is the contents of the given file. Assumes correctly set response code and headers.","ref":"elli_http.html#send_file/5"},{"type":"function","title":"elli_http.send_response/4","doc":"Generate a HTTP response and send it to the client.","ref":"elli_http.html#send_response/4"},{"type":"function","title":"elli_http.split_args/1","doc":"Split the URL arguments into a proplist. Lifted from cowboy_http:x_www_form_urlencoded/2.","ref":"elli_http.html#split_args/1"},{"type":"function","title":"elli_http.start_link/4","doc":null,"ref":"elli_http.html#start_link/4"},{"type":"type","title":"elli_http.version/0","doc":"HTTP version as a tuple, i.e. {0, 9} | {1, 0} | {1, 1} .","ref":"elli_http.html#t:version/0"},{"type":"module","title":"elli_middleware","doc":"HTTP request processing middleware. This module offers both pre-processing of requests and post-processing of responses. It can also be used to allow multiple handlers, where the first handler to return a response short-circuits the request. It is implemented as a plain elli handler. Usage: Config = [ { mods , [ { elli_example_middleware , [ ] } , { elli_middleware_compress , [ ] } , { elli_example_callback , [ ] } ] } ] , elli : start_link ( [ %% ..., { callback , elli_middleware } , { callback_args , Config } ] ) . The configured modules may implement the elli behaviour, in which case all the callbacks will be used as normal. If link handle/2 returns ignore , elli will continue on to the next callback in the list. Pre-processing and post-processing is implemented in preprocess/2 and postprocess/3 . preprocess/2 is called for each middleware in the order specified, while postprocess/3 is called in the reverse order.","ref":"elli_middleware.html"},{"type":"module","title":"elli_middleware_compress","doc":"Response compression as Elli middleware.","ref":"elli_middleware_compress.html"},{"type":"function","title":"elli_middleware_compress.postprocess/3","doc":"Postprocess all requests and compress bodies larger than compress_byte_size ( 1024 by default).","ref":"elli_middleware_compress.html#postprocess/3"},{"type":"module","title":"elli_request","doc":null,"ref":"elli_request.html"},{"type":"function","title":"elli_request.async_send_chunk/2","doc":"Send a chunk asynchronously.","ref":"elli_request.html#async_send_chunk/2"},{"type":"function","title":"elli_request.body/1","doc":"Return the body .","ref":"elli_request.html#body/1"},{"type":"function","title":"elli_request.body_qs/1","doc":"Parse application/x-www-form-urlencoded body into a proplist.","ref":"elli_request.html#body_qs/1"},{"type":"function","title":"elli_request.chunk_ref/1","doc":"Return a reference that can be used to send chunks to the client. If the protocol does not support it, return {error, not_supported} .","ref":"elli_request.html#chunk_ref/1"},{"type":"function","title":"elli_request.close_chunk/1","doc":"Explicitly close the chunked connection. Return {error, closed} if the client already closed the connection. The same as send_chunk(Ref, close)","ref":"elli_request.html#close_chunk/1"},{"type":"function","title":"elli_request.get_arg/2","doc":null,"ref":"elli_request.html#get_arg/2"},{"type":"function","title":"elli_request.get_arg/3","doc":null,"ref":"elli_request.html#get_arg/3"},{"type":"function","title":"elli_request.get_arg_decoded/2","doc":null,"ref":"elli_request.html#get_arg_decoded/2"},{"type":"function","title":"elli_request.get_arg_decoded/3","doc":null,"ref":"elli_request.html#get_arg_decoded/3"},{"type":"function","title":"elli_request.get_args/1","doc":"Return a proplist of keys and values of the original query string. Both keys and values in the returned proplists will be binaries or the atom true in case no value was supplied for the query value.","ref":"elli_request.html#get_args/1"},{"type":"function","title":"elli_request.get_args_decoded/1","doc":null,"ref":"elli_request.html#get_args_decoded/1"},{"type":"function","title":"elli_request.get_header/2","doc":null,"ref":"elli_request.html#get_header/2"},{"type":"function","title":"elli_request.get_header/3","doc":null,"ref":"elli_request.html#get_header/3"},{"type":"function","title":"elli_request.get_range/1","doc":"Parse the Range header from the request. The result is either a [http_range()] or the atom parse_error . Use elli_util:normalize_range/2 to get a validated, normalized range.","ref":"elli_request.html#get_range/1"},{"type":"function","title":"elli_request.headers/1","doc":"Return the headers that have had string:casefold/1 run on each key.","ref":"elli_request.html#headers/1"},{"type":"function","title":"elli_request.host/1","doc":"Return the host .","ref":"elli_request.html#host/1"},{"type":"function","title":"elli_request.is_request/1","doc":null,"ref":"elli_request.html#is_request/1"},{"type":"function","title":"elli_request.method/1","doc":"Return the method .","ref":"elli_request.html#method/1"},{"type":"function","title":"elli_request.original_headers/1","doc":"Return the original headers .","ref":"elli_request.html#original_headers/1"},{"type":"function","title":"elli_request.path/1","doc":"Return path split into binary parts.","ref":"elli_request.html#path/1"},{"type":"function","title":"elli_request.peer/1","doc":null,"ref":"elli_request.html#peer/1"},{"type":"function","title":"elli_request.port/1","doc":"Return the port .","ref":"elli_request.html#port/1"},{"type":"function","title":"elli_request.post_arg/2","doc":null,"ref":"elli_request.html#post_arg/2"},{"type":"function","title":"elli_request.post_arg/3","doc":null,"ref":"elli_request.html#post_arg/3"},{"type":"function","title":"elli_request.post_arg_decoded/2","doc":null,"ref":"elli_request.html#post_arg_decoded/2"},{"type":"function","title":"elli_request.post_arg_decoded/3","doc":null,"ref":"elli_request.html#post_arg_decoded/3"},{"type":"function","title":"elli_request.post_args/1","doc":null,"ref":"elli_request.html#post_args/1"},{"type":"function","title":"elli_request.post_args_decoded/1","doc":null,"ref":"elli_request.html#post_args_decoded/1"},{"type":"function","title":"elli_request.query_str/1","doc":"Calculate the query string associated with a given Request as a binary.","ref":"elli_request.html#query_str/1"},{"type":"function","title":"elli_request.raw_path/1","doc":"Return the raw_path , i.e. not split or parsed for query params.","ref":"elli_request.html#raw_path/1"},{"type":"function","title":"elli_request.scheme/1","doc":"Return the scheme .","ref":"elli_request.html#scheme/1"},{"type":"function","title":"elli_request.send_chunk/2","doc":"Send a chunk synchronously. If the referenced process is dead, return early with {error, closed} , instead of timing out.","ref":"elli_request.html#send_chunk/2"},{"type":"function","title":"elli_request.to_proplist/1","doc":"Serialize the Req uest record to a proplist. Useful for logging.","ref":"elli_request.html#to_proplist/1"},{"type":"function","title":"elli_request.uri_decode/1","doc":null,"ref":"elli_request.html#uri_decode/1"},{"type":"type","title":"elli_request.http_range/0","doc":null,"ref":"elli_request.html#t:http_range/0"},{"type":"module","title":"elli_sendfile","doc":null,"ref":"elli_sendfile.html"},{"type":"function","title":"elli_sendfile.sendfile/5","doc":"Send part of a file on a socket. Basically, see file:sendfile/5 but for ssl (i.e. not raw OS sockets). Originally from https://github.com/ninenines/ranch/pull/41/files","ref":"elli_sendfile.html#sendfile/5"},{"type":"type","title":"elli_sendfile.sendfile_opts/0","doc":null,"ref":"elli_sendfile.html#t:sendfile_opts/0"},{"type":"module","title":"elli_tcp","doc":"Wrapper for plain and SSL sockets. Based on mochiweb_socket.erl .","ref":"elli_tcp.html"},{"type":"function","title":"elli_tcp.accept/3","doc":null,"ref":"elli_tcp.html#accept/3"},{"type":"function","title":"elli_tcp.close/1","doc":null,"ref":"elli_tcp.html#close/1"},{"type":"function","title":"elli_tcp.listen/3","doc":null,"ref":"elli_tcp.html#listen/3"},{"type":"function","title":"elli_tcp.peername/1","doc":null,"ref":"elli_tcp.html#peername/1"},{"type":"function","title":"elli_tcp.recv/3","doc":null,"ref":"elli_tcp.html#recv/3"},{"type":"function","title":"elli_tcp.send/2","doc":null,"ref":"elli_tcp.html#send/2"},{"type":"function","title":"elli_tcp.sendfile/5","doc":null,"ref":"elli_tcp.html#sendfile/5"},{"type":"function","title":"elli_tcp.setopts/2","doc":null,"ref":"elli_tcp.html#setopts/2"},{"type":"type","title":"elli_tcp.socket/0","doc":null,"ref":"elli_tcp.html#t:socket/0"},{"type":"module","title":"elli_test","doc":"Helper for calling your Elli callback in unit tests. Only the callback specified is actually run. Elli's response handling is not used, so the headers will for example not include a content length and the return format is not standardized. The unit tests below test elli_example_callback .","ref":"elli_test.html"},{"type":"function","title":"elli_test.call/5","doc":null,"ref":"elli_test.html#call/5"},{"type":"module","title":"elli_util","doc":null,"ref":"elli_util.html"},{"type":"function","title":"elli_util.encode_range/2","doc":"Encode Range to a Content-Range value.","ref":"elli_util.html#encode_range/2"},{"type":"function","title":"elli_util.file_size/1","doc":"Get the size, in bytes, of the file.","ref":"elli_util.html#file_size/1"},{"type":"function","title":"elli_util.normalize_range/2","doc":"If a valid byte-range, or byte-range-set of size 1, is supplied, returns a normalized range in the format {Offset, Length} . Returns undefined when an empty byte-range-set is supplied and the atom invalid_range in all other cases.","ref":"elli_util.html#normalize_range/2"},{"type":"type","title":"elli_util.range/0","doc":null,"ref":"elli_util.html#t:range/0"},{"type":"extras","title":"Elli - Erlang web server for HTTP APIs","doc":"# Elli - Erlang web server for HTTP APIs\n\n[![Hex.pm](https://img.shields.io/hexpm/v/elli.svg)](https://hex.pm/packages/elli)\n[![Documentation](https://img.shields.io/badge/docs-edown-green.svg)](doc/README.md)\n[![Erlang](https://img.shields.io/badge/erlang-%E2%89%A520.0-red.svg)](http://www.erlang.org/downloads)\n![Common Test](https://github.com/elli-lib/elli/workflows/Common%20Test/badge.svg)\n[![Coverage Status](https://coveralls.io/repos/github/elli-lib/elli/badge.svg?branch=develop)](https://coveralls.io/github/elli-lib/elli?branch=develop)\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nElli is a webserver you can run inside your Erlang application to\nexpose an HTTP API. It is aimed exclusively at building\nhigh-throughput, low-latency HTTP APIs. If robustness and performance\nis more important to you than general purpose features, then Elli might be\nfor you. If you find yourself digging into the implementation of a\nwebserver, then Elli might be for you. If you're building web services,\nnot web sites, then Elli might be for you.\n\nElli requires OTP 20.0 or newer.","ref":"readme.html"},{"type":"extras","title":"Installation - Elli - Erlang web server for HTTP APIs","doc":"Add `elli` to your application as a dependency to your\n[`rebar.config`](https://www.rebar3.org/docs/configuration):\n\n```erlang\n{deps, [\n {elli, \"3.3.0\"}\n]}.\n```\n\nAfterwards, to compile it, you can run:\n\n```console\nrebar3 compile\n```","ref":"readme.html#installation"},{"type":"extras","title":"Usage - Elli - Erlang web server for HTTP APIs","doc":"To boot Elli inside an Erlang shell, run:\n\n```console\nrebar3 shell\n```\n\n```erlang\n%% starting elli\n1> {ok, Pid} = elli:start_link([{callback, elli_example_callback}, {port, 3000}]).\n```","ref":"readme.html#usage"},{"type":"extras","title":"Examples - Elli - Erlang web server for HTTP APIs","doc":"","ref":"readme.html#examples"},{"type":"extras","title":"Callback Module - Elli - Erlang web server for HTTP APIs","doc":"The best source to learn how to write a callback module\nis [`elli_example_callback`](elli_example_callback.html).\nThere are also a bunch\nof examples used in the tests as well as descriptions of all the events.\n\nA minimal callback module looks something like this:\n\n```erlang\n-module(elli_minimal_callback).\n-behaviour(elli_handler).\n\n-include_lib(\"elli/include/elli.hrl\").\n\n-export([handle/2, handle_event/3]).\n\nhandle(Req, _Args) ->\n %% Delegate to our handler function\n Method = Req#req.method,\n Path = elli_request:path(Req),\n handle(Method, Path, Req).\n\nhandle('GET' = _Method, [<<\"hello\">>, <<\"world\">>] = _Path, _Req) ->\n %% Reply with a normal response. `ok' can be used instead of `200'\n %% to signal success.\n StatusCode = ok,\n Headers = [],\n Body = <<\"Hello World!\">>,\n {StatusCode, Headers, Body};\n\nhandle(_Method, _Path, _Req) ->\n {404, [], <<\"Not Found\">>}.\n\n%% @doc Handle request events: request completed, exception\n%% thrown, client timeout, etc. Must return `ok'.\nhandle_event(_Event, _Data, _Args) ->\n ok.\n```","ref":"readme.html#callback-module"},{"type":"extras","title":"Supervisor ChildSpec - Elli - Erlang web server for HTTP APIs","doc":"To add `elli` to a supervisor you can use the following example and adapt it to\nyour needs.\n\n```erlang\n-module(elli_minimal_sup).\n-behaviour(supervisor).\n\n-export([start_link/0, init/1]).\n\nstart_link() ->\n SupName = {local, ?MODULE},\n Module = ?MODULE,\n Args = [],\n supervisor:start_link(SupName, Module, Args).\n\ninit([] = _Args) ->\n ElliOpts = [\n {callback, elli_minimal_callback},\n {port, 3000}\n ],\n ElliSpec = {\n _Id = elli_minimal_http,\n _Start = {elli, start_link, [ElliOpts]},\n _Restart = permanent,\n _Shutdown = 5000,\n _Worker = worker,\n _Modules = [elli]},\n\n {ok, {{_Strategy = one_for_one, _Intensity = 5, _Period = 10}, [ElliSpec]} }.\n```","ref":"readme.html#supervisor-childspec"},{"type":"extras","title":"Further reading - Elli - Erlang web server for HTTP APIs","doc":"For more information about the features and design philosophy of Elli check\nout the [`overview`](overview.html).","ref":"readme.html#further-reading"},{"type":"extras","title":"License - Elli - Erlang web server for HTTP APIs","doc":"Elli is licensed under [The MIT License](LICENSE).","ref":"readme.html#license"},{"type":"extras","title":"Elli - Overview","doc":"# Elli - Overview\n\nCopyright (c) 2012-2016 Knut Nesheim, 2016-2018 elli-lib team\n\n__Version:__ 3.3.0\n\n__Authors:__ Knut Nesheim, elli-lib team.\n\nErlang web server for HTTP APIs","ref":"overview.html"},{"type":"extras","title":"Features - Elli - Overview","doc":"Here's the features Elli _does_ have:\n\n* [Rack][]-style request-response. Your handler function gets a\n complete request and returns a complete response. There's no\n messaging, no receiving data directly from the socket, no writing\n responses directly to the socket. It's a very simple and\n straightforward API. Have a look at [`elli_example_callback`](elli_example_callback.html)\nfor examples.\n\n* Middlewares allow you to add useful features like compression,\nencoding, stats, but only have it used when needed. No features you\ndon't use on the critical path.\n\n* Short-circuiting of responses using exceptions, allows you to use\n \"assertions\" that return for example 403 permission\n denied. `is_allowed(Req) orelse throw({403, [], <<\"Permission\n denied\">>})`.\n\n* Every client connection gets its own process, isolating the failure\nof a request from another. For the duration of the connection, only\none process is involved, resulting in very robust and efficient\ncode.\n\n* Binaries everywhere for strings.\n\n* Instrumentation inside the core of the webserver, triggering user\n callbacks. For example when a request completes, the user callback\n gets the `request_complete` event which contains timings of all the\ndifferent parts of handling a request. There's also events for\nclients unexpectedly closing a connection, crashes in the user\ncallback, etc.\n\n* Keep alive, using one Erlang process per connection only active\nwhen there is a request from the client. Number of connections is\nonly limited by RAM and CPU.\n\n* Chunked transfer in responses for real-time push to clients\n\n* Basic pipelining. HTTP verbs that does not have side-effects(`GET`\n and `HEAD`) can be pipelined, ie. a client supporting pipelining\ncan send multiple requests down the line and expect the responses\nto appear in the same order as requests. Elli processes the\nrequests one at a time in order, future work could make it possible\nto process them in parallel.\n\n* SSL using built-in Erlang/OTP ssl, nice for low volume admin\ninterfaces, etc. For high volume, you should probably go with\nnginx, stunnel or ELB if you're on AWS.\n\n* Implement your own connection handling, for WebSockets, streaming\n uploads, etc. See [`elli_example_callback_handover`](elli_example_callback_handover.html).","ref":"overview.html#features"},{"type":"extras","title":"Extensions - Elli - Overview","doc":"Here's some ready-to-use extensions for Elli.\n\n* [elli_access_log](https://github.com/elli-lib/elli_access_log):\nAccess log\n* [elli_basicauth](https://github.com/elli-lib/elli_basicauth):\nBasic auth\n* [elli_chatterbox](https://github.com/elli-lib/elli_chatterbox):\nHTTP/2 support\n* [elli_cloudfront](https://github.com/elli-lib/elli_cloudfront):\nCloudFront signed URLs\n* [elli_cookie](https://github.com/elli-lib/elli_cookie):\nCookies\n* [elli_date](https://github.com/elli-lib/elli_date):\n\"Date\" header\n* [elli_fileserve](https://github.com/elli-lib/elli_fileserve):\nStatic content\n* [elli_prometheus](https://github.com/elli-lib/elli_prometheus):\nPrometheus\n* [elli_stats](https://github.com/elli-lib/elli_stats):\nReal-time statistics dashboard\n* [elli_websockets](https://github.com/elli-lib/elli_websocket):\nWebSockets\n* [elli_xpblfe](https://github.com/elli-lib/elli_xpblfe):\nX-Powered-By LFE\n\nYou can also find a more complete list at .","ref":"overview.html#extensions"},{"type":"extras","title":"About - Elli - Overview","doc":"From operating and debugging high-volume, low-latency apps we have\ngained some valuable insight into what we want from a webserver. We\nwant simplicity, robustness, performance, ease of debugging,\nvisibility into strange client behaviour, really good instrumentation\nand good tests. We are willing to sacrifice almost everything, even\nbasic features to achieve this.\n\nWith this in mind we looked at the big names in the Erlang\ncommunity: [Yaws][], [Mochiweb][], [Misultin][] and [Cowboy][]. We\nfound [Mochiweb][] to be the best match. However, we also wanted to\nsee if we could take the architecture of [Mochiweb][] and improve on\nit. Elli takes the acceptor-turns-into-request-handler idea found\nin [Mochiweb][], the binaries-only idea from [Cowboy][] and the\nrequest-response idea from [WSGI][]/[Rack][] (with chunked transfer\nbeing an exception).\n\nOn top of this we built a handler that allows us to write HTTP\nmiddleware modules to add practical features, like compression of\nresponses, HTTP access log with timings, a real-time statistics\ndashboard and chaining multiple request handlers.","ref":"overview.html#about"},{"type":"extras","title":"Aren't there enough webservers in the Erlang community already? - Elli - Overview","doc":"There are a few very mature and robust projects with steady\ndevelopment, one recently ceased development and one new kid on the\nblock with lots of interest. As Elli is not a general purpose\nwebserver, but more of a specialized tool, we believe it has a very\ndifferent target audience and would not attract effort or users away\nfrom the big names.","ref":"overview.html#aren-t-there-enough-webservers-in-the-erlang-community-already"},{"type":"extras","title":"Why another webserver? Isn't this just the NIH syndrome? - Elli - Overview","doc":"[Yaws][], [Mochiweb][], [Misultin][], and [Cowboy][] are great\nprojects, hardened over time and full of very useful features for web\ndevelopment. If you value developer productivity, [Yaws][] is an\nexcellent choice. If you want a fast and lightweight\nserver, [Mochiweb][] and [Cowboy][] are excellent choices.\n\nHaving used and studied all of these projects, we believed that if we\nmerged some of the existing ideas and added some ideas from other\ncommunities, we could create a core that was better for our use cases.\n\nIt started out as an experiment to see if it is at all possible to\nsignificantly improve and it turns out that for our particular use\ncases, there is enough improvement to warrant a new project.","ref":"overview.html#why-another-webserver-isn-t-this-just-the-nih-syndrome"},{"type":"extras","title":"What makes Elli different? - Elli - Overview","doc":"Elli has a very simple architecture. It avoids using more processes\nand messages than absolutely necessary. It uses binaries for\nstrings. The request-response programming model allows middlewares to\ndo much heavy lifting, so the core can stay very simple. It has been\ninstrumented so as a user you can understand where time is spent. When\nthings go wrong, like the client closed the connection before you\ncould send a response, you are notified about these things so you can\nbetter understand your client behaviour.","ref":"overview.html#what-makes-elli-different"},{"type":"extras","title":"Performance - Elli - Overview","doc":"\"Hello World!\" micro-benchmarks are really useful when measuring the\nperformance of the webserver itself, but the numbers usually do more\nharm than good when released. I encourage you to run your own\nbenchmarks, on your own hardware. Mark Nottingham has some\n[very good pointers](http://www.mnot.net/blog/2011/05/18/http_benchmark_rules)\nabout benchmarking HTTP servers.\n\n[Yaws]: https://github.com/klacke/yaws\n[Mochiweb]: https://github.com/mochi/mochiweb\n[Misultin]: https://github.com/ostinelli/misultin\n[Cowboy]: https://github.com/ninenines/cowboy\n[WSGI]: https://www.python.org/dev/peps/pep-3333/\n[Rack]: https://github.com/rack/rack","ref":"overview.html#performance"},{"type":"extras","title":"CHANGELOG","doc":"# CHANGELOG","ref":"changelog.html"},{"type":"extras","title":"pre-v4.0.0 - CHANGELOG","doc":"* Headers are now properly treated as case-insensitive\n* Original headers that have not had `string:casefold/1` run on each header\nname are still available in the request through `elli_request:original_headers`","ref":"changelog.html#pre-v4-0-0"},{"type":"extras","title":"v3.3.0 - CHANGELOG","doc":"* Do not use x-forwarded-for for peer #75\n* Handle arguments with no value in (post|get)_arg_decoded #82\n* Fix compile-time warnings on missing record info. from aleppo #81","ref":"changelog.html#v3-3-0"},{"type":"extras","title":"v3.2.0 - CHANGELOG","doc":"* Quell warnings on OTP-21: \n\n* Generate HTML docs: \n\n* Add OTP-21 to Travis build matrix: \n\n* Remove unnecessary `stacktrace_compat` dependency: \n\n* Export `elli_request:uri_decode/1` and improve performance: \n\n* Update Travis config: \n\n* Drop support for OTP-16: \n\n* Prefer `OTP_RELEASE` over `rebar_erl_vsn` plugin: \n\n* Remove old `maintainers` metadata:","ref":"changelog.html#v3-2-0"},{"type":"extras","title":"v3.1.0 - CHANGELOG","doc":"* Update docs: \n\n* Logging and stacktrace OTP-21 support: \n\n* Include req_body size in sizes list: \n\n* Update CHANGELOG.md for 3.0.0:","ref":"changelog.html#v3-1-0"},{"type":"extras","title":"v3.0.0 - CHANGELOG","doc":"* `scheme`, `host`, and `port` added to the `#req{}` record. Corresponding\n helper functions added to the `elli_request` module.","ref":"changelog.html#v3-0-0"},{"type":"extras","title":"v2.1.2 - CHANGELOG","doc":"* Update dependencies and re-enable linting\n\n* Increase test coverage\n\n* Declare optional callbacks to elli_handler\n\n* Add TLS sendfile implementation by James Fish (from Andrew Thompson)\n\n* Use hackney instead of httpc in tests, due to httpc bug","ref":"changelog.html#v2-1-2"},{"type":"extras","title":"v2.0.2 - CHANGELOG","doc":"* Adapt [knutin/elli#108](https://github.com/knutin/elli/pull/108) by Michael Zazaian\n\n* Incomplete request regression fix by Evan Vigil-McClanahan\n\n* Handle binary URIs on OTP >=20\n\n* Bespoke uri_decode/1 to obviate inets dependency by Christoffer Vikström","ref":"changelog.html#v2-0-2"},{"type":"extras","title":"v2.0.1 - CHANGELOG","doc":"* Miscellaneous tooling, test, and type spec tweaks\n\n* Helper functions to reduce redundancy\n\n* Request start timing fix","ref":"changelog.html#v2-0-1"},{"type":"extras","title":"v2.0.0 - CHANGELOG","doc":"* Code and documentation cleanup\n\n* Instrumentation facilities\n\n* RFC 2616 section 8.2.3 implementation by Martin Karlsson\n\n* Send 500 and close connection if file operations fail","ref":"changelog.html#v2-0-0"},{"type":"extras","title":"v1.0.5 - CHANGELOG","doc":"* Optimization of SSL accept by Tristan Sloughter\n\n* Dependency cleanup by Adam Lindberg","ref":"changelog.html#v1-0-5"},{"type":"extras","title":"v1.0.4 - CHANGELOG","doc":"* OTP 18.0 compatibility, contributed by Florian Odronitz.","ref":"changelog.html#v1-0-4"},{"type":"extras","title":"v1.0.3 - CHANGELOG","doc":"* Various internal cleanup fixes from Andreas Stenius (github.com/kaos)","ref":"changelog.html#v1-0-3"},{"type":"extras","title":"v1.0.2 - CHANGELOG","doc":"* Added `elli_request:get_args_decoded/1` which returns the list of\n query args decoded each time it's called.","ref":"changelog.html#v1-0-2"},{"type":"extras","title":"v1.0.1 - CHANGELOG","doc":"* Fix bug in SSL acceptor pool where due to failed handshakes, Elli\n runs out of acceptors. Thanks to Stefan Grundmann.\n\n* In case a handler (or middleware) returns a response Elli does not\n understand, Elli will now respond with a 500 error. Thanks to\n Johannes Huning.\n\n* Added `elli_request:get_arg_decoded/2,3` which HTTP URI decodes the\n value passed in the request. Thanks to Mariano Valles.","ref":"changelog.html#v1-0-1"},{"type":"extras","title":"v1.0 - CHANGELOG","doc":"* SSL using built-in ssl from Erlang/OTP. Thanks to Maas-Maarten Zeeman.\n\n* \"Handover\" a socket to user code, making it possible to implement\n WebSockets( ).\n\n* Type fixes from Ingo Struck and Andreas Hasselberg.","ref":"changelog.html#v1-0"},{"type":"extras","title":"v0.4.1 - CHANGELOG","doc":"* Fix from Christian Lundgren for browsers that include spaces in the\n value of the Content-Length header.","ref":"changelog.html#v0-4-1"},{"type":"extras","title":"v0.4 - CHANGELOG","doc":"* Added support for sending ranges of a file with sendfile by\n returning `{Code, Headers, {file, Filename, {Offset, Length}}}`. If\n no offset and length is specified, the entire file is sent. The\n user must provide an appropriate \"Content-Length\" and\n \"Content-Range\" header, see the example in\n `elli_example_callback.erl`\n ( ).\n Thanks Vincent Siliakus (zambal).","ref":"changelog.html#v0-4"},{"type":"extras","title":"v0.3 - CHANGELOG","doc":"* Breaking change: Timeouts used in the HTTP protocol are now\n configurable. To implement this, changing a record and some\n callbacks was necessary. To upgrade, a restart of Elli is needed.\n\n* Elli now supports pipelining of any type of request. Some proxies\n or special clients (like ibrowse) will pipeline requests to reduce\n latency.\n\n* If there are no more file descriptors, Elli will shut down. This\n mimics the behaviour found in Yaws.\n\n* Chunked transfer responses will now exit the Elli process when the\n client closes the connection. Sending a synchronous chunk will\n return `{error, closed}` if client has closed the connection and\n the `chunk_complete` event is sent to your callback including which\n end closed the connection.","ref":"changelog.html#v0-3"},{"type":"extras","title":"v0.2.0 - CHANGELOG","doc":"* Breaking change: moved elli_access_log into a separate repository\n at github.com/wooga/elli_access_log. Thanks martinrehfeld.","ref":"changelog.html#v0-2-0"},{"type":"extras","title":"v0.1.3 - CHANGELOG","doc":"* Added elli_test which makes it easy to write unit tests for your\n callbacks. Thanks anha0825.\n\n* Added sendfile support. Thanks chrisavl.","ref":"changelog.html#v0-1-3"},{"type":"extras","title":"v0.1.2 - CHANGELOG","doc":"* Added option to specify listen IP address. Thanks hukl.","ref":"changelog.html#v0-1-2"},{"type":"extras","title":"v0.1.1 - CHANGELOG","doc":"* Don't look up the peer ip address on every request anymore, do it\n on demand using elli_request:peer/1.","ref":"changelog.html#v0-1-1"},{"type":"extras","title":"v0.1 - CHANGELOG","doc":"* Initial release.","ref":"changelog.html#v0-1"},{"type":"extras","title":"LICENSE","doc":"The MIT License\n\nCopyright (c) 2012-2016 Knut Nesheim\nCopyright (c) 2016-2018 elli-lib team\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\nall copies 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\nTHE SOFTWARE.","ref":"license.html"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,50,46,50]}} \ No newline at end of file diff --git a/doc/dist/sidebar_items-FF1D4582.js b/doc/dist/sidebar_items-FF1D4582.js new file mode 100644 index 0000000..1163f4b --- /dev/null +++ b/doc/dist/sidebar_items-FF1D4582.js @@ -0,0 +1 @@ +sidebarNodes={"modules":[{"id":"elli","deprecated":false,"group":"","title":"elli","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","deprecated":false,"title":"body/0","anchor":"t:body/0"},{"id":"header/0","deprecated":false,"title":"header/0","anchor":"t:header/0"},{"id":"headers/0","deprecated":false,"title":"headers/0","anchor":"t:headers/0"},{"id":"http_method/0","deprecated":false,"title":"http_method/0","anchor":"t:http_method/0"},{"id":"req/0","deprecated":false,"title":"req/0","anchor":"t:req/0"},{"id":"response_code/0","deprecated":false,"title":"response_code/0","anchor":"t:response_code/0"},{"id":"state/0","deprecated":false,"title":"state/0","anchor":"t:state/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_acceptors/1","deprecated":false,"title":"get_acceptors(S)","anchor":"get_acceptors/1"},{"id":"get_open_reqs/1","deprecated":false,"title":"get_open_reqs(S)","anchor":"get_open_reqs/1"},{"id":"get_open_reqs/2","deprecated":false,"title":"get_open_reqs(S, Timeout)","anchor":"get_open_reqs/2"},{"id":"set_callback/3","deprecated":false,"title":"set_callback(S, Callback, CallbackArgs)","anchor":"set_callback/3"},{"id":"start_link/0","deprecated":false,"title":"start_link()","anchor":"start_link/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(Opts)","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(Server)","anchor":"stop/1"}],"key":"functions"}]},{"id":"elli_example_callback","deprecated":false,"group":"","title":"elli_example_callback","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"chunk_loop/1","deprecated":false,"title":"chunk_loop(Ref)","anchor":"chunk_loop/1"},{"id":"handle/2","deprecated":false,"title":"handle(Req, _Args)","anchor":"handle/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(Event, Args, Config)","anchor":"handle_event/3"}],"key":"functions"}]},{"id":"elli_example_callback_handover","deprecated":false,"group":"","title":"elli_example_callback_handover","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle/2","deprecated":false,"title":"handle(Req, Args)","anchor":"handle/2"},{"id":"init/2","deprecated":false,"title":"init(Req, Args)","anchor":"init/2"}],"key":"functions"}]},{"id":"elli_handler","deprecated":false,"group":"","title":"elli_handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"callback/0","deprecated":false,"title":"callback/0","anchor":"t:callback/0"},{"id":"callback_args/0","deprecated":false,"title":"callback_args/0","anchor":"t:callback_args/0"},{"id":"callback_mod/0","deprecated":false,"title":"callback_mod/0","anchor":"t:callback_mod/0"},{"id":"event/0","deprecated":false,"title":"event/0","anchor":"t:event/0"},{"id":"result/0","deprecated":false,"title":"result/0","anchor":"t:result/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"handle/2","deprecated":false,"title":"handle/2","anchor":"c:handle/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event/3","anchor":"c:handle_event/3"},{"id":"init/2","deprecated":false,"title":"init/2","anchor":"c:init/2"},{"id":"postprocess/3","deprecated":false,"title":"postprocess/3","anchor":"c:postprocess/3"},{"id":"preprocess/2","deprecated":false,"title":"preprocess/2","anchor":"c:preprocess/2"}],"key":"callbacks"}]},{"id":"elli_http","deprecated":false,"group":"","title":"elli_http","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"version/0","deprecated":false,"title":"version/0","anchor":"t:version/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"accept/4","deprecated":false,"title":"accept(Server, ListenSocket, Options, Callback)","anchor":"accept/4"},{"id":"chunk_loop/1","deprecated":false,"title":"chunk_loop(Socket)","anchor":"chunk_loop/1"},{"id":"close_or_keepalive/2","deprecated":false,"title":"close_or_keepalive(Req, Headers)","anchor":"close_or_keepalive/2"},{"id":"handle_request/4","deprecated":false,"title":"handle_request(Socket, PrevBin, Options, Callback)","anchor":"handle_request/4"},{"id":"keepalive_loop/3","deprecated":false,"title":"keepalive_loop(Socket, Options, Callback)","anchor":"keepalive_loop/3"},{"id":"keepalive_loop/5","deprecated":false,"title":"keepalive_loop(Socket, NumRequests, Buffer, Options, Callback)","anchor":"keepalive_loop/5"},{"id":"mk_req/8","deprecated":false,"title":"mk_req(Method, PathTuple, Headers, Headers, Body, V, Socket, Callback)","anchor":"mk_req/8"},{"id":"mk_req/11","deprecated":false,"title":"mk_req(Method, Scheme, Host, Port, PathTuple, Headers, ParsedHeaders, Body, V, Socket, Callback)","anchor":"mk_req/11"},{"id":"parse_path/1","deprecated":false,"title":"parse_path(_)","anchor":"parse_path/1"},{"id":"send_file/5","deprecated":false,"title":"send_file(Req, Code, Headers, Filename, Range)","anchor":"send_file/5"},{"id":"send_response/4","deprecated":false,"title":"send_response(Req, Code, Headers, UserBody)","anchor":"send_response/4"},{"id":"split_args/1","deprecated":false,"title":"split_args(Qs)","anchor":"split_args/1"},{"id":"start_link/4","deprecated":false,"title":"start_link(Server, ListenSocket, Options, Callback)","anchor":"start_link/4"}],"key":"functions"}]},{"id":"elli_middleware","deprecated":false,"group":"","title":"elli_middleware","sections":[]},{"id":"elli_middleware_compress","deprecated":false,"group":"","title":"elli_middleware_compress","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"postprocess/3","deprecated":false,"title":"postprocess(Req, Result, Config)","anchor":"postprocess/3"}],"key":"functions"}]},{"id":"elli_request","deprecated":false,"group":"","title":"elli_request","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"http_range/0","deprecated":false,"title":"http_range/0","anchor":"t:http_range/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"async_send_chunk/2","deprecated":false,"title":"async_send_chunk(Ref, Data)","anchor":"async_send_chunk/2"},{"id":"body/1","deprecated":false,"title":"body(Req)","anchor":"body/1"},{"id":"body_qs/1","deprecated":false,"title":"body_qs(Req)","anchor":"body_qs/1"},{"id":"chunk_ref/1","deprecated":false,"title":"chunk_ref(Req)","anchor":"chunk_ref/1"},{"id":"close_chunk/1","deprecated":false,"title":"close_chunk(Ref)","anchor":"close_chunk/1"},{"id":"get_arg/2","deprecated":false,"title":"get_arg(Key, Req)","anchor":"get_arg/2"},{"id":"get_arg/3","deprecated":false,"title":"get_arg(Key, Req, Default)","anchor":"get_arg/3"},{"id":"get_arg_decoded/2","deprecated":false,"title":"get_arg_decoded(Key, Req)","anchor":"get_arg_decoded/2"},{"id":"get_arg_decoded/3","deprecated":false,"title":"get_arg_decoded(Key, Req, Default)","anchor":"get_arg_decoded/3"},{"id":"get_args/1","deprecated":false,"title":"get_args(Req)","anchor":"get_args/1"},{"id":"get_args_decoded/1","deprecated":false,"title":"get_args_decoded(Req)","anchor":"get_args_decoded/1"},{"id":"get_header/2","deprecated":false,"title":"get_header(Key, Req)","anchor":"get_header/2"},{"id":"get_header/3","deprecated":false,"title":"get_header(Key, Req, Default)","anchor":"get_header/3"},{"id":"get_range/1","deprecated":false,"title":"get_range(Req)","anchor":"get_range/1"},{"id":"headers/1","deprecated":false,"title":"headers(Req)","anchor":"headers/1"},{"id":"host/1","deprecated":false,"title":"host(Req)","anchor":"host/1"},{"id":"is_request/1","deprecated":false,"title":"is_request(Req)","anchor":"is_request/1"},{"id":"method/1","deprecated":false,"title":"method(Req)","anchor":"method/1"},{"id":"original_headers/1","deprecated":false,"title":"original_headers(Req)","anchor":"original_headers/1"},{"id":"path/1","deprecated":false,"title":"path(Req)","anchor":"path/1"},{"id":"peer/1","deprecated":false,"title":"peer(Req)","anchor":"peer/1"},{"id":"port/1","deprecated":false,"title":"port(Req)","anchor":"port/1"},{"id":"post_arg/2","deprecated":false,"title":"post_arg(Key, Req)","anchor":"post_arg/2"},{"id":"post_arg/3","deprecated":false,"title":"post_arg(Key, Req, Default)","anchor":"post_arg/3"},{"id":"post_arg_decoded/2","deprecated":false,"title":"post_arg_decoded(Key, Req)","anchor":"post_arg_decoded/2"},{"id":"post_arg_decoded/3","deprecated":false,"title":"post_arg_decoded(Key, Req, Default)","anchor":"post_arg_decoded/3"},{"id":"post_args/1","deprecated":false,"title":"post_args(Req)","anchor":"post_args/1"},{"id":"post_args_decoded/1","deprecated":false,"title":"post_args_decoded(Req)","anchor":"post_args_decoded/1"},{"id":"query_str/1","deprecated":false,"title":"query_str(Req)","anchor":"query_str/1"},{"id":"raw_path/1","deprecated":false,"title":"raw_path(Req)","anchor":"raw_path/1"},{"id":"scheme/1","deprecated":false,"title":"scheme(Req)","anchor":"scheme/1"},{"id":"send_chunk/2","deprecated":false,"title":"send_chunk(Ref, Data)","anchor":"send_chunk/2"},{"id":"to_proplist/1","deprecated":false,"title":"to_proplist(Req)","anchor":"to_proplist/1"},{"id":"uri_decode/1","deprecated":false,"title":"uri_decode(Bin)","anchor":"uri_decode/1"}],"key":"functions"}]},{"id":"elli_sendfile","deprecated":false,"group":"","title":"elli_sendfile","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"sendfile_opts/0","deprecated":false,"title":"sendfile_opts/0","anchor":"t:sendfile_opts/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"sendfile/5","deprecated":false,"title":"sendfile(RawFile, Socket, Offset, Bytes, Opts)","anchor":"sendfile/5"}],"key":"functions"}]},{"id":"elli_tcp","deprecated":false,"group":"","title":"elli_tcp","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"socket/0","deprecated":false,"title":"socket/0","anchor":"t:socket/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"accept/3","deprecated":false,"title":"accept(_, Server, Timeout)","anchor":"accept/3"},{"id":"close/1","deprecated":false,"title":"close(_)","anchor":"close/1"},{"id":"listen/3","deprecated":false,"title":"listen(_, Port, Opts)","anchor":"listen/3"},{"id":"peername/1","deprecated":false,"title":"peername(_)","anchor":"peername/1"},{"id":"recv/3","deprecated":false,"title":"recv(_, Size, Timeout)","anchor":"recv/3"},{"id":"send/2","deprecated":false,"title":"send(_, Data)","anchor":"send/2"},{"id":"sendfile/5","deprecated":false,"title":"sendfile(Fd, _, Offset, Length, Opts)","anchor":"sendfile/5"},{"id":"setopts/2","deprecated":false,"title":"setopts(_, Opts)","anchor":"setopts/2"}],"key":"functions"}]},{"id":"elli_test","deprecated":false,"group":"","title":"elli_test","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/5","deprecated":false,"title":"call(Method, Path, Headers, Body, Opts)","anchor":"call/5"}],"key":"functions"}]},{"id":"elli_util","deprecated":false,"group":"","title":"elli_util","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"range/0","deprecated":false,"title":"range/0","anchor":"t:range/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"encode_range/2","deprecated":false,"title":"encode_range(Range, Size)","anchor":"encode_range/2"},{"id":"file_size/1","deprecated":false,"title":"file_size(Filename)","anchor":"file_size/1"},{"id":"normalize_range/2","deprecated":false,"title":"normalize_range(RangeOrSet, Size)","anchor":"normalize_range/2"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"}]},{"id":"readme","group":"","title":"Elli - Erlang web server for HTTP APIs","headers":[{"id":"Installation","anchor":"installation"},{"id":"Usage","anchor":"usage"},{"id":"Examples","anchor":"examples"},{"id":"Further reading","anchor":"further-reading"},{"id":"License","anchor":"license"}]},{"id":"overview","group":"","title":"Elli - Overview","headers":[{"id":"Features","anchor":"features"},{"id":"Extensions","anchor":"extensions"},{"id":"About","anchor":"about"},{"id":"Aren't there enough webservers in the Erlang community already?","anchor":"aren-t-there-enough-webservers-in-the-erlang-community-already"},{"id":"Why another webserver? Isn't this just the NIH syndrome?","anchor":"why-another-webserver-isn-t-this-just-the-nih-syndrome"},{"id":"What makes Elli different?","anchor":"what-makes-elli-different"},{"id":"Performance","anchor":"performance"}]},{"id":"changelog","group":"","title":"CHANGELOG","headers":[{"id":"pre-v4.0.0","anchor":"pre-v4-0-0"},{"id":"v3.3.0","anchor":"v3-3-0"},{"id":"v3.2.0","anchor":"v3-2-0"},{"id":"v3.1.0","anchor":"v3-1-0"},{"id":"v3.0.0","anchor":"v3-0-0"},{"id":"v2.1.2","anchor":"v2-1-2"},{"id":"v2.0.2","anchor":"v2-0-2"},{"id":"v2.0.1","anchor":"v2-0-1"},{"id":"v2.0.0","anchor":"v2-0-0"},{"id":"v1.0.5","anchor":"v1-0-5"},{"id":"v1.0.4","anchor":"v1-0-4"},{"id":"v1.0.3","anchor":"v1-0-3"},{"id":"v1.0.2","anchor":"v1-0-2"},{"id":"v1.0.1","anchor":"v1-0-1"},{"id":"v1.0","anchor":"v1-0"},{"id":"v0.4.1","anchor":"v0-4-1"},{"id":"v0.4","anchor":"v0-4"},{"id":"v0.3","anchor":"v0-3"},{"id":"v0.2.0","anchor":"v0-2-0"},{"id":"v0.1.3","anchor":"v0-1-3"},{"id":"v0.1.2","anchor":"v0-1-2"},{"id":"v0.1.1","anchor":"v0-1-1"},{"id":"v0.1","anchor":"v0-1"}]},{"id":"license","group":"","title":"LICENSE","headers":[]}],"tasks":[]} \ No newline at end of file diff --git a/doc/edoc-info b/doc/edoc-info deleted file mode 100644 index 479d5fc..0000000 --- a/doc/edoc-info +++ /dev/null @@ -1,5 +0,0 @@ -%% encoding: UTF-8 -{application,elli}. -{modules,[elli,elli_example_callback,elli_example_callback_handover, - elli_handler,elli_http,elli_middleware,elli_middleware_compress, - elli_request,elli_sendfile,elli_tcp,elli_test,elli_util]}. diff --git a/doc/elli.epub b/doc/elli.epub new file mode 100644 index 0000000000000000000000000000000000000000..0767cde738a98ac89ce0f3b043a03d9a49250197 GIT binary patch literal 48002 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 + + + + + + + + + + elli — elli v3.3.0 + + + + + + + + + + + + + + +

    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli + (elli v3.3.0) + +

    + + +
    +

    Elli acceptor manager

    This gen_server owns the listen socket and manages the processes accepting on that socket. When a process waiting for accept gets a request, it notifies this gen_server so we can start up another acceptor.

    +
    + +
    + +
    +

    + + + + Summary +

    +
    +

    + Types +

    + +
    +
    + body/0 + +
    + +

    A binary or iolist.

    + +
    + +
    +
    + header/0 + +
    + +
    + +
    +
    + headers/0 + +
    + +
    + +
    + + +

    An uppercase atom representing a known HTTP verb or a binary for other verbs.

    + +
    + +
    +
    + req/0 + +
    + +
    + +
    + + +
    + +
    +
    + state/0 + +
    + +

    Internal state.

    + +
    + +
    +
    +

    + Functions +

    + +
    + + +
    + +
    + + +
    + + + + + +
    +
    + start_link() + +
    + +

    Create an Elli server process as part of a supervision tree, using the default configuration. The same as start_link({callback, elli_example_callback}, {callback_args, []}).

    + +
    + +
    + + +
    + +
    +
    + stop(Server) + +
    + +

    Stop Server.

    + +
    + +
    + +
    + + +
    +

    + + + + Types +

    +
    +
    + + + +
    + +
    + +
    -type body() :: binary() | iolist().
    + +
    + +

    A binary or iolist.

    +
    +
    +
    + + + +
    + +
    + +
    -type header() :: {Key :: binary(), Value :: binary() | string()}.
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -type headers() :: [header()].
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -type http_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | binary().
    + +
    + +

    An uppercase atom representing a known HTTP verb or a binary for other verbs.

    +
    +
    +
    + + + +
    + +
    + +
    -type req() ::
    +          #req{method :: elli:http_method(),
    +               scheme :: undefined | binary(),
    +               host :: undefined | binary(),
    +               port :: undefined | 1..65535,
    +               path :: [binary()],
    +               args :: [{binary(), any()}],
    +               raw_path :: binary(),
    +               version :: elli_http:version(),
    +               headers :: elli:headers(),
    +               original_headers :: elli:headers(),
    +               body :: elli:body(),
    +               pid :: pid(),
    +               socket :: undefined | elli_tcp:socket(),
    +               callback :: elli_handler:callback()}.
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -type response_code() :: 100..999.
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -opaque state()
    + +
    + +

    Internal state.

    +
    +
    + +
    +
    + +
    +

    + + + + Functions +

    +
    +
    + + + +
    + +
    + +
    -spec get_acceptors(atom()) -> {reply, {ok, [ets:tid()]}, state()}.
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -spec get_open_reqs(S :: atom()) -> {reply, {ok, non_neg_integer()}, state()}.
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    get_open_reqs(S, Timeout)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec get_open_reqs(S :: atom(), Timeout :: non_neg_integer()) -> Reply
    +                       when Reply :: {reply, {ok, non_neg_integer()}, state()}.
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    set_callback(S, Callback, CallbackArgs)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec set_callback(S, Callback, CallbackArgs) -> Reply
    +                      when
    +                          S :: atom(),
    +                          Callback :: elli_handler:callback_mod(),
    +                          CallbackArgs :: elli_handler:callback_args(),
    +                          Reply :: {reply, ok, state()}.
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -spec start_link() -> Result
    +                    when
    +                        Result :: {ok, Pid} | ignore | {error, Error},
    +                        Pid :: pid(),
    +                        Error :: {already_started, Pid} | term().
    + +
    + +

    Create an Elli server process as part of a supervision tree, using the default configuration. The same as start_link({callback, elli_example_callback}, {callback_args, []}).

    +
    +
    +
    + + + +
    + +
    + +
    -spec start_link(Opts) -> Result
    +                    when
    +                        Opts :: [{_, _}],
    +                        Result :: {ok, Pid} | ignore | {error, Error},
    +                        Pid :: pid(),
    +                        Error :: {already_started, Pid} | term().
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -spec stop(Server :: atom()) -> ok.
    + +
    + +

    Stop Server.

    +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli.md b/doc/elli.md deleted file mode 100644 index 65ef288..0000000 --- a/doc/elli.md +++ /dev/null @@ -1,181 +0,0 @@ - - -# Module elli # -* [Description](#description) -* [Data Types](#types) -* [Function Index](#index) -* [Function Details](#functions) - -Elli acceptor manager. - -__Behaviours:__ [`gen_server`](gen_server.md). - - - -## Description ## -This gen_server owns the listen socket and manages the processes -accepting on that socket. When a process waiting for accept gets a -request, it notifies this gen_server so we can start up another -acceptor. - - - -## Data Types ## - - - - -### body() ### - - -__abstract datatype__: `body()` - -A binary or iolist. - - - -### header() ### - - -
    
    -header() = {Key::binary(), Value::binary() | string()}
    -
    - - - - -### headers() ### - - -
    
    -headers() = [header()]
    -
    - - - - -### http_method() ### - - -__abstract datatype__: `http_method()` - -An uppercase atom representing a known HTTP verb or a -binary for other verbs. - - - -### req() ### - - -__abstract datatype__: `req()` - -A record representing an HTTP request. - - - -### response_code() ### - - -
    
    -response_code() = 100..999
    -
    - - - - -### state() ### - - -__abstract datatype__: `state()` - -Internal state. - - - -## Function Index ## - - -
    get_acceptors/1
    get_open_reqs/1Equivalent to get_open_reqs(S, 5000).
    get_open_reqs/2
    set_callback/3
    start_link/0Create an Elli server process as part of a supervision tree, using the -default configuration.
    start_link/1
    stop/1Stop Server.
    - - - - -## Function Details ## - - - -### get_acceptors/1 ### - -
    
    -get_acceptors(S::atom()) -> {reply, {ok, [ets:tid()]}, state()}
    -
    -
    - - - -### get_open_reqs/1 ### - -
    
    -get_open_reqs(S::atom()) -> {reply, {ok, non_neg_integer()}, state()}
    -
    -
    - -Equivalent to [`get_open_reqs(S, 5000)`](#get_open_reqs-2). - - - -### get_open_reqs/2 ### - -
    
    -get_open_reqs(S::atom(), Timeout::non_neg_integer()) -> Reply
    -
    - -
    • Reply = {reply, {ok, non_neg_integer()}, state()}
    - - - -### set_callback/3 ### - -
    
    -set_callback(S, Callback, CallbackArgs) -> Reply
    -
    - - - - - -### start_link/0 ### - -
    
    -start_link() -> Result
    -
    - -
    • Result = {ok, Pid} | ignore | {error, Error}
    • Pid = pid()
    • Error = {already_started, Pid} | term()
    - -Equivalent to [`start_link([{callback, elli_example_callback},{callback_args, []}])`](#start_link-1). - -Create an Elli server process as part of a supervision tree, using the -default configuration. - - - -### start_link/1 ### - -
    
    -start_link(Opts) -> Result
    -
    - -
    • Opts = [{term(), term()}]
    • Result = {ok, Pid} | ignore | {error, Error}
    • Pid = pid()
    • Error = {already_started, Pid} | term()
    - - - -### stop/1 ### - -
    
    -stop(Server::atom()) -> {stop, normal, ok, state()}
    -
    -
    - -Stop `Server`. - diff --git a/doc/elli_example_callback.html b/doc/elli_example_callback.html new file mode 100644 index 0000000..82c4faf --- /dev/null +++ b/doc/elli_example_callback.html @@ -0,0 +1,315 @@ + + + + + + + + + + + elli_example_callback — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_example_callback + (elli v3.3.0) + +

    + + +
    +

    Elli example callback

    Your callback needs to implement two functions, handle/2 and handle_event/3. For every request, Elli will call your handle function with the request. When an event happens, like Elli completed a request, there was a parsing error or your handler threw an error, handle_event/3 is called.

    +
    + +
    + +
    +

    + + + + Summary +

    +
    +

    + Functions +

    + +
    + + +

    Send 10 separate chunks to the client. The same as chunk_loop(Ref, 10)

    + +
    + +
    + + +

    Handle a Request. Delegate to our handler function. See handle/3

    + +
    + +
    + + +

    Handle Elli events, fired throughout processing a request.

    + +
    + +
    + +
    + + +
    +

    + + + + Functions +

    +
    +
    + + + +
    + +

    Send 10 separate chunks to the client. The same as chunk_loop(Ref, 10)

    +
    +
    +
    + +
    + + + Link to this function + +

    handle(Req, _Args)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec handle(Req, _Args) -> Result
    +                when
    +                    Req :: elli:req(),
    +                    _Args :: elli_handler:callback_args(),
    +                    Result :: elli_handler:result().
    + +
    + +

    Handle a Request. Delegate to our handler function. See handle/3

    +
    +
    +
    + +
    + + + Link to this function + +

    handle_event(Event, Args, Config)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec handle_event(Event, Args, Config) -> ok
    +                      when
    +                          Event :: elli_handler:event(),
    +                          Args :: elli_handler:callback_args(),
    +                          Config :: [tuple()].
    + +
    + +

    Handle Elli events, fired throughout processing a request.

    elli_startup is sent when Elli is starting up. If you are implementing a middleware, you can use it to spawn processes, create ETS tables or start supervised processes in a supervisor tree.

    request_complete fires *after* Elli has sent the response to the client. Timings contains timestamps (native units) of events like when the connection was accepted, when headers/body parsing finished, when the user callback returns, response sent, etc. Sizes contains response sizes like response headers size, response body or file size. This allows you to collect performance statistics for monitoring your app.

    request_throw, request_error and request_exit events are sent if the user callback code throws an exception, has an error or exits. After triggering this event, a generated response is sent to the user.

    invalid_return is sent if the user callback code returns a term not understood by elli, see elli_http:execute_callback/1. After triggering this event, a generated response is sent to the user.

    chunk_complete fires when a chunked response is completely sent. It's identical to the request_complete event, except instead of the response body you get the atom client or server depending on who closed the connection. Sizes will have the key chunks, which is the total size of all chunks plus encoding overhead.

    request_closed is sent if the client closes the connection when Elli is waiting for the next request on a keep alive connection.

    request_timeout is sent if the client times out when Elli is waiting for the request.

    request_parse_error fires if the request is invalid and cannot be parsed by [erlang:decode_packet/3][decode_packet/3] or it contains a path Elli cannot parse or does not support.

    [decode_packet/3]: http://erlang.org/doc/man/erlang.html#decode_packet-3

    client_closed can be sent from multiple parts of the request handling. It's sent when the client closes the connection or if for any reason the socket is closed unexpectedly. The Where atom tells you in which part of the request processing the closed socket was detected: receiving_headers, receiving_body or before_response.

    client_timeout can as with client_closed be sent from multiple parts of the request handling. If Elli tries to receive data from the client socket and does not receive anything within a timeout, this event fires and the socket is closed.

    bad_request is sent when Elli detects a request is not well formatted or does not conform to the configured limits. Currently the Reason variable can be {too_many_headers, Headers} or {body_size, ContentLength}.

    file_error is sent when the user wants to return a file as a response, but for some reason it cannot be opened.

    +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_example_callback.md b/doc/elli_example_callback.md deleted file mode 100644 index ea4e6f4..0000000 --- a/doc/elli_example_callback.md +++ /dev/null @@ -1,125 +0,0 @@ - - -# Module elli_example_callback # -* [Description](#description) -* [Function Index](#index) -* [Function Details](#functions) - -Elli example callback. - -__Behaviours:__ [`elli_handler`](elli_handler.md). - - - -## Description ## -Your callback needs to implement two functions, [`handle/2`](#handle-2) and -[`handle_event/3`](#handle_event-3). For every request, Elli will call your handle -function with the request. When an event happens, like Elli -completed a request, there was a parsing error or your handler -threw an error, [`handle_event/3`](#handle_event-3) is called. - -## Function Index ## - - -
    chunk_loop/1Send 10 separate chunks to the client.
    handle/2Handle a Request.
    handle_event/3Handle Elli events, fired throughout processing a request.
    - - - - -## Function Details ## - - - -### chunk_loop/1 ### - -`chunk_loop(Ref) -> any()` - -Equivalent to [`chunk_loop(Ref, 10)`](#chunk_loop-2). - -Send 10 separate chunks to the client. - - - -### handle/2 ### - -
    
    -handle(Req, _Args) -> Result
    -
    - - - -Handle a `Req`uest. -Delegate to our handler function. - -__See also:__ [handle/3](#handle-3). - - - -### handle_event/3 ### - -
    
    -handle_event(Event, Args, Config) -> ok
    -
    - - - -Handle Elli events, fired throughout processing a request. - -`elli_startup` is sent when Elli is starting up. If you are -implementing a middleware, you can use it to spawn processes, -create ETS tables or start supervised processes in a supervisor -tree. - -`request_complete` fires *after* Elli has sent the response to the -client. `Timings` contains timestamps (native units) of events like when the -connection was accepted, when headers/body parsing finished, when the -user callback returns, response sent, etc. `Sizes` contains response sizes -like response headers size, response body or file size. -This allows you to collect performance statistics for monitoring your app. - -`request_throw`, `request_error` and `request_exit` events are sent if -the user callback code throws an exception, has an error or -exits. After triggering this event, a generated response is sent to -the user. - -`invalid_return` is sent if the user callback code returns a term not -understood by elli, see [`elli_http:execute_callback/1`](elli_http.md#execute_callback-1). -After triggering this event, a generated response is sent to the user. - -`chunk_complete` fires when a chunked response is completely -sent. It's identical to the `request_complete` event, except instead -of the response body you get the atom `client` or `server` -depending on who closed the connection. `Sizes` will have the key `chunks`, -which is the total size of all chunks plus encoding overhead. - -`request_closed` is sent if the client closes the connection when -Elli is waiting for the next request on a keep alive connection. - -`request_timeout` is sent if the client times out when -Elli is waiting for the request. - -`request_parse_error` fires if the request is invalid and cannot be parsed by -[`erlang:decode_packet/3`][decode_packet/3] or it contains a path Elli cannot -parse or does not support. - -[decode_packet/3]: http://erlang.org/doc/man/erlang.html#decode_packet-3 - -`client_closed` can be sent from multiple parts of the request -handling. It's sent when the client closes the connection or if for -any reason the socket is closed unexpectedly. The `Where` atom -tells you in which part of the request processing the closed socket -was detected: `receiving_headers`, `receiving_body` or `before_response`. - -`client_timeout` can as with `client_closed` be sent from multiple -parts of the request handling. If Elli tries to receive data from -the client socket and does not receive anything within a timeout, -this event fires and the socket is closed. - -`bad_request` is sent when Elli detects a request is not well -formatted or does not conform to the configured limits. Currently -the `Reason` variable can be `{too_many_headers, Headers}` -or `{body_size, ContentLength}`. - -`file_error` is sent when the user wants to return a file as a -response, but for some reason it cannot be opened. - diff --git a/doc/elli_example_callback_handover.html b/doc/elli_example_callback_handover.html new file mode 100644 index 0000000..1764d19 --- /dev/null +++ b/doc/elli_example_callback_handover.html @@ -0,0 +1,267 @@ + + + + + + + + + + + elli_example_callback_handover — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_example_callback_handover + (elli v3.3.0) + +

    + + +
    + +
    +

    + + + + Summary +

    +
    +

    + Functions +

    + +
    + + +
    + +
    + + +

    Return {ok, handover} if Req's path is /hello/world, otherwise ignore.

    + +
    + +
    + +
    + + +
    +

    + + + + Functions +

    +
    +
    + + + +
    + +
    + +
    -spec handle(Req, Args) -> Result
    +                when
    +                    Req :: elli:req(),
    +                    Args :: elli_handler:callback_args(),
    +                    Result :: elli_handler:result().
    + +
    + + +
    +
    +
    + + + +
    + +

    Return {ok, handover} if Req's path is /hello/world, otherwise ignore.

    +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_example_callback_handover.md b/doc/elli_example_callback_handover.md deleted file mode 100644 index 9c6bd8c..0000000 --- a/doc/elli_example_callback_handover.md +++ /dev/null @@ -1,40 +0,0 @@ - - -# Module elli_example_callback_handover # -* [Function Index](#index) -* [Function Details](#functions) - -__Behaviours:__ [`elli_handler`](elli_handler.md). - - - -## Function Index ## - - -
    handle/2
    init/2Return {ok, handover} if Req's path is /hello/world, -otherwise ignore.
    - - - - -## Function Details ## - - - -### handle/2 ### - -
    
    -handle(Req, Args) -> Result
    -
    - - - - - -### init/2 ### - -`init(Req, Args) -> any()` - -Return `{ok, handover}` if `Req`'s path is `/hello/world`, -otherwise `ignore`. - diff --git a/doc/elli_example_middleware.md b/doc/elli_example_middleware.md deleted file mode 100644 index 1ee9405..0000000 --- a/doc/elli_example_middleware.md +++ /dev/null @@ -1,38 +0,0 @@ - - -# Module elli_example_middleware # -* [Function Index](#index) -* [Function Details](#functions) - -__Behaviours:__ [`elli_handler`](elli_handler.md). - - - -## Function Index ## - - -
    do_handle/1*
    handle/2
    handle_event/3
    - - - - -## Function Details ## - - - -### do_handle/1 * ### - -`do_handle(X1) -> any()` - - - -### handle/2 ### - -`handle(Req, Args) -> any()` - - - -### handle_event/3 ### - -`handle_event(Event, Data, Args) -> any()` - diff --git a/doc/elli_handler.html b/doc/elli_handler.html new file mode 100644 index 0000000..00ba47a --- /dev/null +++ b/doc/elli_handler.html @@ -0,0 +1,601 @@ + + + + + + + + + + + elli_handler — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_handler behaviour + (elli v3.3.0) + +

    + + +
    + +
    +

    + + + + Summary +

    +
    +

    + Types +

    + +
    +
    + callback/0 + +
    + +

    A tuple of a t:callback_mod() and t:callback_args().

    + +
    + +
    + + +

    Arguments to pass to a t:callback_mod()

    + +
    + +
    + + +

    A callback module.

    + +
    + +
    +
    + event/0 + +
    + +

    Fired throughout processing a request. See elli_example_callback:handle_event/3 for descriptions.

    + +
    + +
    +
    + result/0 + +
    + +
    + +
    +
    +

    + Callbacks +

    + +
    +
    + handle/2 + +
    + +
    + +
    + + +
    + +
    +
    + init/2 + +
    + +
    + +
    + + +
    + +
    +
    + preprocess/2 + +
    + +
    + +
    + +
    + + +
    +

    + + + + Types +

    +
    +
    + + + +
    + +
    + +
    -type callback() :: {callback_mod(), callback_args()}.
    + +
    + +

    A tuple of a t:callback_mod() and t:callback_args().

    +
    +
    +
    + + + +
    + +
    + +
    -type callback_args() :: list().
    + +
    + +

    Arguments to pass to a t:callback_mod()

    +
    +
    +
    + + + +
    + +
    + +
    -type callback_mod() :: module().
    + +
    + +

    A callback module.

    +
    +
    +
    + + + +
    + +
    + +
    -type event() ::
    +          elli_startup | bad_request | file_error | chunk_complete | request_complete | request_throw |
    +          request_error | request_exit | request_closed | request_parse_error | client_closed |
    +          client_timeout | invalid_return.
    + +
    + +

    Fired throughout processing a request. See elli_example_callback:handle_event/3 for descriptions.

    +
    +
    +
    + + + +
    + +
    + +
    -type result() ::
    +          {elli:response_code() | ok,
    +           elli:headers(),
    +           {file, file:name_all()} | {file, file:name_all(), elli_util:range()}} |
    +          {elli:response_code() | ok, elli:headers(), elli:body()} |
    +          {elli:response_code() | ok, elli:body()} |
    +          {chunk, elli:headers()} |
    +          {chunk, elli:headers(), elli:body()} |
    +          ignore.
    + +
    + + +
    +
    + +
    +
    + +
    +

    + + + + Callbacks +

    +
    +
    + + + +
    + +
    + +
    -callback handle(Req :: elli:req(), callback_args()) -> result().
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -callback handle_event(Event, Args, Config) -> ok
    +                          when Event :: event(), Args :: callback_args(), Config :: [tuple()].
    + +
    + + +
    +
    +
    + +
    + + + Link to this callback + +

    init/2

    + + + + View Source + + + + (optional) + +
    + +
    + +
    + +
    -callback init(Req, Args) -> {ok, standard | handover} when Req :: elli:req(), Args :: callback_args().
    + +
    + + +
    +
    +
    + +
    + + + Link to this callback + +

    postprocess/3

    + + + + View Source + + + + (optional) + +
    + +
    + +
    + +
    -callback postprocess(Req, Res1, Args) -> Res2
    +                         when Req :: elli:req(), Res1 :: result(), Args :: callback_args(), Res2 :: result().
    + +
    + + +
    +
    +
    + +
    + + + Link to this callback + +

    preprocess/2

    + + + + View Source + + + + (optional) + +
    + +
    + +
    + +
    -callback preprocess(Req1, Args) -> Req2
    +                        when Req1 :: elli:req(), Args :: callback_args(), Req2 :: elli:req().
    + +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_handler.md b/doc/elli_handler.md deleted file mode 100644 index 5ba6bc5..0000000 --- a/doc/elli_handler.md +++ /dev/null @@ -1,58 +0,0 @@ - - -# Module elli_handler # -* [Data Types](#types) - -__This module defines the `elli_handler` behaviour.__
    Required callback functions: `handle/2`, `handle_event/3`. - - - -## Data Types ## - - - - -### callback() ### - - -__abstract datatype__: `callback()` - -A tuple of a callback_mod() and callback_args(). - - - -### callback_args() ### - - -__abstract datatype__: `callback_args()` - -Arguments to pass to a callback_mod(). - - - -### callback_mod() ### - - -__abstract datatype__: `callback_mod()` - -A callback module. - - - -### event() ### - - -__abstract datatype__: `event()` - -Fired throughout processing a request. -See [`elli_example_callback:handle_event/3`](elli_example_callback.md#handle_event-3) for descriptions. - - - -### result() ### - - -
    
    -result() = {elli:response_code() | ok, elli:headers(), {file, file:name_all()} | {file, file:name_all(), elli_util:range()}} | {elli:response_code() | ok, elli:headers(), elli:body()} | {elli:response_code() | ok, elli:body()} | {chunk, elli:headers()} | {chunk, elli:headers(), elli:body()} | ignore
    -
    - diff --git a/doc/elli_http.html b/doc/elli_http.html new file mode 100644 index 0000000..105bb96 --- /dev/null +++ b/doc/elli_http.html @@ -0,0 +1,736 @@ + + + + + + + + + + + elli_http — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_http + (elli v3.3.0) + +

    + + +
    +

    Elli HTTP request implementation

    An elli_http process blocks in elli_tcp:accept/3 until a client connects. It then handles requests on that connection until it's closed either by the client timing out or explicitly by the user.

    +
    + +
    + +
    +

    + + + + Summary +

    +
    +

    + Types +

    + +
    +
    + version/0 + +
    + +

    HTTP version as a tuple, i.e. {0, 9} | {1, 0} | {1, 1}.

    + +
    + +
    +
    +

    + Functions +

    + +
    + + +

    Accept on the socket until a client connects. Handle the request, then loop if we're using keep alive or chunked transfer. If elli_tcp:accept/3 doesn't return a socket within a configurable timeout, loop to allow code upgrades of this module.

    + +
    + +
    + + +
    + +
    + + +

    Return the preferred session handling setting to close or keep the current session alive based on the presence of a header or the standard default based on the version of HTTP of the request.

    + +
    + +
    + + +

    Handle a HTTP request that will possibly come on the socket. Returns the appropriate connection token and any buffer containing (parts of) the next request.

    + +
    + +
    + + +

    Handle multiple requests on the same connection, i.e. "keep alive".

    + +
    + + + + + + + +
    + + +
    + +
    + + +

    Send a HTTP response to the client where the body is the contents of the given file. Assumes correctly set response code and headers.

    + +
    + +
    + + +

    Generate a HTTP response and send it to the client.

    + +
    + +
    + + +

    Split the URL arguments into a proplist. Lifted from cowboy_http:x_www_form_urlencoded/2.

    + +
    + + + +
    + +
    + + +
    +

    + + + + Types +

    +
    +
    + + + +
    + +
    + +
    -type version() :: {0, 9} | {1, 0} | {1, 1}.
    + +
    + +

    HTTP version as a tuple, i.e. {0, 9} | {1, 0} | {1, 1}.

    +
    +
    + +
    +
    + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    accept(Server, ListenSocket, Options, Callback)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec accept(Server, ListenSocket, Options, Callback) -> ok
    +                when
    +                    Server :: pid(),
    +                    ListenSocket :: elli_tcp:socket(),
    +                    Options :: proplists:proplist(),
    +                    Callback :: elli_handler:callback().
    + +
    + +

    Accept on the socket until a client connects. Handle the request, then loop if we're using keep alive or chunked transfer. If elli_tcp:accept/3 doesn't return a socket within a configurable timeout, loop to allow code upgrades of this module.

    +
    +
    +
    + +
    + + + Link to this function + +

    chunk_loop(Socket)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    close_or_keepalive(Req, Headers)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec close_or_keepalive(Req, Headers) -> KeepaliveOpt
    +                            when
    +                                Req :: elli:req(),
    +                                Headers :: elli:headers(),
    +                                KeepaliveOpt :: close | keep_alive.
    + +
    + +

    Return the preferred session handling setting to close or keep the current session alive based on the presence of a header or the standard default based on the version of HTTP of the request.

    +
    +
    +
    + +
    + + + Link to this function + +

    handle_request(Socket, PrevBin, Options, Callback)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec handle_request(Socket, PrevBin, Options, Callback) -> ConnToken
    +                        when
    +                            Socket :: elli_tcp:socket(),
    +                            PrevBin :: binary(),
    +                            Options :: proplists:proplist(),
    +                            Callback :: elli_handler:callback(),
    +                            ConnToken :: {keep_alive | close, binary()}.
    + +
    + +

    Handle a HTTP request that will possibly come on the socket. Returns the appropriate connection token and any buffer containing (parts of) the next request.

    +
    +
    +
    + +
    + + + Link to this function + +

    keepalive_loop(Socket, Options, Callback)

    + + + + View Source + + + +
    + +
    + +

    Handle multiple requests on the same connection, i.e. "keep alive".

    +
    +
    +
    + +
    + + + Link to this function + +

    keepalive_loop(Socket, NumRequests, Buffer, Options, Callback)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    mk_req(Method, PathTuple, Headers, Headers, Body, V, Socket, Callback)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec mk_req(Method, PathTuple, Headers, Headers, Body, V, Socket, Callback) -> Req
    +                when
    +                    Method :: elli:http_method(),
    +                    PathTuple :: {PathType :: atom(), RawPath :: binary()},
    +                    Headers :: elli:headers(),
    +                    Body :: elli:body(),
    +                    V :: version(),
    +                    Socket :: elli_tcp:socket() | undefined,
    +                    Callback :: elli_handler:callback(),
    +                    Req :: elli:req().
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    mk_req(Method, Scheme, Host, Port, PathTuple, Headers, ParsedHeaders, Body, V, Socket, Callback)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    send_file(Req, Code, Headers, Filename, Range)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec send_file(Req, Code, Headers, Filename, Range) -> ok
    +                   when
    +                       Req :: elli:req(),
    +                       Code :: elli:response_code(),
    +                       Headers :: elli:headers(),
    +                       Filename :: file:filename(),
    +                       Range :: elli_util:range().
    + +
    + +

    Send a HTTP response to the client where the body is the contents of the given file. Assumes correctly set response code and headers.

    +
    +
    +
    + +
    + + + Link to this function + +

    send_response(Req, Code, Headers, UserBody)

    + + + + View Source + + + +
    + +
    + +

    Generate a HTTP response and send it to the client.

    +
    +
    +
    + + + +
    + +
    + +
    -spec split_args(binary()) -> [{binary(), binary() | true}].
    + +
    + +

    Split the URL arguments into a proplist. Lifted from cowboy_http:x_www_form_urlencoded/2.

    +
    +
    +
    + +
    + + + Link to this function + +

    start_link(Server, ListenSocket, Options, Callback)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec start_link(Server, ListenSocket, Options, Callback) -> pid()
    +                    when
    +                        Server :: pid(),
    +                        ListenSocket :: elli_tcp:socket(),
    +                        Options :: proplists:proplist(),
    +                        Callback :: elli_handler:callback().
    + +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_http.md b/doc/elli_http.md deleted file mode 100644 index 72f5a78..0000000 --- a/doc/elli_http.md +++ /dev/null @@ -1,143 +0,0 @@ - - -# Module elli_http # -* [Description](#description) -* [Data Types](#types) -* [Function Index](#index) -* [Function Details](#functions) - -Elli HTTP request implementation. - - - -## Description ## -An elli_http process blocks in elli_tcp:accept/2 until a client -connects. It then handles requests on that connection until it's -closed either by the client timing out or explicitly by the user. - - -## Data Types ## - - - - -### version() ### - - -__abstract datatype__: `version()` - -HTTP version as a tuple, i.e. `{0, 9} | {1, 0} | {1, 1}`. - - - -## Function Index ## - - -
    accept/4Accept on the socket until a client connects.
    chunk_loop/1
    handle_request/4Handle a HTTP request that will possibly come on the socket.
    keepalive_loop/3Handle multiple requests on the same connection, i.e.
    keepalive_loop/5
    mk_req/10
    mk_req/7
    parse_path/1
    send_response/4Generate a HTTP response and send it to the client.
    split_args/1Split the URL arguments into a proplist.
    start_link/4
    - - - - -## Function Details ## - - - -### accept/4 ### - -
    
    -accept(Server, ListenSocket, Options, Callback) -> ok
    -
    - - - -Accept on the socket until a client connects. -Handle the request, then loop if we're using keep alive or chunked transfer. -If [`elli_tcp:accept/3`](elli_tcp.md#accept-3) doesn't return a socket within a configurable -timeout, loop to allow code upgrades of this module. - - - -### chunk_loop/1 ### - -`chunk_loop(Socket) -> any()` - - - -### handle_request/4 ### - -
    
    -handle_request(Socket, PrevBin, Options, Callback) -> ConnToken
    -
    - - - -Handle a HTTP request that will possibly come on the socket. -Returns the appropriate connection token and any buffer containing (parts of) -the next request. - - - -### keepalive_loop/3 ### - -`keepalive_loop(Socket, Options, Callback) -> any()` - -Handle multiple requests on the same connection, i.e. `"keep alive"`. - - - -### keepalive_loop/5 ### - -`keepalive_loop(Socket, NumRequests, Buffer, Options, Callback) -> any()` - - - -### mk_req/10 ### - -`mk_req(Method, Scheme, Host, Port, PathTuple, Headers, Body, V, Socket, Callback) -> any()` - - - -### mk_req/7 ### - -
    
    -mk_req(Method, PathTuple, Headers, Body, V, Socket, Callback) -> Req
    -
    - - - - - -### parse_path/1 ### - -`parse_path(X1) -> any()` - - - -### send_response/4 ### - -`send_response(Req, Code, Headers, UserBody) -> any()` - -Generate a HTTP response and send it to the client. - - - -### split_args/1 ### - -
    
    -split_args(Qs::binary()) -> [{binary(), binary() | true}]
    -
    -
    - -Split the URL arguments into a proplist. -Lifted from `cowboy_http:x_www_form_urlencoded/2`. - - - -### start_link/4 ### - -
    
    -start_link(Server, ListenSocket, Options, Callback) -> pid()
    -
    - - - diff --git a/doc/elli_middleware.html b/doc/elli_middleware.html new file mode 100644 index 0000000..2f545dd --- /dev/null +++ b/doc/elli_middleware.html @@ -0,0 +1,182 @@ + + + + + + + + + + + elli_middleware — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_middleware + (elli v3.3.0) + +

    + + +
    +

    HTTP request processing middleware.

    This module offers both pre-processing of requests and post-processing of responses. It can also be used to allow multiple handlers, where the first handler to return a response short-circuits the request. It is implemented as a plain elli handler.

    Usage:

       Config = [
    +             {mods, [
    +                     {elli_example_middleware, []},
    +                     {elli_middleware_compress, []},
    +                     {elli_example_callback, []}
    +                    ]}
    +            ],
    +   elli:start_link([
    +                    %% ...,
    +                    {callback, elli_middleware},
    +                    {callback_args, Config}
    +                   ]).

    The configured modules may implement the elli behaviour, in which case all the callbacks will be used as normal. If link handle/2 returns ignore, elli will continue on to the next callback in the list.

    Pre-processing and post-processing is implemented in preprocess/2 and postprocess/3. preprocess/2 is called for each middleware in the order specified, while postprocess/3 is called in the reverse order.

    +
    + +
    + + + +
    +
    +
    + + + + diff --git a/doc/elli_middleware.md b/doc/elli_middleware.md deleted file mode 100644 index 48e9ffc..0000000 --- a/doc/elli_middleware.md +++ /dev/null @@ -1,43 +0,0 @@ - - -# Module elli_middleware # -* [Description](#description) - -HTTP request processing middleware. - -__Behaviours:__ [`elli_handler`](elli_handler.md). - - - -## Description ## - -This module offers both pre-processing of requests and post-processing of -responses. It can also be used to allow multiple handlers, where the first -handler to return a response short-circuits the request. -It is implemented as a plain elli handler. - -Usage: - -``` - Config = [ - {mods, [ - {elli_example_middleware, []}, - {elli_middleware_compress, []}, - {elli_example_callback, []} - ]} - ], - elli:start_link([ - %% ..., - {callback, elli_middleware}, - {callback_args, Config} - ]). -``` - -The configured modules may implement the elli behaviour, in which case all -the callbacks will be used as normal. If [`handle/2`](#handle-2) returns `ignore`, -elli will continue on to the next callback in the list. - -Pre-processing and post-processing is implemented in [`preprocess/2`](#preprocess-2) -and [`postprocess/3`](#postprocess-3). [`preprocess/2`](#preprocess-2) is called for each -middleware in the order specified, while [`postprocess/3`](#postprocess-3) is called in -the reverse order. diff --git a/doc/elli_middleware_compress.html b/doc/elli_middleware_compress.html new file mode 100644 index 0000000..cbd4d7a --- /dev/null +++ b/doc/elli_middleware_compress.html @@ -0,0 +1,241 @@ + + + + + + + + + + + elli_middleware_compress — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_middleware_compress + (elli v3.3.0) + +

    + + +
    +

    Response compression as Elli middleware.

    +
    + +
    + +
    +

    + + + + Summary +

    +
    +

    + Functions +

    + +
    + + +

    Postprocess all requests and compress bodies larger than compress_byte_size (1024 by default).

    + +
    + +
    + +
    + + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    postprocess(Req, Result, Config)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec postprocess(Req, Result, Config) -> Result
    +                     when
    +                         Req :: elli:req(),
    +                         Result :: elli_handler:result(),
    +                         Config :: [{compress_byte_size, non_neg_integer()} | tuple()].
    + +
    + +

    Postprocess all requests and compress bodies larger than compress_byte_size (1024 by default).

    +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_middleware_compress.md b/doc/elli_middleware_compress.md deleted file mode 100644 index 1937765..0000000 --- a/doc/elli_middleware_compress.md +++ /dev/null @@ -1,35 +0,0 @@ - - -# Module elli_middleware_compress # -* [Description](#description) -* [Function Index](#index) -* [Function Details](#functions) - -Response compression as Elli middleware. - - - -## Function Index ## - - -
    postprocess/3Postprocess all requests and compress bodies larger than -compress_byte_size (1024 by default).
    - - - - -## Function Details ## - - - -### postprocess/3 ### - -
    
    -postprocess(Req, Result, Config) -> Result
    -
    - - - -Postprocess all requests and compress bodies larger than -`compress_byte_size` (`1024` by default). - diff --git a/doc/elli_request.html b/doc/elli_request.html new file mode 100644 index 0000000..8d3729e --- /dev/null +++ b/doc/elli_request.html @@ -0,0 +1,1326 @@ + + + + + + + + + + + elli_request — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_request + (elli v3.3.0) + +

    + + +
    + +
    +

    + + + + Summary +

    +
    +

    + Types +

    + +
    +
    + http_range/0 + +
    + +
    + +
    +
    +

    + Functions +

    + +
    + + +

    Send a chunk asynchronously.

    + +
    + +
    +
    + body(Req) + +
    + +

    Return the body.

    + +
    + +
    +
    + body_qs(Req) + +
    + +

    Parse application/x-www-form-urlencoded body into a proplist.

    + +
    + +
    + + +

    Return a reference that can be used to send chunks to the client. If the protocol does not support it, return {error, not_supported}.

    + +
    + +
    + + +

    Explicitly close the chunked connection. Return {error, closed} if the client already closed the connection. The same as send_chunk(Ref, close)

    + +
    + +
    + + +
    + + + + + + + +
    + + +

    Return a proplist of keys and values of the original query string. Both keys and values in the returned proplists will be binaries or the atom true in case no value was supplied for the query value.

    + +
    + +
    + + +
    + +
    + + +
    + + + +
    + + +

    Parse the Range header from the request. The result is either a [http_range()] or the atom parse_error. Use elli_util:normalize_range/2 to get a validated, normalized range.

    + +
    + +
    +
    + headers(Req) + +
    + +

    Return the headers that have had string:casefold/1 run on each key.

    + +
    + +
    +
    + host(Req) + +
    + +

    Return the host.

    + +
    + +
    + + +
    + +
    +
    + method(Req) + +
    + +

    Return the method.

    + +
    + +
    + + +

    Return the original headers.

    + +
    + +
    +
    + path(Req) + +
    + +

    Return path split into binary parts.

    + +
    + +
    +
    + peer(Req) + +
    + +
    + +
    +
    + port(Req) + +
    + +

    Return the port.

    + +
    + +
    + + +
    + + + + + + + +
    + + +
    + + + +
    + + +

    Calculate the query string associated with a given Request as a binary.

    + +
    + +
    + + +

    Return the raw_path, i.e. not split or parsed for query params.

    + +
    + +
    +
    + scheme(Req) + +
    + +

    Return the scheme.

    + +
    + +
    + + +

    Send a chunk synchronously. If the referenced process is dead, return early with {error, closed}, instead of timing out.

    + +
    + +
    + + +

    Serialize the Request record to a proplist. Useful for logging.

    + +
    + +
    + + +
    + +
    + +
    + + +
    +

    + + + + Types +

    +
    +
    + + + +
    + +
    + +
    -type http_range() ::
    +          {First :: non_neg_integer(), Last :: non_neg_integer()} |
    +          {offset, Offset :: non_neg_integer()} |
    +          {suffix, Length :: pos_integer()}.
    + +
    + + +
    +
    + +
    +
    + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    async_send_chunk(Ref, Data)

    + + + + View Source + + + +
    + +
    + +

    Send a chunk asynchronously.

    +
    +
    +
    + + + +
    + +

    Return the body.

    +
    +
    +
    + + + +
    + +

    Parse application/x-www-form-urlencoded body into a proplist.

    +
    +
    +
    + + + +
    + +

    Return a reference that can be used to send chunks to the client. If the protocol does not support it, return {error, not_supported}.

    +
    +
    +
    + + + +
    + +

    Explicitly close the chunked connection. Return {error, closed} if the client already closed the connection. The same as send_chunk(Ref, close)

    +
    +
    +
    + + + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    get_arg(Key, Req, Default)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    get_arg_decoded(Key, Req)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    get_arg_decoded(Key, Req, Default)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -spec get_args(elli:req()) -> QueryArgs :: proplists:proplist().
    + +
    + +

    Return a proplist of keys and values of the original query string. Both keys and values in the returned proplists will be binaries or the atom true in case no value was supplied for the query value.

    +
    +
    +
    + +
    + + + Link to this function + +

    get_args_decoded(Req)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    get_header(Key, Req)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    get_header(Key, Req, Default)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -spec get_range(elli:req()) -> [http_range()] | parse_error.
    + +
    + +

    Parse the Range header from the request. The result is either a [http_range()] or the atom parse_error. Use elli_util:normalize_range/2 to get a validated, normalized range.

    +
    +
    +
    + + + +
    + +

    Return the headers that have had string:casefold/1 run on each key.

    +
    +
    +
    + + + +
    + +

    Return the host.

    +
    +
    +
    + + + +
    + + +
    +
    +
    + + + +
    + +

    Return the method.

    +
    +
    +
    + +
    + + + Link to this function + +

    original_headers(Req)

    + + + + View Source + + + +
    + +
    + +

    Return the original headers.

    +
    +
    +
    + + + +
    + +

    Return path split into binary parts.

    +
    +
    +
    + + + +
    + + +
    +
    +
    + + + +
    + +

    Return the port.

    +
    +
    +
    + +
    + + + Link to this function + +

    post_arg(Key, Req)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    post_arg(Key, Req, Default)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    post_arg_decoded(Key, Req)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    post_arg_decoded(Key, Req, Default)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    post_args_decoded(Req)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + +
    + +
    -spec query_str(elli:req()) -> QueryStr :: binary().
    + +
    + +

    Calculate the query string associated with a given Request as a binary.

    +
    +
    +
    + + + +
    + +

    Return the raw_path, i.e. not split or parsed for query params.

    +
    +
    +
    + + + +
    + +

    Return the scheme.

    +
    +
    +
    + +
    + + + Link to this function + +

    send_chunk(Ref, Data)

    + + + + View Source + + + +
    + +
    + +

    Send a chunk synchronously. If the referenced process is dead, return early with {error, closed}, instead of timing out.

    +
    +
    +
    + + + +
    + +

    Serialize the Request record to a proplist. Useful for logging.

    +
    +
    +
    + + + +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_request.md b/doc/elli_request.md deleted file mode 100644 index 0ecd08d..0000000 --- a/doc/elli_request.md +++ /dev/null @@ -1,295 +0,0 @@ - - -# Module elli_request # -* [Data Types](#types) -* [Function Index](#index) -* [Function Details](#functions) - - - -## Data Types ## - - - - -### http_range() ### - - -
    
    -http_range() = {First::non_neg_integer(), Last::non_neg_integer()} | {offset, Offset::non_neg_integer()} | {suffix, Length::pos_integer()}
    -
    - - - -## Function Index ## - - -
    async_send_chunk/2Send a chunk asynchronously.
    body/1Return the body.
    body_qs/1Parse application/x-www-form-urlencoded body into a proplist.
    chunk_ref/1Return a reference that can be used to send chunks to the client.
    close_chunk/1Explicitly close the chunked connection.
    get_arg/2Equivalent to get_arg(Key, Req, undefined).
    get_arg/3Equivalent to proplists:get_value(Key, Args, Default).
    get_arg_decoded/2Equivalent to get_arg_decoded(Key, Req, undefined).
    get_arg_decoded/3
    get_args/1Return a proplist of keys and values of the original query string.
    get_args_decoded/1
    get_header/2Equivalent to proplists:get_value(Key, Headers).
    get_header/3Equivalent to proplists:get_value(Key, Headers, Default).
    get_range/1Parse the Range header from the request.
    headers/1Return the headers.
    host/1Return the host.
    is_request/1
    method/1Return the method.
    path/1Return path split into binary parts.
    peer/1
    port/1Return the port.
    post_arg/2Equivalent to post_arg(Key, Req, undefined).
    post_arg/3
    post_arg_decoded/2Equivalent to post_arg_decoded(Key, Req, undefined).
    post_arg_decoded/3
    post_args/1
    post_args_decoded/1
    query_str/1Calculate the query string associated with a given Request -as a binary.
    raw_path/1Return the raw_path, i.e.
    scheme/1Return the scheme.
    send_chunk/2Send a chunk synchronously.
    to_proplist/1Serialize the Request record to a proplist.
    - - - - -## Function Details ## - - - -### async_send_chunk/2 ### - -`async_send_chunk(Ref, Data) -> any()` - -Send a chunk asynchronously. - - - -### body/1 ### - -`body(Req) -> any()` - -Return the `body`. - - - -### body_qs/1 ### - -`body_qs(Req) -> any()` - -Parse `application/x-www-form-urlencoded` body into a proplist. - - - -### chunk_ref/1 ### - -`chunk_ref(Req) -> any()` - -Return a reference that can be used to send chunks to the client. -If the protocol does not support it, return `{error, not_supported}`. - - - -### close_chunk/1 ### - -`close_chunk(Ref) -> any()` - -Equivalent to [`send_chunk(Ref, close)`](#send_chunk-2). - -Explicitly close the chunked connection. -Return `{error, closed}` if the client already closed the connection. - - - -### get_arg/2 ### - -`get_arg(Key, Req) -> any()` - -Equivalent to [`get_arg(Key, Req, undefined)`](#get_arg-3). - - - -### get_arg/3 ### - -`get_arg(Key, Req, Default) -> any()` - -Equivalent to [`proplists:get_value(Key, Args, Default)`](proplists.md#get_value-3). - - - -### get_arg_decoded/2 ### - -`get_arg_decoded(Key, Req) -> any()` - -Equivalent to [`get_arg_decoded(Key, Req, undefined)`](#get_arg_decoded-3). - - - -### get_arg_decoded/3 ### - -`get_arg_decoded(Key, Req, Default) -> any()` - - - -### get_args/1 ### - -
    
    -get_args(Req::elli:req()) -> QueryArgs::proplists:proplist()
    -
    -
    - -Return a proplist of keys and values of the original query string. -Both keys and values in the returned proplists will be binaries or the atom -`true` in case no value was supplied for the query value. - - - -### get_args_decoded/1 ### - -`get_args_decoded(Req) -> any()` - - - -### get_header/2 ### - -`get_header(Key, Req) -> any()` - -Equivalent to [`proplists:get_value(Key, Headers)`](proplists.md#get_value-2). - - - -### get_header/3 ### - -`get_header(Key, Req, Default) -> any()` - -Equivalent to [`proplists:get_value(Key, Headers, Default)`](proplists.md#get_value-3). - - - -### get_range/1 ### - -
    
    -get_range(Req::elli:req()) -> [http_range()] | parse_error
    -
    -
    - -Parse the `Range` header from the request. -The result is either a `byte_range_set()` or the atom `parse_error`. -Use [`elli_util:normalize_range/2`](elli_util.md#normalize_range-2) to get a validated, normalized range. - - - -### headers/1 ### - -`headers(Req) -> any()` - -Return the `headers`. - - - -### host/1 ### - -`host(Req) -> any()` - -Return the `host`. - - - -### is_request/1 ### - -`is_request(Req) -> any()` - - - -### method/1 ### - -`method(Req) -> any()` - -Return the `method`. - - - -### path/1 ### - -`path(Req) -> any()` - -Return `path` split into binary parts. - - - -### peer/1 ### - -`peer(Req) -> any()` - - - -### port/1 ### - -`port(Req) -> any()` - -Return the `port`. - - - -### post_arg/2 ### - -`post_arg(Key, Req) -> any()` - -Equivalent to [`post_arg(Key, Req, undefined)`](#post_arg-3). - - - -### post_arg/3 ### - -`post_arg(Key, Req, Default) -> any()` - - - -### post_arg_decoded/2 ### - -`post_arg_decoded(Key, Req) -> any()` - -Equivalent to [`post_arg_decoded(Key, Req, undefined)`](#post_arg_decoded-3). - - - -### post_arg_decoded/3 ### - -`post_arg_decoded(Key, Req, Default) -> any()` - - - -### post_args/1 ### - -`post_args(Req) -> any()` - - - -### post_args_decoded/1 ### - -`post_args_decoded(Req) -> any()` - - - -### query_str/1 ### - -
    
    -query_str(Req::elli:req()) -> QueryStr::binary()
    -
    -
    - -Calculate the query string associated with a given `Request` -as a binary. - - - -### raw_path/1 ### - -`raw_path(Req) -> any()` - -Return the `raw_path`, i.e. not split or parsed for query params. - - - -### scheme/1 ### - -`scheme(Req) -> any()` - -Return the `scheme`. - - - -### send_chunk/2 ### - -`send_chunk(Ref, Data) -> any()` - -Send a chunk synchronously. -If the referenced process is dead, return early with `{error, closed}`, -instead of timing out. - - - -### to_proplist/1 ### - -`to_proplist(Req) -> any()` - -Serialize the `Req`uest record to a proplist. -Useful for logging. - diff --git a/doc/elli_sendfile.html b/doc/elli_sendfile.html new file mode 100644 index 0000000..f4a094c --- /dev/null +++ b/doc/elli_sendfile.html @@ -0,0 +1,292 @@ + + + + + + + + + + + elli_sendfile — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_sendfile + (elli v3.3.0) + +

    + + +
    + +
    +

    + + + + Summary +

    +
    +

    + Types +

    + +
    + + +
    + +
    +
    +

    + Functions +

    + +
    + + +

    Send part of a file on a socket.

    + +
    + +
    + +
    + + +
    +

    + + + + Types +

    +
    +
    + + + +
    + +
    + +
    -type sendfile_opts() :: [{chunk_size, non_neg_integer()}].
    + +
    + + +
    +
    + +
    +
    + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    sendfile(RawFile, Socket, Offset, Bytes, Opts)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec sendfile(file:fd(),
    +               inet:socket() | ssl:sslsocket(),
    +               non_neg_integer(),
    +               non_neg_integer(),
    +               sendfile_opts()) ->
    +                  {ok, non_neg_integer()} | {error, atom()}.
    + +
    + +

    Send part of a file on a socket.

    Basically, see file:sendfile/5 but for ssl (i.e. not raw OS sockets). Originally from https://github.com/ninenines/ranch/pull/41/files

    +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_sendfile.md b/doc/elli_sendfile.md deleted file mode 100644 index 2d0125d..0000000 --- a/doc/elli_sendfile.md +++ /dev/null @@ -1,47 +0,0 @@ - - -# Module elli_sendfile # -* [Data Types](#types) -* [Function Index](#index) -* [Function Details](#functions) - - - -## Data Types ## - - - - -### sendfile_opts() ### - - -
    
    -sendfile_opts() = [{chunk_size, non_neg_integer()}]
    -
    - - - -## Function Index ## - - -
    sendfile/5Send part of a file on a socket.
    - - - - -## Function Details ## - - - -### sendfile/5 ### - -
    
    -sendfile(RawFile::file:fd(), Socket::elli_tcp:socket(), Offset::non_neg_integer(), Bytes::non_neg_integer(), Opts::sendfile_opts()) -> {ok, non_neg_integer()} | {error, atom()}
    -
    -
    - -Send part of a file on a socket. - -Basically, @see file:sendfile/5 but for ssl (i.e. not raw OS sockets). -Originally from https://github.com/ninenines/ranch/pull/41/files - diff --git a/doc/elli_tcp.html b/doc/elli_tcp.html new file mode 100644 index 0000000..e60cda7 --- /dev/null +++ b/doc/elli_tcp.html @@ -0,0 +1,493 @@ + + + + + + + + + + + elli_tcp — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_tcp + (elli v3.3.0) + +

    + + +
    +

    Wrapper for plain and SSL sockets. Based on mochiweb_socket.erl.

    +
    + +
    + +
    +

    + + + + Summary +

    +
    +

    + Types +

    + +
    +
    + socket/0 + +
    + +
    + +
    +
    +

    + Functions +

    + + + +
    +
    + close(_) + +
    + +
    + +
    + + +
    + +
    +
    + peername(_) + +
    + +
    + + + +
    + + +
    + + + +
    + + +
    + +
    + +
    + + +
    +

    + + + + Types +

    +
    +
    + + + +
    + +
    + +
    -type socket() :: {plain, inet:socket()} | {ssl, ssl:sslsocket()}.
    + +
    + + +
    +
    + +
    +
    + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    accept(_, Server, Timeout)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    listen(_, Port, Opts)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    recv(_, Size, Timeout)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + + +
    +
    +
    + +
    + + + Link to this function + +

    sendfile(Fd, _, Offset, Length, Opts)

    + + + + View Source + + + +
    + +
    + + +
    +
    +
    + + + +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_tcp.md b/doc/elli_tcp.md deleted file mode 100644 index 762002b..0000000 --- a/doc/elli_tcp.md +++ /dev/null @@ -1,88 +0,0 @@ - - -# Module elli_tcp # -* [Description](#description) -* [Data Types](#types) -* [Function Index](#index) -* [Function Details](#functions) - -Wrapper for plain and SSL sockets. - - - -## Description ## -Based on `mochiweb_socket.erl`. - - -## Data Types ## - - - - -### socket() ### - - -
    
    -socket() = {plain, inet:socket()} | {ssl, ssl:sslsocket()}
    -
    - - - -## Function Index ## - - -
    accept/3
    close/1
    listen/3
    peername/1
    recv/3
    send/2
    sendfile/5
    setopts/2
    - - - - -## Function Details ## - - - -### accept/3 ### - -`accept(X1, Server, Timeout) -> any()` - - - -### close/1 ### - -`close(X1) -> any()` - - - -### listen/3 ### - -`listen(X1, Port, Opts) -> any()` - - - -### peername/1 ### - -`peername(X1) -> any()` - - - -### recv/3 ### - -`recv(X1, Size, Timeout) -> any()` - - - -### send/2 ### - -`send(X1, Data) -> any()` - - - -### sendfile/5 ### - -`sendfile(Fd, X2, Offset, Length, Opts) -> any()` - - - -### setopts/2 ### - -`setopts(X1, Opts) -> any()` - diff --git a/doc/elli_test.html b/doc/elli_test.html new file mode 100644 index 0000000..d4ee004 --- /dev/null +++ b/doc/elli_test.html @@ -0,0 +1,241 @@ + + + + + + + + + + + elli_test — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_test + (elli v3.3.0) + +

    + + +
    +

    Helper for calling your Elli callback in unit tests. Only the callback specified is actually run. Elli's response handling is not used, so the headers will for example not include a content length and the return format is not standardized. The unit tests below test elli_example_callback.

    +
    + +
    + +
    +

    + + + + Summary +

    + + +
    + + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    call(Method, Path, Headers, Body, Opts)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec call(Method, Path, Headers, Body, Opts) -> elli_handler:result()
    +              when
    +                  Method :: elli:http_method(),
    +                  Path :: binary(),
    +                  Headers :: elli:headers(),
    +                  Body :: elli:body(),
    +                  Opts :: proplists:proplist().
    + +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_test.md b/doc/elli_test.md deleted file mode 100644 index 12f4df9..0000000 --- a/doc/elli_test.md +++ /dev/null @@ -1,39 +0,0 @@ - - -# Module elli_test # -* [Description](#description) -* [Function Index](#index) -* [Function Details](#functions) - -Helper for calling your Elli callback in unit tests. - -__Authors:__ Andreas Hasselberg ([`andreas.hasselberg@gmail.com`](mailto:andreas.hasselberg@gmail.com)). - - - -## Description ## -Only the callback specified is actually run. Elli's response handling is not -used, so the headers will for example not include a content length and the -return format is not standardized. -The unit tests below test `elli_example_callback`. - -## Function Index ## - - -
    call/5
    - - - - -## Function Details ## - - - -### call/5 ### - -
    
    -call(Method, Path, Headers, Body, Opts) -> elli_handler:result()
    -
    - - - diff --git a/doc/elli_util.html b/doc/elli_util.html new file mode 100644 index 0000000..c329d84 --- /dev/null +++ b/doc/elli_util.html @@ -0,0 +1,371 @@ + + + + + + + + + + + elli_util — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + elli_util + (elli v3.3.0) + +

    + + +
    + +
    +

    + + + + Summary +

    +
    +

    + Types +

    + +
    +
    + range/0 + +
    + +
    + +
    +
    +

    + Functions +

    + +
    + + +

    Encode Range to a Content-Range value.

    + +
    + +
    + + +

    Get the size, in bytes, of the file.

    + +
    + +
    + + +

    If a valid byte-range, or byte-range-set of size 1, is supplied, returns a normalized range in the format {Offset, Length}. Returns undefined when an empty byte-range-set is supplied and the atom invalid_range in all other cases.

    + +
    + +
    + +
    + + +
    +

    + + + + Types +

    +
    +
    + + + +
    + +
    + +
    -type range() :: {Offset :: non_neg_integer(), Length :: non_neg_integer()}.
    + +
    + + +
    +
    + +
    +
    + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    encode_range(Range, Size)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec encode_range(Range :: range() | invalid_range, Size :: non_neg_integer()) -> ByteRange :: iolist().
    + +
    + +

    Encode Range to a Content-Range value.

    +
    +
    +
    + +
    + + + Link to this function + +

    file_size(Filename)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec file_size(Filename) -> Size | {error, Reason}
    +                   when
    +                       Filename :: file:name_all(),
    +                       Size :: non_neg_integer(),
    +                       Reason :: file:posix() | badarg | invalid_file.
    + +
    + +

    Get the size, in bytes, of the file.

    +
    +
    +
    + +
    + + + Link to this function + +

    normalize_range(RangeOrSet, Size)

    + + + + View Source + + + +
    + +
    + +
    + +
    -spec normalize_range(RangeOrSet, Size) -> Normalized
    +                         when
    +                             RangeOrSet :: any(),
    +                             Size :: integer(),
    +                             Normalized :: range() | undefined | invalid_range.
    + +
    + +

    If a valid byte-range, or byte-range-set of size 1, is supplied, returns a normalized range in the format {Offset, Length}. Returns undefined when an empty byte-range-set is supplied and the atom invalid_range in all other cases.

    +
    +
    + +
    +
    + + +
    +
    +
    + + + + diff --git a/doc/elli_util.md b/doc/elli_util.md deleted file mode 100644 index de10432..0000000 --- a/doc/elli_util.md +++ /dev/null @@ -1,73 +0,0 @@ - - -# Module elli_util # -* [Data Types](#types) -* [Function Index](#index) -* [Function Details](#functions) - - - -## Data Types ## - - - - -### range() ### - - -
    
    -range() = {Offset::non_neg_integer(), Length::non_neg_integer()}
    -
    - - - -## Function Index ## - - -
    encode_range/2 Encode Range to a Content-Range value.
    file_size/1 Get the size in bytes of the file.
    normalize_range/2 If a valid byte-range, or byte-range-set of size 1 -is supplied, returns a normalized range in the format -{Offset, Length}.
    - - - - -## Function Details ## - - - -### encode_range/2 ### - -
    
    -encode_range(Range::range() | invalid_range, Size::non_neg_integer()) -> ByteRange::iolist()
    -
    -
    - -Encode Range to a Content-Range value. - - - -### file_size/1 ### - -
    
    -file_size(Filename) -> Size | {error, Reason}
    -
    - - - -Get the size in bytes of the file. - - - -### normalize_range/2 ### - -
    
    -normalize_range(RangeOrSet, Size) -> Normalized
    -
    - -
    • RangeOrSet = any()
    • Size = integer()
    • Normalized = range() | undefined | invalid_range
    - -If a valid byte-range, or byte-range-set of size 1 -is supplied, returns a normalized range in the format -{Offset, Length}. Returns undefined when an empty byte-range-set -is supplied and the atom `invalid_range` in all other cases. - diff --git a/doc/erlang.png b/doc/erlang.png deleted file mode 100644 index 987a618e2403af895bfaf8c2f929e3a4f3746659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2109 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 diff --git a/doc/github-pandoc.css b/doc/github-pandoc.css deleted file mode 100644 index 0607023..0000000 --- a/doc/github-pandoc.css +++ /dev/null @@ -1,424 +0,0 @@ -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ - -/* ========================================================================== - HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined in IE 8/9. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -/** - * Correct `inline-block` display not defined in IE 8/9. - */ - -audio, -canvas, -video { - display: inline-block; -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9. - * Hide the `template` element in IE, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* ========================================================================== - Base - ========================================================================== */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* ========================================================================== - Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background: transparent; -} - -/** - * Address `outline` inconsistency between Chrome and other browsers. - */ - -a:focus { - outline: thin dotted; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* ========================================================================== - Typography - ========================================================================== */ - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari 5, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9, Safari 5, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari 5 and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Correct font family set oddly in Safari 5 and Chrome. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -/** - * Improve readability of pre-formatted text in all browsers. - */ - -pre { - white-space: pre-wrap; -} - -/** - * Set consistent quote types. - */ - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* ========================================================================== - Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9. - */ - -img { - border: 0; -} - -/** - * Correct overflow displayed oddly in IE 9. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* ========================================================================== - Figures - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari 5. - */ - -figure { - margin: 0; -} - -/* ========================================================================== - Forms - ========================================================================== */ - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * 1. Correct font family not being inherited in all browsers. - * 2. Correct font size not being inherited in all browsers. - * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. - */ - -button, -input, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -button, -input { - line-height: normal; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. - * Correct `select` style inheritance in Firefox 4+ and Opera. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari 5 and Chrome - * on OS X. - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * 1. Remove default vertical scrollbar in IE 8/9. - * 2. Improve readability and alignment in all browsers. - */ - -textarea { - overflow: auto; /* 1 */ - vertical-align: top; /* 2 */ -} - -/* ========================================================================== - Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -.go-top { -position: fixed; -bottom: 2em; -right: 2em; -text-decoration: none; -background-color: #E0E0E0; -font-size: 12px; -padding: 1em; -display: inline; -} - -/* Github css */ - -html,body{ margin: auto; - padding-right: 1em; - padding-left: 1em; - max-width: 44em; color:black;}*:not('#mkdbuttons'){margin:0;padding:0}body{font:13.34px helvetica,arial,freesans,clean,sans-serif;-webkit-font-smoothing:subpixel-antialiased;line-height:1.4;padding:3px;background:#fff;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}p{margin:1em 0}a{color:#4183c4;text-decoration:none}body{background-color:#fff;padding:30px;margin:15px;font-size:14px;line-height:1.6}body>*:first-child{margin-top:0!important}body>*:last-child{margin-bottom:0!important}@media screen{body{box-shadow:0 0 0 1px #cacaca,0 0 0 4px #eee}}h1,h2,h3,h4,h5,h6{margin:20px 0 10px;padding:0;font-weight:bold;-webkit-font-smoothing:subpixel-antialiased;cursor:text}h1{font-size:28px;color:#000}h2{font-size:24px;border-bottom:1px solid #ccc;color:#000}h3{font-size:18px;color:#333}h4{font-size:16px;color:#333}h5{font-size:14px;color:#333}h6{color:#777;font-size:14px}p,blockquote,table,pre{margin:15px 0}ul{padding-left:30px}ol{padding-left:30px}ol li ul:first-of-type{margin-top:0}hr{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0;border:0 none;color:#ccc;height:4px;padding:0}body>h2:first-child{margin-top:0;padding-top:0}body>h1:first-child{margin-top:0;padding-top:0}body>h1:first-child+h2{margin-top:0;padding-top:0}body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child{margin-top:0;padding-top:0}a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6{margin-top:0;padding-top:0}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p,ul li>:first-child,ol li>:first-child{margin-top:0}dl{padding:0}dl dt{font-size:14px;font-weight:bold;font-style:italic;padding:0;margin:15px 0 5px}dl dt:first-child{padding:0}dl dt>:first-child{margin-top:0}dl dt>:last-child{margin-bottom:0}dl dd{margin:0 0 15px;padding:0 15px}dl dd>:first-child{margin-top:0}dl dd>:last-child{margin-bottom:0}blockquote{border-left:4px solid #DDD;padding:0 15px;color:#777}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}table{border-collapse:collapse;border-spacing:0;font-size:100%;font:inherit}table th{font-weight:bold;border:1px solid #ccc;padding:6px 13px}table td{border:1px solid #ccc;padding:6px 13px}table tr{border-top:1px solid #ccc;background-color:#fff}table tr:nth-child(2n){background-color:#f8f8f8}img{max-width:100%}code,tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;color:#333}pre>code{margin:0;padding:0;white-space:pre;border:0;background:transparent}.highlight pre{background-color:#f8f8f8;border:1px solid #ccc;font-size:13px;line-height:19px;overflow:auto;padding:6px 10px;border-radius:3px}pre{background-color:#f8f8f8;border:1px solid #ccc;font-size:13px;line-height:19px;overflow:auto;padding:6px 10px;border-radius:3px}pre code,pre tt{background-color:transparent;border:0}.poetry pre{font-family:Georgia,Garamond,serif!important;font-style:italic;font-size:110%!important;line-height:1.6em;display:block;margin-left:1em}.poetry pre code{font-family:Georgia,Garamond,serif!important;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;white-space:pre-wrap}sup,sub,a.footnote{font-size:1.4ex;height:0;line-height:1;vertical-align:super;position:relative}sub{vertical-align:sub;top:-1px}@media print{body{background:#fff}img,pre,blockquote,table,figure{page-break-inside:avoid}body{background:#fff;border:0}code{background-color:#fff;color:#333!important;padding:0 .2em;border:1px solid #dedede}pre{background:#fff}pre code{background-color:white!important;overflow:visible}}@media screen{body.inverted{color:#eee!important;border-color:#555;box-shadow:none}.inverted body,.inverted hr .inverted p,.inverted td,.inverted li,.inverted h1,.inverted h2,.inverted h3,.inverted h4,.inverted h5,.inverted h6,.inverted th,.inverted .math,.inverted caption,.inverted dd,.inverted dt,.inverted blockquote{color:#eee!important;border-color:#555;box-shadow:none}.inverted td,.inverted th{background:#333}.inverted h2{border-color:#555}.inverted hr{border-color:#777;border-width:1px!important}::selection{background:rgba(157,193,200,0.5)}h1::selection{background-color:rgba(45,156,208,0.3)}h2::selection{background-color:rgba(90,182,224,0.3)}h3::selection,h4::selection,h5::selection,h6::selection,li::selection,ol::selection{background-color:rgba(133,201,232,0.3)}code::selection{background-color:rgba(0,0,0,0.7);color:#eee}code span::selection{background-color:rgba(0,0,0,0.7)!important;color:#eee!important}a::selection{background-color:rgba(255,230,102,0.2)}.inverted a::selection{background-color:rgba(255,230,102,0.6)}td::selection,th::selection,caption::selection{background-color:rgba(180,237,95,0.5)}.inverted{background:#0b2531;background:#252a2a}.inverted body{background:#252a2a}.inverted a{color:#acd1d5}}.highlight .c{color:#998;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .k,.highlight .o{font-weight:bold}.highlight .cm{color:#998;font-style:italic}.highlight .cp{color:#999;font-weight:bold}.highlight .c1{color:#998;font-style:italic}.highlight .cs{color:#999;font-weight:bold;font-style:italic}.highlight .gd{color:#000;background-color:#fdd}.highlight .gd .x{color:#000;background-color:#faa}.highlight .ge{font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000;background-color:#dfd}.highlight .gi .x{color:#000;background-color:#afa}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#a00}.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr{font-weight:bold}.highlight .kt{color:#458;font-weight:bold}.highlight .m{color:#099}.highlight .s{color:#d14}.highlight .na{color:#008080}.highlight .nb{color:#0086b3}.highlight .nc{color:#458;font-weight:bold}.highlight .no{color:#008080}.highlight .ni{color:#800080}.highlight .ne,.highlight .nf{color:#900;font-weight:bold}.highlight .nn{color:#555}.highlight .nt{color:#000080}.highlight .nv{color:#008080}.highlight .ow{font-weight:bold}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#099}.highlight .sb,.highlight .sc,.highlight .sd,.highlight .s2,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .bp{color:#999}.highlight .vc,.highlight .vg,.highlight .vi{color:#008080}.highlight .il{color:#099}.highlight .gc{color:#999;background-color:#eaf2f5}.type-csharp .highlight .k,.type-csharp .highlight .kt{color:#00F}.type-csharp .highlight .nf{color:#000;font-weight:normal}.type-csharp .highlight .nc{color:#2b91af}.type-csharp .highlight .nn{color:#000}.type-csharp .highlight .s,.type-csharp .highlight .sc{color:#a31515} diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..e009ec8 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,10 @@ + + + + + elli v3.3.0 — Documentation + + + + + diff --git a/doc/index.md b/doc/index.md deleted file mode 100644 index 2f1d9e6..0000000 --- a/doc/index.md +++ /dev/null @@ -1,305 +0,0 @@ -# elli - Erlang web server for HTTP APIs - -[![Hex.pm][hex badge]][hex package] -[![Documentation][doc badge]][docs] -[![Erlang][erlang badge]][erlang downloads] -[![Travis CI][travis badge]][travis builds] -[![Coverage Status][coveralls badge]][coveralls link] -[![MIT License][license badge]](LICENSE) - -[travis builds]: https://travis-ci.org/elli-lib/elli -[travis badge]: https://travis-ci.org/elli-lib/elli.svg -[hex badge]: https://img.shields.io/hexpm/v/elli.svg -[hex package]: https://hex.pm/packages/elli -[latest release]: https://github.com/elli-lib/elli/releases/latest -[erlang badge]: https://img.shields.io/badge/erlang-%E2%89%A518.0-red.svg -[erlang downloads]: http://www.erlang.org/downloads -[doc badge]: https://img.shields.io/badge/docs-edown-green.svg -[docs]: doc/README.md -[coveralls badge]: https://coveralls.io/repos/github/elli-lib/elli/badge.svg?branch=develop -[coveralls link]: https://coveralls.io/github/elli-lib/elli?branch=develop -[license badge]: https://img.shields.io/badge/license-MIT-blue.svg - -Elli is a webserver you can run inside your Erlang application to -expose an HTTP API. Elli is a aimed exclusively at building -high-throughput, low-latency HTTP APIs. If robustness and performance -is more important than general purpose features, then `elli` might be -for you. If you find yourself digging into the implementation of a -webserver, `elli` might be for you. If you're building web services, -not web sites, then `elli` might be for you. - -Elli is used in production at Wooga and Game Analytics. Elli requires -OTP 18.0 or newer. - - -## Installation - -To use `elli` you will need a working installation of Erlang 18.0 (or later). - -Add `elli` to your application by adding it as a dependency to your -[`rebar.config`](http://www.rebar3.org/docs/configuration): - -```erlang -{deps, [elli]}. -``` - -Afterwards you can run: - -```sh -$ rebar3 compile -``` - - -## Usage -```sh -$ rebar3 shell -``` - -```erlang -%% starting elli -1> {ok, Pid} = elli:start_link([{callback, elli_example_callback}, {port, 3000}]). -``` - -## Examples - -### Callback Module - -The best source to learn how to write a callback module -is [src/elli_example_callback.erl](src/elli_example_callback.erl) and -its [generated documentation](doc/elli_example_callback.md). There are a bunch -of examples used in the tests as well as descriptions of all the events. - -A minimal callback module could look like this: - -```erlang --module(elli_minimal_callback). --export([handle/2, handle_event/3]). - --include_lib("elli/include/elli.hrl"). --behaviour(elli_handler). - -handle(Req, _Args) -> - %% Delegate to our handler function - handle(Req#req.method, elli_request:path(Req), Req). - -handle('GET',[<<"hello">>, <<"world">>], _Req) -> - %% Reply with a normal response. `ok' can be used instead of `200' - %% to signal success. - {ok, [], <<"Hello World!">>}; - -handle(_, _, _Req) -> - {404, [], <<"Not Found">>}. - -%% @doc Handle request events, like request completed, exception -%% thrown, client timeout, etc. Must return `ok'. -handle_event(_Event, _Data, _Args) -> - ok. -``` - - -### Supervisor Childspec - -To add `elli` to a supervisor you can use the following example and adapt it to -your needs. - -```erlang --module(fancyapi_sup). --behaviour(supervisor). --export([start_link/0]). --export([init/1]). - -start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). - -init([]) -> - ElliOpts = [{callback, fancyapi_callback}, {port, 3000}], - ElliSpec = { - fancy_http, - {elli, start_link, [ElliOpts]}, - permanent, - 5000, - worker, - [elli]}, - - {ok, { {one_for_one, 5, 10}, [ElliSpec]} }. -``` - - -## Features - -Here's the features Elli _does_ have: - -* [Rack][]-style request-response. Your handler function gets a - complete request and returns a complete response. There's no - messaging, no receiving data directly from the socket, no writing - responses directly to the socket. It's a very simple and - straightforward API. Have a look at [`elli_example_callback`](elli_example_callback.md) -for examples. - -* Middlewares allow you to add useful features like compression, -encoding, stats, but only have it used when needed. No features you -don't use on the critical path. - -* Short-circuiting of responses using exceptions, allows you to use - "assertions" that return for example 403 permission - denied. `is_allowed(Req) orelse throw({403, [], <<"Permission - denied">>})`. - -* Every client connection gets its own process, isolating the failure -of a request from another. For the duration of the connection, only -one process is involved, resulting in very robust and efficient -code. - -* Binaries everywhere for strings. - -* Instrumentation inside the core of the webserver, triggering user - callbacks. For example when a request completes, the user callback - gets the `request_complete` event which contains timings of all the -different parts of handling a request. There's also events for -clients unexpectedly closing a connection, crashes in the user -callback, etc. - -* Keep alive, using one Erlang process per connection only active -when there is a request from the client. Number of connections is -only limited by RAM and CPU. - -* Chunked transfer in responses for real-time push to clients - -* Basic pipelining. HTTP verbs that does not have side-effects(`GET` - and `HEAD`) can be pipelined, ie. a client supporting pipelining -can send multiple requests down the line and expect the responses -to appear in the same order as requests. Elli processes the -requests one at a time in order, future work could make it possible -to process them in parallel. - -* SSL using built-in Erlang/OTP ssl, nice for low volume admin -interfaces, etc. For high volume, you should probably go with -nginx, stunnel or ELB if you're on AWS. - -* Implement your own connection handling, for WebSockets, streaming - uploads, etc. See [`elli_example_callback_handover`](elli_example_callback_handover.md). - -## Extensions - -* [elli_access_log](https://github.com/elli-lib/elli_access_log): -Access log -* [elli_basicauth](https://github.com/elli-lib/elli_basicauth): -Basic auth -* [elli_chatterbox](https://github.com/elli-lib/elli_chatterbox): -HTTP/2 support -* [elli_cloudfront](https://github.com/elli-lib/elli_cloudfront): -CloudFront signed URLs -* [elli_cookie](https://github.com/elli-lib/elli_cookie): -Cookies -* [elli_date](https://github.com/elli-lib/elli_date): -"Date" header -* [elli_fileserve](https://github.com/elli-lib/elli_fileserve): -Static content -* [elli_prometheus](https://github.com/elli-lib/elli_prometheus): -Prometheus -* [elli_stats](https://github.com/elli-lib/elli_stats): -Real-time statistics dashboard -* [elli_websockets](https://github.com/elli-lib/elli_websocket): -WebSockets -* [elli_xpblfe](https://github.com/elli-lib/elli_xpblfe): -X-Powered-By LFE - -## About - -From operating and debugging high-volume, low-latency apps we have -gained some valuable insight into what we want from a webserver. We -want simplicity, robustness, performance, ease of debugging, -visibility into strange client behaviour, really good instrumentation -and good tests. We are willing to sacrifice almost everything, even -basic features to achieve this. - -With this in mind we looked at the big names in the Erlang -community: [Yaws][], [Mochiweb][], [Misultin][] and [Cowboy][]. We -found [Mochiweb][] to be the best match. However, we also wanted to -see if we could take the architecture of [Mochiweb][] and improve on -it. `elli` takes the acceptor-turns-into-request-handler idea found -in [Mochiweb][], the binaries-only idea from [Cowboy][] and the -request-response idea from [WSGI][]/[Rack][] (with chunked transfer -being an exception). - -On top of this we built a handler that allows us to write HTTP -middleware modules to add practical features, like compression of -responses, HTTP access log with timings, a real-time statistics -dashboard and chaining multiple request handlers. - -## Aren't there enough webservers in the Erlang community already? - -There are a few very mature and robust projects with steady -development, one recently ceased development and one new kid on the -block with lots of interest. As `elli` is not a general purpose -webserver, but more of a specialized tool, we believe it has a very -different target audience and would not attract effort or users away -from the big names. - -## Why another webserver? Isn't this just the NIH syndrome? - -[Yaws][], [Mochiweb][], [Misultin][], and [Cowboy][] are great -projects, hardened over time and full of very useful features for web -development. If you value developer productivity, [Yaws][] is an -excellent choice. If you want a fast and lightweight -server, [Mochiweb][] and [Cowboy][] are excellent choices. - -Having used and studied all of these projects, we believed that if we -merged some of the existing ideas and added some ideas from other -communities, we could create a core that was better for our use cases. - -It started out as an experiment to see if it is at all possible to -significantly improve and it turns out that for our particular use -cases, there is enough improvement to warrant a new project. - -## What makes Elli different? - -Elli has a very simple architecture. It avoids using more processes -and messages than absolutely necessary. It uses binaries for -strings. The request-response programming model allows middlewares to -do much heavy lifting, so the core can stay very simple. It has been -instrumented so as a user you can understand where time is spent. When -things go wrong, like the client closed the connection before you -could send a response, you are notified about these things so you can -better understand your client behaviour. - -## Performance - -"Hello World!" micro-benchmarks are really useful when measuring the -performance of the webserver itself, but the numbers usually do more -harm than good when released. I encourage you to run your own -benchmarks, on your own hardware. Mark Nottingham has some -[very good pointers](http://www.mnot.net/blog/2011/05/18/http_benchmark_rules) -about benchmarking HTTP servers. - -[Yaws]: https://github.com/klacke/yaws -[Mochiweb]: https://github.com/mochi/mochiweb -[Misultin]: https://github.com/ostinelli/misultin -[Cowboy]: https://github.com/ninenines/cowboy -[WSGI]: https://www.python.org/dev/peps/pep-3333/ -[Rack]: https://github.com/rack/rack - - -## Modules ## - - - - - - - - - - - - - - -
    elli
    elli_example_callback
    elli_example_callback_handover
    elli_handler
    elli_http
    elli_middleware
    elli_middleware_compress
    elli_request
    elli_sendfile
    elli_tcp
    elli_test
    elli_util
    - - -## License - -Elli is licensed under [The MIT License](LICENSE). - -Copyright (c) 2012-2016 Knut Nesheim, 2016-2018 elli-lib team diff --git a/doc/license.html b/doc/license.html new file mode 100644 index 0000000..2f10025 --- /dev/null +++ b/doc/license.html @@ -0,0 +1,207 @@ + + + + + + + + + + + LICENSE — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + + LICENSE +

    + +
    +The MIT License
    +
    +Copyright (c) 2012-2016 Knut Nesheim
    +Copyright (c) 2016-2018 elli-lib team
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy
    +of this software and associated documentation files (the "Software"), to deal
    +in the Software without restriction, including without limitation the rights
    +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    +copies of the Software, and to permit persons to whom the Software is
    +furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in
    +all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    +THE SOFTWARE.
    +
    +
    + + + +
    +
    +
    + + + + diff --git a/doc/overview.edoc b/doc/overview.edoc deleted file mode 100644 index be8cd8c..0000000 --- a/doc/overview.edoc +++ /dev/null @@ -1,167 +0,0 @@ -@author Knut Nesheim -@author elli-lib team -@copyright 2012-2016 Knut Nesheim, 2016-2018 elli-lib team -@version 3.0.0 -@title elli -@doc Erlang web server for HTTP APIs - -## Features - -Here's the features Elli does have: - - * [Rack][]-style request-response. Your handler function gets a - complete request and returns a complete response. There's no - messaging, no receiving data directly from the socket, no writing - responses directly to the socket. It's a very simple and - straightforward API. Have a look at {@link elli_example_callback} - for examples. - - * Middlewares allow you to add useful features like compression, - encoding, stats, but only have it used when needed. No features you - don't use on the critical path. - - * Short-circuiting of responses using exceptions, allows you to use - "assertions" that return for example 403 permission - denied. `is_allowed(Req) orelse throw({403, [], <<"Permission - denied">>})'. - - * Every client connection gets its own process, isolating the failure - of a request from another. For the duration of the connection, only - one process is involved, resulting in very robust and efficient - code. - - * Binaries everywhere for strings. - - * Instrumentation inside the core of the webserver, triggering user - callbacks. For example when a request completes, the user callback - gets the `request_complete' event which contains timings of all the - different parts of handling a request. There's also events for - clients unexpectedly closing a connection, crashes in the user - callback, etc. - - * Keep alive, using one Erlang process per connection only active - when there is a request from the client. Number of connections is - only limited by RAM and CPU. - - * Chunked transfer in responses for real-time push to clients - - * Basic pipelining. HTTP verbs that does not have side-effects(`GET' - and `HEAD') can be pipelined, ie. a client supporting pipelining - can send multiple requests down the line and expect the responses - to appear in the same order as requests. Elli processes the - requests one at a time in order, future work could make it possible - to process them in parallel. - - * SSL using built-in Erlang/OTP ssl, nice for low volume admin - interfaces, etc. For high volume, you should probably go with - nginx, stunnel or ELB if you're on AWS. - - * Implement your own connection handling, for WebSockets, streaming - uploads, etc. See {@link elli_example_callback_handover}. - - -## Extensions - - * [elli_access_log](https://github.com/elli-lib/elli_access_log): - Access log - * [elli_basicauth](https://github.com/elli-lib/elli_basicauth): - Basic auth - * [elli_chatterbox](https://github.com/elli-lib/elli_chatterbox): - HTTP/2 support - * [elli_cloudfront](https://github.com/elli-lib/elli_cloudfront): - CloudFront signed URLs - * [elli_cookie](https://github.com/elli-lib/elli_cookie): - Cookies - * [elli_date](https://github.com/elli-lib/elli_date): - "Date" header - * [elli_fileserve](https://github.com/elli-lib/elli_fileserve): - Static content - * [elli_prometheus](https://github.com/elli-lib/elli_prometheus): - Prometheus - * [elli_stats](https://github.com/elli-lib/elli_stats): - Real-time statistics dashboard - * [elli_websockets](https://github.com/elli-lib/elli_websocket): - WebSockets - * [elli_xpblfe](https://github.com/elli-lib/elli_xpblfe): - X-Powered-By LFE - - -## About - -From operating and debugging high-volume, low-latency apps we have -gained some valuable insight into what we want from a webserver. We -want simplicity, robustness, performance, ease of debugging, -visibility into strange client behaviour, really good instrumentation -and good tests. We are willing to sacrifice almost everything, even -basic features to achieve this. - -With this in mind we looked at the big names in the Erlang -community: [Yaws][], [Mochiweb][], [Misultin][] and [Cowboy][]. We -found [Mochiweb][] to be the best match. However, we also wanted to -see if we could take the architecture of [Mochiweb][] and improve on -it. `elli' takes the acceptor-turns-into-request-handler idea found -in [Mochiweb][], the binaries-only idea from [Cowboy][] and the -request-response idea from [WSGI][]/[Rack][] (with chunked transfer -being an exception). - -On top of this we built a handler that allows us to write HTTP -middleware modules to add practical features, like compression of -responses, HTTP access log with timings, a real-time statistics -dashboard and chaining multiple request handlers. - - -## Aren't there enough webservers in the Erlang community already? - -There are a few very mature and robust projects with steady -development, one recently ceased development and one new kid on the -block with lots of interest. As `elli' is not a general purpose -webserver, but more of a specialized tool, we believe it has a very -different target audience and would not attract effort or users away -from the big names. - - -## Why another webserver? Isn't this just the NIH syndrome? - -[Yaws][], [Mochiweb][], [Misultin][], and [Cowboy][] are great -projects, hardened over time and full of very useful features for web -development. If you value developer productivity, [Yaws][] is an -excellent choice. If you want a fast and lightweight -server, [Mochiweb][] and [Cowboy][] are excellent choices. - -Having used and studied all of these projects, we believed that if we -merged some of the existing ideas and added some ideas from other -communities, we could create a core that was better for our use cases. - -It started out as an experiment to see if it is at all possible to -significantly improve and it turns out that for our particular use -cases, there is enough improvement to warrant a new project. - - -## What makes Elli different? - -Elli has a very simple architecture. It avoids using more processes -and messages than absolutely necessary. It uses binaries for -strings. The request-response programming model allows middlewares to -do much heavy lifting, so the core can stay very simple. It has been -instrumented so as a user you can understand where time is spent. When -things go wrong, like the client closed the connection before you -could send a response, you are notified about these things so you can -better understand your client behaviour. - -## Performance - -"Hello World!" micro-benchmarks are really useful when measuring the -performance of the webserver itself, but the numbers usually do more -harm than good when released. I encourage you to run your own -benchmarks, on your own hardware. Mark Nottingham has some -[very good pointers](http://www.mnot.net/blog/2011/05/18/http_benchmark_rules) -about benchmarking HTTP servers. - - - -[Yaws]: https://github.com/klacke/yaws -[Mochiweb]: https://github.com/mochi/mochiweb -[Misultin]: https://github.com/ostinelli/misultin -[Cowboy]: https://github.com/ninenines/cowboy -[WSGI]: https://www.python.org/dev/peps/pep-3333/ -[Rack]: https://github.com/rack/rack diff --git a/doc/overview.html b/doc/overview.html new file mode 100644 index 0000000..dfe387b --- /dev/null +++ b/doc/overview.html @@ -0,0 +1,313 @@ + + + + + + + + + + + Elli - Overview — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + + Elli - Overview +

    + +

    Copyright (c) 2012-2016 Knut Nesheim, 2016-2018 elli-lib team

    Version: 3.3.0

    Authors: Knut Nesheim, elli-lib team.

    Erlang web server for HTTP APIs

    + + + + Features +

    +

    Here's the features Elli does have:

    • Rack-style request-response. Your handler function gets a + complete request and returns a complete response. There's no + messaging, no receiving data directly from the socket, no writing + responses directly to the socket. It's a very simple and + straightforward API. Have a look at elli_example_callback +for examples.

    • Middlewares allow you to add useful features like compression, +encoding, stats, but only have it used when needed. No features you +don't use on the critical path.

    • Short-circuiting of responses using exceptions, allows you to use + "assertions" that return for example 403 permission + denied. is_allowed(Req) orelse throw({403, [], <<"Permission denied">>}).

    • Every client connection gets its own process, isolating the failure +of a request from another. For the duration of the connection, only +one process is involved, resulting in very robust and efficient +code.

    • Binaries everywhere for strings.

    • Instrumentation inside the core of the webserver, triggering user + callbacks. For example when a request completes, the user callback + gets the request_complete event which contains timings of all the +different parts of handling a request. There's also events for +clients unexpectedly closing a connection, crashes in the user +callback, etc.

    • Keep alive, using one Erlang process per connection only active +when there is a request from the client. Number of connections is +only limited by RAM and CPU.

    • Chunked transfer in responses for real-time push to clients

    • Basic pipelining. HTTP verbs that does not have side-effects(GET + and HEAD) can be pipelined, ie. a client supporting pipelining +can send multiple requests down the line and expect the responses +to appear in the same order as requests. Elli processes the +requests one at a time in order, future work could make it possible +to process them in parallel.

    • SSL using built-in Erlang/OTP ssl, nice for low volume admin +interfaces, etc. For high volume, you should probably go with +nginx, stunnel or ELB if you're on AWS.

    • Implement your own connection handling, for WebSockets, streaming + uploads, etc. See elli_example_callback_handover.

    + + + + Extensions +

    +

    Here's some ready-to-use extensions for Elli.

    You can also find a more complete list at https://github.com/elli-lib.

    + + + + About +

    +

    From operating and debugging high-volume, low-latency apps we have +gained some valuable insight into what we want from a webserver. We +want simplicity, robustness, performance, ease of debugging, +visibility into strange client behaviour, really good instrumentation +and good tests. We are willing to sacrifice almost everything, even +basic features to achieve this.

    With this in mind we looked at the big names in the Erlang +community: Yaws, Mochiweb, Misultin and Cowboy. We +found Mochiweb to be the best match. However, we also wanted to +see if we could take the architecture of Mochiweb and improve on +it. Elli takes the acceptor-turns-into-request-handler idea found +in Mochiweb, the binaries-only idea from Cowboy and the +request-response idea from WSGI/Rack (with chunked transfer +being an exception).

    On top of this we built a handler that allows us to write HTTP +middleware modules to add practical features, like compression of +responses, HTTP access log with timings, a real-time statistics +dashboard and chaining multiple request handlers.

    + + + + Aren't there enough webservers in the Erlang community already? +

    +

    There are a few very mature and robust projects with steady +development, one recently ceased development and one new kid on the +block with lots of interest. As Elli is not a general purpose +webserver, but more of a specialized tool, we believe it has a very +different target audience and would not attract effort or users away +from the big names.

    + + + + Why another webserver? Isn't this just the NIH syndrome? +

    +

    Yaws, Mochiweb, Misultin, and Cowboy are great +projects, hardened over time and full of very useful features for web +development. If you value developer productivity, Yaws is an +excellent choice. If you want a fast and lightweight +server, Mochiweb and Cowboy are excellent choices.

    Having used and studied all of these projects, we believed that if we +merged some of the existing ideas and added some ideas from other +communities, we could create a core that was better for our use cases.

    It started out as an experiment to see if it is at all possible to +significantly improve and it turns out that for our particular use +cases, there is enough improvement to warrant a new project.

    + + + + What makes Elli different? +

    +

    Elli has a very simple architecture. It avoids using more processes +and messages than absolutely necessary. It uses binaries for +strings. The request-response programming model allows middlewares to +do much heavy lifting, so the core can stay very simple. It has been +instrumented so as a user you can understand where time is spent. When +things go wrong, like the client closed the connection before you +could send a response, you are notified about these things so you can +better understand your client behaviour.

    + + + + Performance +

    +

    "Hello World!" micro-benchmarks are really useful when measuring the +performance of the webserver itself, but the numbers usually do more +harm than good when released. I encourage you to run your own +benchmarks, on your own hardware. Mark Nottingham has some +very good pointers +about benchmarking HTTP servers.

    +
    + + + +
    +
    +
    + + + + diff --git a/doc/readme.html b/doc/readme.html new file mode 100644 index 0000000..14c8054 --- /dev/null +++ b/doc/readme.html @@ -0,0 +1,308 @@ + + + + + + + + + + + Elli - Erlang web server for HTTP APIs — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + +
    +

    + + + + View Source + + + + Elli - Erlang web server for HTTP APIs +

    + +

    Hex.pm +Documentation +Erlang +Common Test +Coverage Status +MIT License

    Elli is a webserver you can run inside your Erlang application to +expose an HTTP API. It is aimed exclusively at building +high-throughput, low-latency HTTP APIs. If robustness and performance +is more important to you than general purpose features, then Elli might be +for you. If you find yourself digging into the implementation of a +webserver, then Elli might be for you. If you're building web services, +not web sites, then Elli might be for you.

    Elli requires OTP 20.0 or newer.

    + + + + Installation +

    +

    Add elli to your application as a dependency to your +rebar.config:

    {deps, [
    +  {elli, "3.3.0"}
    +]}.

    Afterwards, to compile it, you can run:

    rebar3 compile
    +

    + + + + Usage +

    +

    To boot Elli inside an Erlang shell, run:

    rebar3 shell
    +
    %% starting elli
    +1> {ok, Pid} = elli:start_link([{callback, elli_example_callback}, {port, 3000}]).

    + + + + Examples +

    +

    + + + + Callback Module +

    +

    The best source to learn how to write a callback module +is elli_example_callback. +There are also a bunch +of examples used in the tests as well as descriptions of all the events.

    A minimal callback module looks something like this:

    -module(elli_minimal_callback).
    +-behaviour(elli_handler).
    +
    +-include_lib("elli/include/elli.hrl").
    +
    +-export([handle/2, handle_event/3]).
    +
    +handle(Req, _Args) ->
    +    %% Delegate to our handler function
    +    Method = Req#req.method,
    +    Path = elli_request:path(Req),
    +    handle(Method, Path, Req).
    +
    +handle('GET' = _Method, [<<"hello">>, <<"world">>] = _Path, _Req) ->
    +    %% Reply with a normal response. `ok' can be used instead of `200'
    +    %% to signal success.
    +    StatusCode = ok,
    +    Headers = [],
    +    Body = <<"Hello World!">>,
    +    {StatusCode, Headers, Body};
    +
    +handle(_Method, _Path, _Req) ->
    +    {404, [], <<"Not Found">>}.
    +
    +%% @doc Handle request events: request completed, exception
    +%% thrown, client timeout, etc. Must return `ok'.
    +handle_event(_Event, _Data, _Args) ->
    +    ok.

    + + + + Supervisor ChildSpec +

    +

    To add elli to a supervisor you can use the following example and adapt it to +your needs.

    -module(elli_minimal_sup).
    +-behaviour(supervisor).
    +
    +-export([start_link/0, init/1]).
    +
    +start_link() ->
    +    SupName = {local, ?MODULE},
    +    Module = ?MODULE,
    +    Args = [],
    +    supervisor:start_link(SupName, Module, Args).
    +
    +init([] = _Args) ->
    +    ElliOpts = [
    +        {callback, elli_minimal_callback},
    +        {port, 3000}
    +    ],
    +    ElliSpec = {
    +        _Id = elli_minimal_http,
    +        _Start = {elli, start_link, [ElliOpts]},
    +        _Restart = permanent,
    +        _Shutdown = 5000,
    +        _Worker = worker,
    +        _Modules = [elli]},
    +
    +    {ok, {{_Strategy = one_for_one, _Intensity = 5, _Period = 10}, [ElliSpec]} }.

    + + + + Further reading +

    +

    For more information about the features and design philosophy of Elli check +out the overview.

    + + + + License +

    +

    Elli is licensed under The MIT License.

    +
    + + + +
    +
    +
    + + + + diff --git a/doc/search.html b/doc/search.html new file mode 100644 index 0000000..05b9abb --- /dev/null +++ b/doc/search.html @@ -0,0 +1,160 @@ + + + + + + + + + + + + + Search — elli v3.3.0 + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + + + + +
    +
    +
    + + + + diff --git a/doc/stylesheet.css b/doc/stylesheet.css deleted file mode 100644 index ab170c0..0000000 --- a/doc/stylesheet.css +++ /dev/null @@ -1,55 +0,0 @@ -/* standard EDoc style sheet */ -body { - font-family: Verdana, Arial, Helvetica, sans-serif; - margin-left: .25in; - margin-right: .2in; - margin-top: 0.2in; - margin-bottom: 0.2in; - color: #000000; - background-color: #ffffff; -} -h1,h2 { - margin-left: -0.2in; -} -div.navbar { - background-color: #add8e6; - padding: 0.2em; -} -h2.indextitle { - padding: 0.4em; - background-color: #add8e6; -} -h3.function,h3.typedecl { - background-color: #add8e6; - padding-left: 1em; -} -div.spec { - margin-left: 2em; - background-color: #eeeeee; -} -a.module { - text-decoration:none -} -a.module:hover { - background-color: #eeeeee; -} -ul.definitions { - list-style-type: none; -} -ul.index { - list-style-type: none; - background-color: #eeeeee; -} - -/* - * Minor style tweaks - */ -ul { - list-style-type: square; -} -table { - border-collapse: collapse; -} -td { - padding: 3 -} diff --git a/doc/tpl.html b/doc/tpl.html deleted file mode 100644 index 506b5f2..0000000 --- a/doc/tpl.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - index - - - - - - - $body$ - - From cd07791e14fd3e2a0f265ca41e71bb477cf4a662 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 27 Jul 2023 14:43:09 +0100 Subject: [PATCH 02/13] Move to ex_doc --- rebar.config | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/rebar.config b/rebar.config index 8143042..8436abe 100644 --- a/rebar.config +++ b/rebar.config @@ -5,16 +5,6 @@ {deps, []}. {xref_checks, [deprecated_function_calls,undefined_function_calls,locals_not_used]}. {profiles, [ - {docs, [ - {deps, [{edown, "0.9.1"}]}, - {edoc_opts, [ - {preprocess, true}, - {def, [ - {'EXAMPLE_CONF',"[{callback,elli_example_callback},{callback_args,[]}]"} - ]}, - {doclet, edown_doclet} - ]} - ]}, {test, [ {deps, [{hackney, "1.20.1"}]}, {extra_src_dirs, [ @@ -38,9 +28,20 @@ {project_plugins, [ {covertool, "2.0.6"}, {rebar3_lint, "3.2.5"} + {rebar3_ex_doc, "0.2.18"} +]}. +{ex_doc, [ + {extras, [ + "CHANGELOG.md", + "LICENSE", + "README.md" + ]}, + {main, "README.md"}, + {source_url, "https://github.com/elli-lib/elli"} +]}. +{hex, [ + {doc, #{provider => ex_doc}} ]}. {provider_hooks, [{pre, [{eunit, lint}]}]}. {dialyzer, [{plt_extra_apps, [ssl]}, {warnings, [unknown]}]}. - -{post_hooks, [{edoc, "doc/build.sh"}]}. From 54311b1f4f286b71d5f8976dc39b2fd1e8dd5325 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 27 Jul 2023 15:55:24 +0100 Subject: [PATCH 03/13] Fix doc. generation issues Also moves @doc to before -spec, where it's most commonly found Also moves @hidden > @private Also moves @equiv to "Same as" Also moves @link to `, since ExDoc does auto-reference Also moves @see to `, for the same reason as @link --- src/elli.erl | 38 ++++++++------- src/elli_example_callback.erl | 66 +++++++++++++------------- src/elli_example_callback_handover.erl | 2 +- src/elli_example_middleware.erl | 2 +- src/elli_handler.erl | 11 ++--- src/elli_http.erl | 16 +++---- src/elli_middleware.erl | 14 +++--- src/elli_request.erl | 18 +++---- src/elli_sendfile.erl | 4 +- src/elli_util.erl | 12 ++--- 10 files changed, 90 insertions(+), 93 deletions(-) diff --git a/src/elli.erl b/src/elli.erl index cb6deb4..baa6806 100644 --- a/src/elli.erl +++ b/src/elli.erl @@ -1,4 +1,4 @@ -%% @doc: Elli acceptor manager +%% @doc Elli acceptor manager %% %% This gen_server owns the listen socket and manages the processes %% accepting on that socket. When a process waiting for accept gets a @@ -26,17 +26,17 @@ -export_type([req/0, http_method/0, body/0, headers/0, response_code/0]). -%% @type req(). A record representing an HTTP request. -type req() :: #req{}. + -elvis([{elvis_style, private_data_types, disable}]). -%% @type http_method(). An uppercase atom representing a known HTTP verb or a -%% binary for other verbs. +%% A record representing an HTTP request. -type http_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | binary(). +%% An uppercase atom representing a known HTTP verb or a binary for other verbs. -%% @type body(). A binary or iolist. -type body() :: binary() | iolist(). +%% A binary or iolist. -type header() :: {Key::binary(), Value::binary() | string()}. -type headers() :: [header()]. @@ -49,8 +49,8 @@ options = [] :: [{_, _}], % TODO: refine callback :: elli_handler:callback() }). -%% @type state(). Internal state. -opaque state() :: #state{}. +%% Internal state. -export_type([state/0]). @@ -58,13 +58,13 @@ %%% API %%%=================================================================== +%% @doc Create an Elli server process as part of a supervision tree, using the +%% default configuration. +%% The same as `start_link({callback, elli_example_callback}, {callback_args, []})'. -spec start_link() -> Result when Result :: {ok, Pid} | ignore | {error, Error}, Pid :: pid(), Error :: {already_started, Pid} | term(). -%% @equiv start_link({@EXAMPLE_CONF}) -%% @doc Create an Elli server process as part of a supervision tree, using the -%% default configuration. start_link() -> start_link(?EXAMPLE_CONF). -spec start_link(Opts) -> Result when @@ -87,8 +87,8 @@ start_link(Opts) -> get_acceptors(S) -> gen_server:call(S, get_acceptors). +%% The same as `get_open_reqs(S, 5000)' -spec get_open_reqs(S :: atom()) -> {reply, {ok, non_neg_integer()}, state()}. -%% @equiv get_open_reqs(S, 5000) get_open_reqs(S) -> get_open_reqs(S, 5000). @@ -116,7 +116,7 @@ stop(S) -> %%% gen_server callbacks %%%=================================================================== -%% @hidden +%% @private -spec init([Opts :: [{_, _}]]) -> {ok, state()}. init([Opts]) -> %% Use the exit signal from the acceptor processes to know when @@ -176,7 +176,7 @@ http_start(Socket, Options, Callback, CallbackArgs, Acceptors) -> Pid = elli_http:start_link(self(), Socket, Options, {Callback, CallbackArgs}), ets:insert(Acceptors, {Pid}). -%% @hidden +%% @private -spec handle_call(get_acceptors, {pid(), _Tag}, state()) -> {reply, {ok, [ets:tid()]}, state()}; (get_open_reqs, {pid(), _Tag}, state()) -> @@ -200,7 +200,7 @@ handle_call({set_callback, Callback, CallbackArgs}, _From, State) -> handle_call(stop, _From, State) -> {stop, normal, ok, State}. -%% @hidden +%% @private -spec handle_cast(accepted | _Msg, State0) -> {noreply, State1} when State0 :: state(), State1 :: state(). @@ -211,7 +211,7 @@ handle_cast(_Msg, State) -> {noreply, State}. -%% @hidden +%% @private -spec handle_info({'EXIT', _Pid, Reason}, State0) -> Result when State0 :: state(), Reason :: {error, emfile}, @@ -229,13 +229,17 @@ handle_info({'EXIT', Pid, Reason}, State) -> {noreply, remove_acceptor(State, Pid)}. -%% @hidden +%% @private -spec terminate(_Reason, _State) -> ok. terminate(_Reason, _State) -> ok. -%% @hidden --spec code_change(_OldVsn, State, _Extra) -> {ok, State} when State :: state(). +%% @private +-spec code_change(OldVsn, State, Extra) -> {ok, State} + when OldVsn :: Vsn | {down, Vsn}, + Vsn :: term(), + State :: state(), + Extra :: term(). code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/src/elli_example_callback.erl b/src/elli_example_callback.erl index 5fb1928..cf726f5 100644 --- a/src/elli_example_callback.erl +++ b/src/elli_example_callback.erl @@ -1,10 +1,10 @@ -%%% @doc: Elli example callback +%%% @doc Elli example callback %%% -%%% Your callback needs to implement two functions, {@link handle/2} and -%%% {@link handle_event/3}. For every request, Elli will call your handle +%%% Your callback needs to implement two functions, `handle/2' and +%%% `handle_event/3'. For every request, Elli will call your handle %%% function with the request. When an event happens, like Elli %%% completed a request, there was a parsing error or your handler -%%% threw an error, {@link handle_event/3} is called. +%%% threw an error, `handle_event/3' is called. -module(elli_example_callback). -export([handle/2, handle_event/3]). @@ -22,7 +22,7 @@ %% @doc Handle a `Req'uest. %% Delegate to our handler function. -%% @see handle/3 +%% See `handle/3' -spec handle(Req, _Args) -> Result when Req :: elli:req(), _Args :: elli_handler:callback_args(), @@ -38,31 +38,31 @@ handle(Req, _Args) -> handle(Req#req.method, elli_request:path(Req), Req). %% If you return any of the following HTTP headers, you can %% override the default behaviour of Elli: %% -%% * **Connection**: By default Elli will use `keep-alive' if the protocol -%% supports it, setting `<<"close">>' will close the -%% connection immediately after Elli has sent the -%% response. If the client has already sent pipelined -%% requests, these will be discarded. +%% * `**Connection**': By default Elli will use `keep-alive' if the protocol +%% supports it, setting `<<"close">>' will close the +%% connection immediately after Elli has sent the +%% response. If the client has already sent pipelined +%% requests, these will be discarded. %% -%% * **Content-Length**: By default Elli looks at the size of the body you -%% returned to determine the `Content-Length' header. -%% Explicitly including your own `Content-Length' (with -%% the value as `integer()', `binary()' or `list()') -%% allows you to return an empty body. Useful for -%% implementing the `"304 Not Modified"' response. +%% * `**Content-Length**': By default Elli looks at the size of the body you +%% returned to determine the `Content-Length' header. +%% Explicitly including your own `Content-Length' (with +%% the value as `integer()', `binary()' or `list()') +%% allows you to return an empty body. Useful for +%% implementing the `"304 Not Modified"' response. %% -%% @see elli_request:get_arg/3 -%% @see elli_request:post_arg/3 -%% @see elli_request:post_arg_decoded/3 -%% @see elli_request:get_header/3 -%% @see elli_request:get_arg_decoded/3 -%% @see elli_request:get_args_decoded/1 -%% @see elli_util:file_size/1 -%% @see elli_request:get_range/1 -%% @see elli_request:normalize_range/2 -%% @see elli_request:encode_range/2 -%% @see elli_request:chunk_ref/1 -%% @see chunk_loop/1 +%% See `elli_request:get_arg/3' +%% See `elli_request:post_arg/3' +%% See `elli_request:post_arg_decoded/3' +%% See `elli_request:get_header/3' +%% See `elli_request:get_arg_decoded/3' +%% See `elli_request:get_args_decoded/1' +%% See `elli_util:file_size/1' +%% See `elli_request:get_range/1' +%% See `elli_request:normalize_range/2' +%% See `elli_request:encode_range/2' +%% See `elli_request:chunk_ref/1' +%% See `chunk_loop/1' -spec handle(Method, Path, Req) -> elli_handler:result() when Method :: elli:http_method(), Path :: [binary()], @@ -211,14 +211,14 @@ handle(_, _, _Req) -> %% @doc Send 10 separate chunks to the client. -%% @equiv chunk_loop(Ref, 10) +%% The same as `chunk_loop(Ref, 10)' chunk_loop(Ref) -> chunk_loop(Ref, 10). %% @doc If `N > 0', send a chunk to the client, checking for errors, %% as the user might have disconnected. -%% When `N == 0', call {@link elli_request:close_chunk/1. -%% elli_request:close_chunk(Ref)}. +%% When `N == 0', call `elli_request:close_chunk/1'. +%% `elli_request:close_chunk(Ref)'. chunk_loop(Ref, 0) -> elli_request:close_chunk(Ref); chunk_loop(Ref, N) -> @@ -257,7 +257,7 @@ chunk_loop(Ref, N) -> %% the user. %% %% `invalid_return' is sent if the user callback code returns a term not -%% understood by elli, see {@link elli_http:execute_callback/1}. +%% understood by elli, see `elli_http:execute_callback/1'. %% After triggering this event, a generated response is sent to the user. %% %% `chunk_complete' fires when a chunked response is completely @@ -273,7 +273,7 @@ chunk_loop(Ref, N) -> %% Elli is waiting for the request. %% %% `request_parse_error' fires if the request is invalid and cannot be parsed by -%% [`erlang:decode_packet/3`][decode_packet/3] or it contains a path Elli cannot +%% [`erlang:decode_packet/3'][decode_packet/3] or it contains a path Elli cannot %% parse or does not support. %% %% [decode_packet/3]: http://erlang.org/doc/man/erlang.html#decode_packet-3 diff --git a/src/elli_example_callback_handover.erl b/src/elli_example_callback_handover.erl index 052f43e..97f7f4a 100644 --- a/src/elli_example_callback_handover.erl +++ b/src/elli_example_callback_handover.erl @@ -37,6 +37,6 @@ handle('GET', [<<"hello">>], Req, _Args) -> {ok, [], <<"Hello ", Name/binary>>}. -%% @hidden +%% @private handle_event(_, _, _) -> ok. diff --git a/src/elli_example_middleware.erl b/src/elli_example_middleware.erl index aec9af8..1aaf536 100644 --- a/src/elli_example_middleware.erl +++ b/src/elli_example_middleware.erl @@ -1,4 +1,4 @@ -%% @hidden +%% @private -module(elli_example_middleware). -export([handle/2, handle_event/3]). -behaviour(elli_handler). diff --git a/src/elli_handler.erl b/src/elli_handler.erl index 481b051..47ea59c 100644 --- a/src/elli_handler.erl +++ b/src/elli_handler.erl @@ -4,18 +4,15 @@ -export_type([callback/0, callback_mod/0, callback_args/0, event/0, result/0]). -%% @type callback(). A tuple of a {@type callback_mod()} and {@type -%% callback_args()}. -type callback() :: {callback_mod(), callback_args()}. +%% A tuple of a `t:callback_mod()' and `t:callback_args()'. -%% @type callback_mod(). A callback module. -type callback_mod() :: module(). +%% A callback module. -%% @type callback_args(). Arguments to pass to a {@type callback_mod()}. -type callback_args() :: list(). +%% Arguments to pass to a `t:callback_mod()' -%% @type event(). Fired throughout processing a request. -%% See {@link elli_example_callback:handle_event/3} for descriptions. -type event() :: elli_startup | bad_request | file_error | chunk_complete | request_complete @@ -23,6 +20,8 @@ | request_closed | request_parse_error | client_closed | client_timeout | invalid_return. +%% Fired throughout processing a request. +%% See `elli_example_callback:handle_event/3' for descriptions. -type result() :: {elli:response_code() | ok, elli:headers(), diff --git a/src/elli_http.erl b/src/elli_http.erl index aaa131d..490aa76 100644 --- a/src/elli_http.erl +++ b/src/elli_http.erl @@ -1,6 +1,6 @@ -%% @doc: Elli HTTP request implementation +%% @doc Elli HTTP request implementation %% -%% An elli_http process blocks in elli_tcp:accept/2 until a client +%% An elli_http process blocks in `elli_tcp:accept/3' until a client %% connects. It then handles requests on that connection until it's %% closed either by the client timing out or explicitly by the user. -module(elli_http). @@ -27,12 +27,8 @@ -export_type([version/0]). --ifdef(TEST). --export([get_body/5]). --endif. - -%% @type version(). HTTP version as a tuple, i.e. `{0, 9} | {1, 0} | {1, 1}'. -type version() :: {0, 9} | {1, 0} | {1, 1}. +% HTTP version as a tuple, i.e. `{0, 9} | {1, 0} | {1, 1}'. -define(CONTENT_LENGTH_HEADER, <<"content-length">>). @@ -56,7 +52,7 @@ start_link(Server, ListenSocket, Options, Callback) -> %% @doc Accept on the socket until a client connects. %% Handle the request, then loop if we're using keep alive or chunked transfer. -%% If {@link elli_tcp:accept/3} doesn't return a socket within a configurable +%% If `elli_tcp:accept/3' doesn't return a socket within a configurable %% timeout, loop to allow code upgrades of this module. -spec accept(Server, ListenSocket, Options, Callback) -> ok when Server :: pid(), @@ -288,7 +284,7 @@ do_send_file(Fd, {Offset, Length}, #req{callback={Mod, Args}} = Req, Headers) -> end. %% @doc To send a response, we must first have received everything the -%% client is sending. If this is not the case, {@link send_bad_request/1} +%% client is sending. If this is not the case, `send_bad_request/1' %% might reset the client connection. send_bad_request(Socket) -> send_rescue_response(Socket, 400, <<"Bad Request">>). @@ -745,7 +741,7 @@ split_path(Path) -> P =/= <<>>]. %% @doc Split the URL arguments into a proplist. -%% Lifted from `cowboy_http:x_www_form_urlencoded/2'. +%% Lifted from cowboy_http:x_www_form_urlencoded/2. -spec split_args(binary()) -> list({binary(), binary() | true}). split_args(<<>>) -> []; diff --git a/src/elli_middleware.erl b/src/elli_middleware.erl index 3eaadca..85ed9de 100644 --- a/src/elli_middleware.erl +++ b/src/elli_middleware.erl @@ -23,12 +23,12 @@ %%% ''' %%% %%% The configured modules may implement the elli behaviour, in which case all -%%% the callbacks will be used as normal. If {@link handle/2} returns `ignore', +%%% the callbacks will be used as normal. If `link handle/2' returns `ignore', %%% elli will continue on to the next callback in the list. %%% -%%% Pre-processing and post-processing is implemented in {@link preprocess/2} -%%% and {@link postprocess/3}. {@link preprocess/2} is called for each -%%% middleware in the order specified, while {@link postprocess/3} is called in +%%% Pre-processing and post-processing is implemented in `preprocess/2' +%%% and `postprocess/3'. `preprocess/2' is called for each +%%% middleware in the order specified, while `postprocess/3' is called in %%% the reverse order. %%% %%% TODO: Don't call all postprocess middlewares when a middleware @@ -48,7 +48,7 @@ %% ELLI CALLBACKS %% -%% @hidden +%% @private -spec init(Req, Args) -> {ok, standard | handover} when Req :: elli:req(), Args :: elli_handler:callback_args(). @@ -56,7 +56,7 @@ init(Req, Args) -> do_init(Req, callbacks(Args)). -%% @hidden +%% @private -spec handle(Req :: elli:req(), Config :: [tuple()]) -> elli_handler:result(). handle(CleanReq, Config) -> Callbacks = callbacks(Config), @@ -65,7 +65,7 @@ handle(CleanReq, Config) -> postprocess(PreReq, Res, lists:reverse(Callbacks)). -%% @hidden +%% @private -spec handle_event(Event, Args, Config) -> ok when Event :: elli_handler:event(), Args :: elli_handler:callback_args(), diff --git a/src/elli_request.erl b/src/elli_request.erl index bc235ed..b444a44 100644 --- a/src/elli_request.erl +++ b/src/elli_request.erl @@ -47,7 +47,7 @@ -elvis([{elvis_style, god_modules, disable}]). %% -%% Helpers for working with a #req{} +%% Helpers for working with a `#req{}' %% @@ -87,15 +87,15 @@ get_header(Key, #req{headers = Headers}, Default) -> proplists:get_value(CaseFoldedKey, Headers, Default). -%% @equiv get_arg(Key, Req, undefined) +%% The same as `get_arg(Key, Req, undefined)' get_arg(Key, #req{} = Req) -> get_arg(Key, Req, undefined). -%% @equiv proplists:get_value(Key, Args, Default) +%% The same as `proplists:get_value(Key, Args, Default)' get_arg(Key, #req{args = Args}, Default) -> proplists:get_value(Key, Args, Default). -%% @equiv get_arg_decoded(Key, Req, undefined) +%% The same as `get_arg_decoded(Key, Req, undefined)' get_arg_decoded(Key, #req{} = Req) -> get_arg_decoded(Key, Req, undefined). @@ -119,14 +119,14 @@ body_qs(#req{body = Body} = Req) -> erlang:error(badarg) end. -%% @equiv post_arg(Key, Req, undefined) +%% The same as `post_arg(Key, Req, undefined)' post_arg(Key, #req{} = Req) -> post_arg(Key, Req, undefined). post_arg(Key, #req{} = Req, Default) -> proplists:get_value(Key, body_qs(Req), Default). -%% @equiv post_arg_decoded(Key, Req, undefined) +%% The same as `post_arg_decoded(Key, Req, undefined)' post_arg_decoded(Key, #req{} = Req) -> post_arg_decoded(Key, Req, undefined). @@ -174,8 +174,8 @@ query_str(#req{raw_path = Path}) -> %% @doc Parse the `Range' header from the request. -%% The result is either a `byte_range_set()' or the atom `parse_error'. -%% Use {@link elli_util:normalize_range/2} to get a validated, normalized range. +%% The result is either a `[http_range()]' or the atom `parse_error'. +%% Use `elli_util:normalize_range/2' to get a validated, normalized range. -spec get_range(elli:req()) -> [http_range()] | parse_error. get_range(#req{headers = Headers}) -> case proplists:get_value(<<"range">>, Headers) of @@ -242,7 +242,7 @@ chunk_ref(#req{}) -> %% @doc Explicitly close the chunked connection. %% Return `{error, closed}' if the client already closed the connection. -%% @equiv send_chunk(Ref, close) +%% The same as `send_chunk(Ref, close)' close_chunk(Ref) -> send_chunk(Ref, close). diff --git a/src/elli_sendfile.erl b/src/elli_sendfile.erl index 5a11a67..6020170 100644 --- a/src/elli_sendfile.erl +++ b/src/elli_sendfile.erl @@ -10,10 +10,8 @@ %% @doc Send part of a file on a socket. %% -%% Basically, @see file:sendfile/5 but for ssl (i.e. not raw OS sockets). +%% Basically, see `file:sendfile/5' but for ssl (i.e. not raw OS sockets). %% Originally from https://github.com/ninenines/ranch/pull/41/files -%% -%% @end -spec sendfile(file:fd(), inet:socket() | ssl:sslsocket(), non_neg_integer(), non_neg_integer(), sendfile_opts()) -> {ok, non_neg_integer()} | {error, atom()}. diff --git a/src/elli_util.erl b/src/elli_util.erl index b8aa5cf..5ab03ce 100644 --- a/src/elli_util.erl +++ b/src/elli_util.erl @@ -13,14 +13,14 @@ -type range() :: {Offset::non_neg_integer(), Length::non_neg_integer()}. +%% @doc If a valid byte-range, or byte-range-set of size 1, +%% is supplied, returns a normalized range in the format +%% `{Offset, Length}'. Returns `undefined' when an empty byte-range-set +%% is supplied and the atom `invalid_range' in all other cases. -spec normalize_range(RangeOrSet, Size) -> Normalized when RangeOrSet :: any(), Size :: integer(), Normalized :: range() | undefined | invalid_range. -%% @doc: If a valid byte-range, or byte-range-set of size 1 -%% is supplied, returns a normalized range in the format -%% {Offset, Length}. Returns undefined when an empty byte-range-set -%% is supplied and the atom `invalid_range' in all other cases. normalize_range({suffix, Length}, Size) when is_integer(Length), Length > 0 -> Length0 = erlang:min(Length, Size), @@ -42,9 +42,9 @@ normalize_range([], _Size) -> undefined; normalize_range(_, _Size) -> invalid_range. +%% @doc Encode `Range' to a `Content-Range' value. -spec encode_range(Range::range() | invalid_range, Size::non_neg_integer()) -> ByteRange::iolist(). -%% @doc: Encode Range to a Content-Range value. encode_range(Range, Size) -> [<<"bytes ">>, encode_range_bytes(Range), <<"/">>, integer_to_binary(Size)]. @@ -56,11 +56,11 @@ encode_range_bytes({Offset, Length}) -> encode_range_bytes(invalid_range) -> <<"*">>. +%% @doc Get the size, in bytes, of the file. -spec file_size(Filename) -> Size | {error, Reason} when Filename :: file:name_all(), Size :: non_neg_integer(), Reason :: file:posix() | badarg | invalid_file. -%% @doc: Get the size in bytes of the file. file_size(Filename) -> case file:read_file_info(Filename) of {ok, #file_info{type = regular, access = Perm, size = Size}} From 0dae9daa8313c455cc7490e475b4dca25117cc68 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 27 Jul 2023 16:08:13 +0100 Subject: [PATCH 04/13] Markdown -lint and tweak to rebar3_ex_doc's liking --- CHANGELOG.md | 174 +++++++++++++++++++++++++-------------------------- README.md | 38 ++++------- 2 files changed, 97 insertions(+), 115 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63f004f..bdef897 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,189 +2,187 @@ ## pre-v4.0.0 - * Headers are now properly treated as case-insensitive - * Original headers that have not had `string:casefold/1` run on each header - name are still available in the request through `elli_request:original_headers` +* Headers are now properly treated as case-insensitive +* Original headers that have not had `string:casefold/1` run on each header +name are still available in the request through `elli_request:original_headers` ## v3.3.0 - * Do not use x-forwarded-for for peer #75 - * Handle arguments with no value in (post|get)_arg_decoded #82 - * Fix compile-time warnings on missing record info. from aleppo #81 +* Do not use x-forwarded-for for peer #75 +* Handle arguments with no value in (post|get)_arg_decoded #82 +* Fix compile-time warnings on missing record info. from aleppo #81 ## v3.2.0 - * Quell warnings on OTP-21: https://github.com/elli-lib/elli/pull/61 +* Quell warnings on OTP-21: - * Generate HTML docs: https://github.com/elli-lib/elli/pull/58 +* Generate HTML docs: - * Add OTP-21 to Travis build matrix: https://github.com/elli-lib/elli/pull/62 +* Add OTP-21 to Travis build matrix: - * Remove unnecessary `stacktrace_compat` dependency: https://github.com/elli-lib/elli/pull/63 +* Remove unnecessary `stacktrace_compat` dependency: - * Export `elli_request/uri_decode/1` and improve performance: https://github.com/elli-lib/elli/pull/67 +* Export `elli_request:uri_decode/1` and improve performance: - * Update Travis config: https://github.com/elli-lib/elli/pull/69 +* Update Travis config: - * Drop support for OTP-16: https://github.com/elli-lib/elli/pull/71 +* Drop support for OTP-16: - * Prefer `OTP_RELEASE` over `rebar_erl_vsn` plugin: https://github.com/elli-lib/elli/pull/73 +* Prefer `OTP_RELEASE` over `rebar_erl_vsn` plugin: - * Remove old `maintainers` metadata: https://github.com/elli-lib/elli/pull/74 +* Remove old `maintainers` metadata: ## v3.1.0 - * Update docs: https://github.com/elli-lib/elli/pull/57 +* Update docs: - * Logging and stacktrace OTP-21 support: https://github.com/elli-lib/elli/pull/55 +* Logging and stacktrace OTP-21 support: - * Include req_body size in sizes list: https://github.com/elli-lib/elli/pull/52 +* Include req_body size in sizes list: - * Update CHANGELOG.md for 3.0.0: https://github.com/elli-lib/elli/pull/49 +* Update CHANGELOG.md for 3.0.0: ## v3.0.0 - * `scheme`, `host`, and `port` added to the `#req{}` record. Corresponding - helper functions added to the `elli_request` module. +* `scheme`, `host`, and `port` added to the `#req{}` record. Corresponding + helper functions added to the `elli_request` module. ## v2.1.2 - * Update dependencies and re-enable linting +* Update dependencies and re-enable linting - * Increase test coverage +* Increase test coverage - * Declare optional callbacks to elli_handler +* Declare optional callbacks to elli_handler - * Add TLS sendfile implementation by James Fish (from Andrew Thompson) +* Add TLS sendfile implementation by James Fish (from Andrew Thompson) - * Use hackney instead of httpc in tests, due to httpc bug +* Use hackney instead of httpc in tests, due to httpc bug ## v2.0.2 - * Adapt [knutin/elli#108](https://github.com/knutin/elli/pull/108) by Michael Zazaian +* Adapt [knutin/elli#108](https://github.com/knutin/elli/pull/108) by Michael Zazaian - * Incomplete request regression fix by Evan Vigil-McClanahan +* Incomplete request regression fix by Evan Vigil-McClanahan - * Handle binary URIs on OTP >=20 +* Handle binary URIs on OTP >=20 - * Bespoke uri_decode/1 to obviate inets dependency by Christoffer Vikström +* Bespoke uri_decode/1 to obviate inets dependency by Christoffer Vikström ## v2.0.1 - * Miscellaneous tooling, test, and type spec tweaks +* Miscellaneous tooling, test, and type spec tweaks - * Helper functions to reduce redundancy +* Helper functions to reduce redundancy - * Request start timing fix +* Request start timing fix ## v2.0.0 - * Code and documentation cleanup +* Code and documentation cleanup - * Instrumentation facilities +* Instrumentation facilities - * RFC 2616 section 8.2.3 implementation by Martin Karlsson +* RFC 2616 section 8.2.3 implementation by Martin Karlsson - * Send 500 and close connection if file operations fail +* Send 500 and close connection if file operations fail ## v1.0.5 - * Optimization of SSL accept by Tristan Sloughter +* Optimization of SSL accept by Tristan Sloughter - * Dependency cleanup by Adam Lindberg +* Dependency cleanup by Adam Lindberg ## v1.0.4 - * OTP 18.0 compatibility, contributed by Florian Odronitz. +* OTP 18.0 compatibility, contributed by Florian Odronitz. ## v1.0.3 - * Various internal cleanup fixes from Andreas Stenius (github.com/kaos) +* Various internal cleanup fixes from Andreas Stenius (github.com/kaos) ## v1.0.2 - * Added `elli_request:get_args_decoded/1` which returns the list of - query args decoded each time it's called. - +* Added `elli_request:get_args_decoded/1` which returns the list of + query args decoded each time it's called. ## v1.0.1 - * Fix bug in SSL acceptor pool where due to failed handshakes, Elli - runs out of acceptors. Thanks to Stefan Grundmann. +* Fix bug in SSL acceptor pool where due to failed handshakes, Elli + runs out of acceptors. Thanks to Stefan Grundmann. - * In case a handler (or middleware) returns a response Elli does not - understand, Elli will now respond with a 500 error. Thanks to - Johannes Huning. +* In case a handler (or middleware) returns a response Elli does not + understand, Elli will now respond with a 500 error. Thanks to + Johannes Huning. - * Added `elli_request:get_arg_decoded/2,3` which HTTP URI decodes the - value passed in the request. Thanks to Mariano Valles. +* Added `elli_request:get_arg_decoded/2,3` which HTTP URI decodes the + value passed in the request. Thanks to Mariano Valles. ## v1.0 - * SSL using built-in ssl from Erlang/OTP. Thanks to Maas-Maarten Zeeman. +* SSL using built-in ssl from Erlang/OTP. Thanks to Maas-Maarten Zeeman. - * "Handover" a socket to user code, making it possible to implement - WebSockets(https://github.com/mmzeeman/elli_websocket +* "Handover" a socket to user code, making it possible to implement + WebSockets(). - * Type fixes from Ingo Struck and Andreas Hasselberg. +* Type fixes from Ingo Struck and Andreas Hasselberg. ## v0.4.1 - * Fix from Christian Lundgren for browsers that include spaces in the - value of the Content-Length header. +* Fix from Christian Lundgren for browsers that include spaces in the + value of the Content-Length header. ## v0.4 - * Added support for sending ranges of a file with sendfile by - returning `{Code, Headers, {file, Filename, {Offset, Length}}}`. If - no offset and length is specified, the entire file is sent. The - user must provide an appropriate "Content-Length" and - "Content-Range" header, see the example in - `elli_example_callback.erl` - (https://github.com/knutin/elli/blob/master/src/elli_example_callback.erl#L99). Thanks - Vincent Siliakus (zambal). - +* Added support for sending ranges of a file with sendfile by + returning `{Code, Headers, {file, Filename, {Offset, Length}}}`. If + no offset and length is specified, the entire file is sent. The + user must provide an appropriate "Content-Length" and + "Content-Range" header, see the example in + `elli_example_callback.erl` + (). + Thanks Vincent Siliakus (zambal). ## v0.3 - * Breaking change: Timeouts used in the HTTP protocol are now - configurable. To implement this, changing a record and some - callbacks was necessary. To upgrade, a restart of Elli is needed. +* Breaking change: Timeouts used in the HTTP protocol are now + configurable. To implement this, changing a record and some + callbacks was necessary. To upgrade, a restart of Elli is needed. - * Elli now supports pipelining of any type of request. Some proxies - or special clients (like ibrowse) will pipeline requests to reduce - latency. +* Elli now supports pipelining of any type of request. Some proxies + or special clients (like ibrowse) will pipeline requests to reduce + latency. - * If there are no more file descriptors, Elli will shut down. This - mimics the behaviour found in Yaws. +* If there are no more file descriptors, Elli will shut down. This + mimics the behaviour found in Yaws. - * Chunked transfer responses will now exit the Elli process when the - client closes the connection. Sending a synchronous chunk will - return `{error, closed}` if client has closed the connection and - the `chunk_complete` event is sent to your callback including which - end closed the connection. +* Chunked transfer responses will now exit the Elli process when the + client closes the connection. Sending a synchronous chunk will + return `{error, closed}` if client has closed the connection and + the `chunk_complete` event is sent to your callback including which + end closed the connection. ## v0.2.0 - * Breaking change: moved elli_access_log into a separate repository - at github.com/wooga/elli_access_log. Thanks martinrehfeld. +* Breaking change: moved elli_access_log into a separate repository + at github.com/wooga/elli_access_log. Thanks martinrehfeld. ## v0.1.3 - * Added elli_test which makes it easy to write unit tests for your - callbacks. Thanks anha0825. +* Added elli_test which makes it easy to write unit tests for your + callbacks. Thanks anha0825. - * Added sendfile support. Thanks chrisavl. +* Added sendfile support. Thanks chrisavl. ## v0.1.2 - * Added option to specify listen IP address. Thanks hukl. +* Added option to specify listen IP address. Thanks hukl. ## v0.1.1 - * Don't look up the peer ip address on every request anymore, do it - on demand using elli_request:peer/1. +* Don't look up the peer ip address on every request anymore, do it + on demand using elli_request:peer/1. ## v0.1 - * Initial release. +* Initial release. diff --git a/README.md b/README.md index 32ffe90..8d6fff7 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,11 @@ # elli - Erlang web server for HTTP APIs -[![Hex.pm][hex badge]][hex package] -[![Documentation][doc badge]][docs] -[![Erlang][erlang badge]][erlang downloads] +[![Hex.pm](https://img.shields.io/hexpm/v/elli.svg)](https://hex.pm/packages/elli) +[![Documentation](https://img.shields.io/badge/docs-edown-green.svg)](doc/README.md) +[![Erlang](https://img.shields.io/badge/erlang-%E2%89%A520.0-red.svg)](http://www.erlang.org/downloads) ![Common Test](https://github.com/elli-lib/elli/workflows/Common%20Test/badge.svg) -[![Coverage Status][coveralls badge]][coveralls link] -[![MIT License][license badge]](LICENSE) - -[hex badge]: https://img.shields.io/hexpm/v/elli.svg -[hex package]: https://hex.pm/packages/elli -[latest release]: https://github.com/elli-lib/elli/releases/latest -[erlang badge]: https://img.shields.io/badge/erlang-%E2%89%A520.0-red.svg -[erlang downloads]: http://www.erlang.org/downloads -[doc badge]: https://img.shields.io/badge/docs-edown-green.svg -[docs]: doc/README.md -[coveralls badge]: https://coveralls.io/repos/github/elli-lib/elli/badge.svg?branch=develop -[coveralls link]: https://coveralls.io/github/elli-lib/elli?branch=develop -[license badge]: https://img.shields.io/badge/license-MIT-blue.svg +[![Coverage Status](https://coveralls.io/repos/github/elli-lib/elli/badge.svg?branch=develop)](https://coveralls.io/github/elli-lib/elli?branch=develop) +[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) Elli is a webserver you can run inside your Erlang application to expose an HTTP API. Elli is aimed exclusively at building @@ -29,7 +18,6 @@ not web sites, then `elli` might be for you. Elli is used in production at Wooga and Game Analytics. Elli requires OTP 18.0 or newer. - ## Installation To use `elli` you will need a working installation of Erlang 18.0 (or later). @@ -46,14 +34,14 @@ Add `elli` to your application by adding it as a dependency to your Afterwards you can run: -```sh -$ rebar3 compile +```console +rebar3 compile ``` - ## Usage -```sh -$ rebar3 shell + +```console +rebar3 shell ``` ```erlang @@ -66,8 +54,7 @@ $ rebar3 shell ### Callback Module The best source to learn how to write a callback module -is [src/elli_example_callback.erl](src/elli_example_callback.erl) and -its [generated documentation](doc/elli_example_callback.md). There are a bunch +is [`elli_example_callback.erl`](elli_example_callback.html). There are a bunch of examples used in the tests as well as descriptions of all the events. A minimal callback module could look like this: @@ -97,7 +84,6 @@ handle_event(_Event, _Data, _Args) -> ok. ``` - ### Supervisor Childspec To add `elli` to a supervisor you can use the following example and adapt it to @@ -125,13 +111,11 @@ init([]) -> {ok, { {one_for_one, 5, 10}, [ElliSpec]} }. ``` - ## Further Reading For more information about the features and design philosophy of `elli` check out the [overview](doc/README.md). - ## License Elli is licensed under [The MIT License](LICENSE). From bde4da37b91757fca2a265195f60f99cf4573061 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 27 Jul 2023 16:25:39 +0100 Subject: [PATCH 05/13] Update README as per current constraints --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 8d6fff7..4f0a047 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,7 @@ for you. If you find yourself digging into the implementation of a webserver, `elli` might be for you. If you're building web services, not web sites, then `elli` might be for you. -Elli is used in production at Wooga and Game Analytics. Elli requires -OTP 18.0 or newer. +Elli requires OTP 20.0 or newer. ## Installation From 164f23ea0094d3abd3612e25d2372f07d7839274 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Thu, 27 Jul 2023 17:01:22 +0100 Subject: [PATCH 06/13] Move overview to its own .md (and reference it from README.md) --- OVERVIEW.md | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 92 ++++++++++++++++------------ rebar.config | 5 +- 3 files changed, 222 insertions(+), 42 deletions(-) create mode 100644 OVERVIEW.md diff --git a/OVERVIEW.md b/OVERVIEW.md new file mode 100644 index 0000000..99a88d2 --- /dev/null +++ b/OVERVIEW.md @@ -0,0 +1,167 @@ +# Elli - Overview + +Copyright (c) 2012-2016 Knut Nesheim, 2016-2018 elli-lib team + +__Version:__ 3.3.0 + +__Authors:__ Knut Nesheim, elli-lib team. + +Erlang web server for HTTP APIs + +## Features + +Here's the features Elli _does_ have: + +* [Rack][]-style request-response. Your handler function gets a + complete request and returns a complete response. There's no + messaging, no receiving data directly from the socket, no writing + responses directly to the socket. It's a very simple and + straightforward API. Have a look at [`elli_example_callback`](elli_example_callback.html) +for examples. + +* Middlewares allow you to add useful features like compression, +encoding, stats, but only have it used when needed. No features you +don't use on the critical path. + +* Short-circuiting of responses using exceptions, allows you to use + "assertions" that return for example 403 permission + denied. `is_allowed(Req) orelse throw({403, [], <<"Permission + denied">>})`. + +* Every client connection gets its own process, isolating the failure +of a request from another. For the duration of the connection, only +one process is involved, resulting in very robust and efficient +code. + +* Binaries everywhere for strings. + +* Instrumentation inside the core of the webserver, triggering user + callbacks. For example when a request completes, the user callback + gets the `request_complete` event which contains timings of all the +different parts of handling a request. There's also events for +clients unexpectedly closing a connection, crashes in the user +callback, etc. + +* Keep alive, using one Erlang process per connection only active +when there is a request from the client. Number of connections is +only limited by RAM and CPU. + +* Chunked transfer in responses for real-time push to clients + +* Basic pipelining. HTTP verbs that does not have side-effects(`GET` + and `HEAD`) can be pipelined, ie. a client supporting pipelining +can send multiple requests down the line and expect the responses +to appear in the same order as requests. Elli processes the +requests one at a time in order, future work could make it possible +to process them in parallel. + +* SSL using built-in Erlang/OTP ssl, nice for low volume admin +interfaces, etc. For high volume, you should probably go with +nginx, stunnel or ELB if you're on AWS. + +* Implement your own connection handling, for WebSockets, streaming + uploads, etc. See [`elli_example_callback_handover`](elli_example_callback_handover.html). + +## Extensions + +Here's some ready-to-use extensions for Elli. + +* [elli_access_log](https://github.com/elli-lib/elli_access_log): +Access log +* [elli_basicauth](https://github.com/elli-lib/elli_basicauth): +Basic auth +* [elli_chatterbox](https://github.com/elli-lib/elli_chatterbox): +HTTP/2 support +* [elli_cloudfront](https://github.com/elli-lib/elli_cloudfront): +CloudFront signed URLs +* [elli_cookie](https://github.com/elli-lib/elli_cookie): +Cookies +* [elli_date](https://github.com/elli-lib/elli_date): +"Date" header +* [elli_fileserve](https://github.com/elli-lib/elli_fileserve): +Static content +* [elli_prometheus](https://github.com/elli-lib/elli_prometheus): +Prometheus +* [elli_stats](https://github.com/elli-lib/elli_stats): +Real-time statistics dashboard +* [elli_websockets](https://github.com/elli-lib/elli_websocket): +WebSockets +* [elli_xpblfe](https://github.com/elli-lib/elli_xpblfe): +X-Powered-By LFE + +You can also find a more complete list at . + +## About + +From operating and debugging high-volume, low-latency apps we have +gained some valuable insight into what we want from a webserver. We +want simplicity, robustness, performance, ease of debugging, +visibility into strange client behaviour, really good instrumentation +and good tests. We are willing to sacrifice almost everything, even +basic features to achieve this. + +With this in mind we looked at the big names in the Erlang +community: [Yaws][], [Mochiweb][], [Misultin][] and [Cowboy][]. We +found [Mochiweb][] to be the best match. However, we also wanted to +see if we could take the architecture of [Mochiweb][] and improve on +it. Elli takes the acceptor-turns-into-request-handler idea found +in [Mochiweb][], the binaries-only idea from [Cowboy][] and the +request-response idea from [WSGI][]/[Rack][] (with chunked transfer +being an exception). + +On top of this we built a handler that allows us to write HTTP +middleware modules to add practical features, like compression of +responses, HTTP access log with timings, a real-time statistics +dashboard and chaining multiple request handlers. + +## Aren't there enough webservers in the Erlang community already? + +There are a few very mature and robust projects with steady +development, one recently ceased development and one new kid on the +block with lots of interest. As Elli is not a general purpose +webserver, but more of a specialized tool, we believe it has a very +different target audience and would not attract effort or users away +from the big names. + +## Why another webserver? Isn't this just the NIH syndrome? + +[Yaws][], [Mochiweb][], [Misultin][], and [Cowboy][] are great +projects, hardened over time and full of very useful features for web +development. If you value developer productivity, [Yaws][] is an +excellent choice. If you want a fast and lightweight +server, [Mochiweb][] and [Cowboy][] are excellent choices. + +Having used and studied all of these projects, we believed that if we +merged some of the existing ideas and added some ideas from other +communities, we could create a core that was better for our use cases. + +It started out as an experiment to see if it is at all possible to +significantly improve and it turns out that for our particular use +cases, there is enough improvement to warrant a new project. + +## What makes Elli different? + +Elli has a very simple architecture. It avoids using more processes +and messages than absolutely necessary. It uses binaries for +strings. The request-response programming model allows middlewares to +do much heavy lifting, so the core can stay very simple. It has been +instrumented so as a user you can understand where time is spent. When +things go wrong, like the client closed the connection before you +could send a response, you are notified about these things so you can +better understand your client behaviour. + +## Performance + +"Hello World!" micro-benchmarks are really useful when measuring the +performance of the webserver itself, but the numbers usually do more +harm than good when released. I encourage you to run your own +benchmarks, on your own hardware. Mark Nottingham has some +[very good pointers](http://www.mnot.net/blog/2011/05/18/http_benchmark_rules) +about benchmarking HTTP servers. + +[Yaws]: https://github.com/klacke/yaws +[Mochiweb]: https://github.com/mochi/mochiweb +[Misultin]: https://github.com/ostinelli/misultin +[Cowboy]: https://github.com/ninenines/cowboy +[WSGI]: https://www.python.org/dev/peps/pep-3333/ +[Rack]: https://github.com/rack/rack diff --git a/README.md b/README.md index 4f0a047..46cc704 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# elli - Erlang web server for HTTP APIs +# Elli - Erlang web server for HTTP APIs [![Hex.pm](https://img.shields.io/hexpm/v/elli.svg)](https://hex.pm/packages/elli) [![Documentation](https://img.shields.io/badge/docs-edown-green.svg)](doc/README.md) @@ -8,30 +8,27 @@ [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) Elli is a webserver you can run inside your Erlang application to -expose an HTTP API. Elli is aimed exclusively at building +expose an HTTP API. It is aimed exclusively at building high-throughput, low-latency HTTP APIs. If robustness and performance -is more important than general purpose features, then `elli` might be +is more important to you than general purpose features, then Elli might be for you. If you find yourself digging into the implementation of a -webserver, `elli` might be for you. If you're building web services, -not web sites, then `elli` might be for you. +webserver, then Elli might be for you. If you're building web services, +not web sites, then Elli might be for you. Elli requires OTP 20.0 or newer. ## Installation -To use `elli` you will need a working installation of Erlang 18.0 (or later). - -Add `elli` to your application by adding it as a dependency to your -[`rebar.config`](http://www.rebar3.org/docs/configuration): +Add `elli` to your application as a dependency to your +[`rebar.config`](https://www.rebar3.org/docs/configuration): ```erlang {deps, [ - %% ... - {elli, "3.0.0"} + {elli, "3.3.0"} ]}. ``` -Afterwards you can run: +Afterwards, to compile it, you can run: ```console rebar3 compile @@ -39,6 +36,8 @@ rebar3 compile ## Usage +To boot Elli inside an Erlang shell, run: + ```console rebar3 shell ``` @@ -53,67 +52,80 @@ rebar3 shell ### Callback Module The best source to learn how to write a callback module -is [`elli_example_callback.erl`](elli_example_callback.html). There are a bunch +is [`elli_example_callback`](elli_example_callback.html). +There are also a bunch of examples used in the tests as well as descriptions of all the events. -A minimal callback module could look like this: +A minimal callback module looks something like this: ```erlang -module(elli_minimal_callback). --export([handle/2, handle_event/3]). +-behaviour(elli_handler). -include_lib("elli/include/elli.hrl"). --behaviour(elli_handler). + +-export([handle/2, handle_event/3]). handle(Req, _Args) -> %% Delegate to our handler function - handle(Req#req.method, elli_request:path(Req), Req). + Method = Req#req.method, + Path = elli_request:path(Req), + handle(Method, Path, Req). -handle('GET',[<<"hello">>, <<"world">>], _Req) -> +handle('GET' = _Method, [<<"hello">>, <<"world">>] = _Path, _Req) -> %% Reply with a normal response. `ok' can be used instead of `200' %% to signal success. - {ok, [], <<"Hello World!">>}; + StatusCode = ok, + Headers = [], + Body = <<"Hello World!">>, + {StatusCode, Headers, Body}; -handle(_, _, _Req) -> +handle(_Method, _Path, _Req) -> {404, [], <<"Not Found">>}. -%% @doc Handle request events, like request completed, exception +%% @doc Handle request events: request completed, exception %% thrown, client timeout, etc. Must return `ok'. handle_event(_Event, _Data, _Args) -> ok. ``` -### Supervisor Childspec +### Supervisor ChildSpec To add `elli` to a supervisor you can use the following example and adapt it to your needs. ```erlang --module(fancyapi_sup). +-module(elli_minimal_sup). -behaviour(supervisor). --export([start_link/0]). --export([init/1]). -start_link() -> - supervisor:start_link({local, ?MODULE}, ?MODULE, []). +-export([start_link/0, init/1]). -init([]) -> - ElliOpts = [{callback, fancyapi_callback}, {port, 3000}], +start_link() -> + SupName = {local, ?MODULE}, + Module = ?MODULE, + Args = [], + supervisor:start_link(SupName, Module, Args). + +init([] = _Args) -> + ElliOpts = [ + {callback, elli_minimal_callback}, + {port, 3000} + ], ElliSpec = { - fancy_http, - {elli, start_link, [ElliOpts]}, - permanent, - 5000, - worker, - [elli]}, - - {ok, { {one_for_one, 5, 10}, [ElliSpec]} }. + _Id = elli_minimal_http, + _Start = {elli, start_link, [ElliOpts]}, + _Restart = permanent, + _Shutdown = 5000, + _Worker = worker, + _Modules = [elli]}, + + {ok, {{_Strategy = one_for_one, _Intensity = 5, _Period = 10}, [ElliSpec]} }. ``` -## Further Reading +## Further reading -For more information about the features and design philosophy of `elli` check -out the [overview](doc/README.md). +For more information about the features and design philosophy of Elli check +out the [`overview`](overview.html). ## License diff --git a/rebar.config b/rebar.config index 8436abe..b5d2c47 100644 --- a/rebar.config +++ b/rebar.config @@ -32,9 +32,10 @@ ]}. {ex_doc, [ {extras, [ + "README.md", + "OVERVIEW.md", "CHANGELOG.md", - "LICENSE", - "README.md" + "LICENSE" ]}, {main, "README.md"}, {source_url, "https://github.com/elli-lib/elli"} From 835199dda7f74c6eacdc34401fb9a8c452064ac8 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sun, 9 Jun 2024 11:12:26 +0100 Subject: [PATCH 07/13] Bump rebar3_ex_doc from 0.2.18 to 0.2.23 --- rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rebar.config b/rebar.config index b5d2c47..b1c4fdb 100644 --- a/rebar.config +++ b/rebar.config @@ -28,7 +28,7 @@ {project_plugins, [ {covertool, "2.0.6"}, {rebar3_lint, "3.2.5"} - {rebar3_ex_doc, "0.2.18"} + {rebar3_ex_doc, "0.2.23"} ]}. {ex_doc, [ {extras, [ From 019a147d9f59e152a951aff0f9257428f17a7289 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Sun, 30 Jun 2024 02:57:04 +0100 Subject: [PATCH 08/13] Act on CI results: fix post-rebase issues --- README.md | 2 +- rebar.config | 3 +-- src/elli_http.erl | 4 ++++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 46cc704..98dfac4 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ for you. If you find yourself digging into the implementation of a webserver, then Elli might be for you. If you're building web services, not web sites, then Elli might be for you. -Elli requires OTP 20.0 or newer. +Elli requires OTP 22.0 or newer. ## Installation diff --git a/rebar.config b/rebar.config index b1c4fdb..5af85b3 100644 --- a/rebar.config +++ b/rebar.config @@ -27,7 +27,7 @@ {project_plugins, [ {covertool, "2.0.6"}, - {rebar3_lint, "3.2.5"} + {rebar3_lint, "3.2.5"}, {rebar3_ex_doc, "0.2.23"} ]}. {ex_doc, [ @@ -44,5 +44,4 @@ {doc, #{provider => ex_doc}} ]}. -{provider_hooks, [{pre, [{eunit, lint}]}]}. {dialyzer, [{plt_extra_apps, [ssl]}, {warnings, [unknown]}]}. diff --git a/src/elli_http.erl b/src/elli_http.erl index 490aa76..bcc4a33 100644 --- a/src/elli_http.erl +++ b/src/elli_http.erl @@ -25,6 +25,10 @@ %% operating in handler mode. -export([close_or_keepalive/2]). +-ifdef(TEST). +-export([get_body/5]). +-endif. + -export_type([version/0]). -type version() :: {0, 9} | {1, 0} | {1, 1}. From fbc62a43007701f12fa98730be4cc966a02bae62 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Mon, 1 Jul 2024 22:42:54 +0100 Subject: [PATCH 09/13] Update README.md: proper link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 98dfac4..ea41d15 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Elli - Erlang web server for HTTP APIs [![Hex.pm](https://img.shields.io/hexpm/v/elli.svg)](https://hex.pm/packages/elli) -[![Documentation](https://img.shields.io/badge/docs-edown-green.svg)](doc/README.md) +[![Documentation](https://img.shields.io/badge/docs-edown-green.svg)](https://hexdocs.pm/elli/) [![Erlang](https://img.shields.io/badge/erlang-%E2%89%A520.0-red.svg)](http://www.erlang.org/downloads) ![Common Test](https://github.com/elli-lib/elli/workflows/Common%20Test/badge.svg) [![Coverage Status](https://coveralls.io/repos/github/elli-lib/elli/badge.svg?branch=develop)](https://coveralls.io/github/elli-lib/elli?branch=develop) From 8c4d7307af3460a57afa0134704ca413870078a2 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Mon, 1 Jul 2024 22:43:22 +0100 Subject: [PATCH 10/13] Keep generated docs in hexdocs.pm alone --- .gitignore | 1 + doc/.build | 39 - doc/404.html | 162 -- doc/api-reference.html | 294 ---- doc/changelog.html | 359 ----- doc/dist/handlebars.runtime-NWIB6V2M.js | 30 - doc/dist/handlebars.templates-K7URE6B4.js | 224 --- doc/dist/html-BHYOTRCH.js | 56 - doc/dist/html-erlang-EBZIIHAS.css | 6 - ...nconsolata-latin-400-normal-RGKDDNDD.woff2 | Bin 16244 -> 0 bytes ...nconsolata-latin-700-normal-DTS2D7TO.woff2 | Bin 16368 -> 0 bytes ...solata-latin-ext-400-normal-K7HVGTP7.woff2 | Bin 14772 -> 0 bytes ...solata-latin-ext-700-normal-4MPBLFZC.woff2 | Bin 14908 -> 0 bytes ...olata-vietnamese-400-normal-IGQPHHJH.woff2 | Bin 6836 -> 0 bytes ...olata-vietnamese-700-normal-LHEGSN35.woff2 | Bin 6944 -> 0 bytes doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 | Bin 23236 -> 0 bytes doc/dist/lato-latin-400-normal-W7754I4D.woff2 | Bin 23580 -> 0 bytes doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 | Bin 23040 -> 0 bytes .../lato-latin-ext-300-normal-VPGGJKJL.woff2 | Bin 5624 -> 0 bytes .../lato-latin-ext-400-normal-N27NCBWW.woff2 | Bin 5472 -> 0 bytes .../lato-latin-ext-700-normal-Q2L5DVMW.woff2 | Bin 5368 -> 0 bytes doc/dist/remixicon-NKANDIL5.woff2 | Bin 1956 -> 0 bytes doc/dist/search_data-EF5B6961.js | 1 - doc/dist/sidebar_items-FF1D4582.js | 1 - doc/elli.epub | Bin 48002 -> 0 bytes doc/elli.html | 760 ---------- doc/elli_example_callback.html | 315 ---- doc/elli_example_callback_handover.html | 267 ---- doc/elli_handler.html | 601 -------- doc/elli_http.html | 736 --------- doc/elli_middleware.html | 182 --- doc/elli_middleware_compress.html | 241 --- doc/elli_request.html | 1326 ----------------- doc/elli_sendfile.html | 292 ---- doc/elli_tcp.html | 493 ------ doc/elli_test.html | 241 --- doc/elli_util.html | 371 ----- doc/index.html | 10 - doc/license.html | 207 --- doc/overview.html | 313 ---- doc/readme.html | 308 ---- doc/search.html | 160 -- 42 files changed, 1 insertion(+), 7995 deletions(-) delete mode 100644 doc/.build delete mode 100644 doc/404.html delete mode 100644 doc/api-reference.html delete mode 100644 doc/changelog.html delete mode 100644 doc/dist/handlebars.runtime-NWIB6V2M.js delete mode 100644 doc/dist/handlebars.templates-K7URE6B4.js delete mode 100644 doc/dist/html-BHYOTRCH.js delete mode 100644 doc/dist/html-erlang-EBZIIHAS.css delete mode 100644 doc/dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 delete mode 100644 doc/dist/inconsolata-latin-700-normal-DTS2D7TO.woff2 delete mode 100644 doc/dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 delete mode 100644 doc/dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 delete mode 100644 doc/dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 delete mode 100644 doc/dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 delete mode 100644 doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 delete mode 100644 doc/dist/lato-latin-400-normal-W7754I4D.woff2 delete mode 100644 doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 delete mode 100644 doc/dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 delete mode 100644 doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 delete mode 100644 doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 delete mode 100644 doc/dist/remixicon-NKANDIL5.woff2 delete mode 100644 doc/dist/search_data-EF5B6961.js delete mode 100644 doc/dist/sidebar_items-FF1D4582.js delete mode 100644 doc/elli.epub delete mode 100644 doc/elli.html delete mode 100644 doc/elli_example_callback.html delete mode 100644 doc/elli_example_callback_handover.html delete mode 100644 doc/elli_handler.html delete mode 100644 doc/elli_http.html delete mode 100644 doc/elli_middleware.html delete mode 100644 doc/elli_middleware_compress.html delete mode 100644 doc/elli_request.html delete mode 100644 doc/elli_sendfile.html delete mode 100644 doc/elli_tcp.html delete mode 100644 doc/elli_test.html delete mode 100644 doc/elli_util.html delete mode 100644 doc/index.html delete mode 100644 doc/license.html delete mode 100644 doc/overview.html delete mode 100644 doc/readme.html delete mode 100644 doc/search.html diff --git a/.gitignore b/.gitignore index 4683826..b360cc7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ _build .dialyzer.plt .rebar rebar3.crashdump +doc diff --git a/doc/.build b/doc/.build deleted file mode 100644 index 69c71fc..0000000 --- a/doc/.build +++ /dev/null @@ -1,39 +0,0 @@ -404.html -api-reference.html -changelog.html -dist/handlebars.runtime-NWIB6V2M.js -dist/handlebars.templates-K7URE6B4.js -dist/html-BHYOTRCH.js -dist/html-erlang-EBZIIHAS.css -dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 -dist/inconsolata-latin-700-normal-DTS2D7TO.woff2 -dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 -dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 -dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 -dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 -dist/lato-latin-300-normal-YUMVEFOL.woff2 -dist/lato-latin-400-normal-W7754I4D.woff2 -dist/lato-latin-700-normal-2XVSBPG4.woff2 -dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 -dist/lato-latin-ext-400-normal-N27NCBWW.woff2 -dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 -dist/remixicon-NKANDIL5.woff2 -dist/search_data-EF5B6961.js -dist/sidebar_items-FF1D4582.js -elli.html -elli_example_callback.html -elli_example_callback_handover.html -elli_handler.html -elli_http.html -elli_middleware.html -elli_middleware_compress.html -elli_request.html -elli_sendfile.html -elli_tcp.html -elli_test.html -elli_util.html -index.html -license.html -overview.html -readme.html -search.html diff --git a/doc/404.html b/doc/404.html deleted file mode 100644 index d3735d8..0000000 --- a/doc/404.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - 404 — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -

    - Page not found -

    - -

    Sorry, but the page you were trying to get to, does not exist. You -may want to try searching this site using the sidebar - - or using our API Reference page - -to find what you were looking for.

    - -
    -
    -
    - - - - diff --git a/doc/api-reference.html b/doc/api-reference.html deleted file mode 100644 index 042693b..0000000 --- a/doc/api-reference.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - - - - - API Reference — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - - API Reference elli v3.3.0 -

    - - -
    -

    - - - - Modules -

    - -
    -
    -
    - elli - -
    - -

    Elli acceptor manager

    - -
    -
    - - -

    Elli example callback

    - -
    - -
    -
    - elli_handler - -
    - -
    -
    -
    - elli_http - -
    - -

    Elli HTTP request implementation

    - -
    -
    - - -

    HTTP request processing middleware.

    - -
    -
    - - -

    Response compression as Elli middleware.

    - -
    -
    -
    - elli_request - -
    - -
    -
    - - -
    -
    -
    - elli_tcp - -
    - -

    Wrapper for plain and SSL sockets. Based on mochiweb_socket.erl.

    - -
    -
    -
    - elli_test - -
    - -

    Helper for calling your Elli callback in unit tests. Only the callback specified is actually run. Elli's response handling is not used, so the headers will for example not include a content length and the return format is not standardized. The unit tests below test elli_example_callback.

    - -
    -
    -
    - elli_util - -
    - -
    - -
    -
    - - -
    - - - -
    -
    -
    - - - - diff --git a/doc/changelog.html b/doc/changelog.html deleted file mode 100644 index cfe2a18..0000000 --- a/doc/changelog.html +++ /dev/null @@ -1,359 +0,0 @@ - - - - - - - - - - - CHANGELOG — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - - CHANGELOG -

    - -

    - - - - pre-v4.0.0 -

    -
    • Headers are now properly treated as case-insensitive
    • Original headers that have not had string:casefold/1 run on each header -name are still available in the request through elli_request:original_headers

    - - - - v3.3.0 -

    -
    • Do not use x-forwarded-for for peer #75
    • Handle arguments with no value in (post|get)_arg_decoded #82
    • Fix compile-time warnings on missing record info. from aleppo #81

    - - - - v3.2.0 -

    -

    - - - - v3.1.0 -

    -

    - - - - v3.0.0 -

    -
    • scheme, host, and port added to the #req{} record. Corresponding -helper functions added to the elli_request module.

    - - - - v2.1.2 -

    -
    • Update dependencies and re-enable linting

    • Increase test coverage

    • Declare optional callbacks to elli_handler

    • Add TLS sendfile implementation by James Fish (from Andrew Thompson)

    • Use hackney instead of httpc in tests, due to httpc bug

    - - - - v2.0.2 -

    -
    • Adapt knutin/elli#108 by Michael Zazaian

    • Incomplete request regression fix by Evan Vigil-McClanahan

    • Handle binary URIs on OTP >=20

    • Bespoke uri_decode/1 to obviate inets dependency by Christoffer Vikström

    - - - - v2.0.1 -

    -
    • Miscellaneous tooling, test, and type spec tweaks

    • Helper functions to reduce redundancy

    • Request start timing fix

    - - - - v2.0.0 -

    -
    • Code and documentation cleanup

    • Instrumentation facilities

    • RFC 2616 section 8.2.3 implementation by Martin Karlsson

    • Send 500 and close connection if file operations fail

    - - - - v1.0.5 -

    -
    • Optimization of SSL accept by Tristan Sloughter

    • Dependency cleanup by Adam Lindberg

    - - - - v1.0.4 -

    -
    • OTP 18.0 compatibility, contributed by Florian Odronitz.

    - - - - v1.0.3 -

    -
    • Various internal cleanup fixes from Andreas Stenius (github.com/kaos)

    - - - - v1.0.2 -

    -

    - - - - v1.0.1 -

    -
    • Fix bug in SSL acceptor pool where due to failed handshakes, Elli -runs out of acceptors. Thanks to Stefan Grundmann.

    • In case a handler (or middleware) returns a response Elli does not -understand, Elli will now respond with a 500 error. Thanks to -Johannes Huning.

    • Added elli_request:get_arg_decoded/2,3 which HTTP URI decodes the -value passed in the request. Thanks to Mariano Valles.

    - - - - v1.0 -

    -
    • SSL using built-in ssl from Erlang/OTP. Thanks to Maas-Maarten Zeeman.

    • "Handover" a socket to user code, making it possible to implement -WebSockets(https://github.com/mmzeeman/elli_websocket).

    • Type fixes from Ingo Struck and Andreas Hasselberg.

    - - - - v0.4.1 -

    -
    • Fix from Christian Lundgren for browsers that include spaces in the -value of the Content-Length header.

    - - - - v0.4 -

    -
    • Added support for sending ranges of a file with sendfile by -returning {Code, Headers, {file, Filename, {Offset, Length}}}. If -no offset and length is specified, the entire file is sent. The -user must provide an appropriate "Content-Length" and -"Content-Range" header, see the example in -elli_example_callback.erl -(https://github.com/knutin/elli/blob/master/src/elli_example_callback.erl#L99). -Thanks Vincent Siliakus (zambal).

    - - - - v0.3 -

    -
    • Breaking change: Timeouts used in the HTTP protocol are now -configurable. To implement this, changing a record and some -callbacks was necessary. To upgrade, a restart of Elli is needed.

    • Elli now supports pipelining of any type of request. Some proxies -or special clients (like ibrowse) will pipeline requests to reduce -latency.

    • If there are no more file descriptors, Elli will shut down. This -mimics the behaviour found in Yaws.

    • Chunked transfer responses will now exit the Elli process when the -client closes the connection. Sending a synchronous chunk will -return {error, closed} if client has closed the connection and -the chunk_complete event is sent to your callback including which -end closed the connection.

    - - - - v0.2.0 -

    -
    • Breaking change: moved elli_access_log into a separate repository -at github.com/wooga/elli_access_log. Thanks martinrehfeld.

    - - - - v0.1.3 -

    -
    • Added elli_test which makes it easy to write unit tests for your -callbacks. Thanks anha0825.

    • Added sendfile support. Thanks chrisavl.

    - - - - v0.1.2 -

    -
    • Added option to specify listen IP address. Thanks hukl.

    - - - - v0.1.1 -

    -
    • Don't look up the peer ip address on every request anymore, do it -on demand using elli_request:peer/1.

    - - - - v0.1 -

    -
    • Initial release.
    -
    - - - -
    -
    -
    - - - - diff --git a/doc/dist/handlebars.runtime-NWIB6V2M.js b/doc/dist/handlebars.runtime-NWIB6V2M.js deleted file mode 100644 index 117dc6c..0000000 --- a/doc/dist/handlebars.runtime-NWIB6V2M.js +++ /dev/null @@ -1,30 +0,0 @@ -/**! - - @license - handlebars v4.7.7 - -Copyright (C) 2011-2019 by Yehuda Katz - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/(function(r,e){typeof exports=="object"&&typeof module=="object"?module.exports=e():typeof define=="function"&&define.amd?define([],e):typeof exports=="object"?exports.Handlebars=e():r.Handlebars=e()})(this,function(){return function(u){var r={};function e(n){if(r[n])return r[n].exports;var t=r[n]={exports:{},id:n,loaded:!1};return u[n].call(t.exports,t,t.exports,e),t.loaded=!0,t.exports}return e.m=u,e.c=r,e.p="",e(0)}([function(u,r,e){"use strict";var n=e(1).default,t=e(2).default;r.__esModule=!0;var f=e(3),a=n(f),i=e(36),l=t(i),h=e(5),v=t(h),P=e(4),H=n(P),C=e(37),E=n(C),I=e(43),o=t(I);function g(){var y=new a.HandlebarsEnvironment;return H.extend(y,a),y.SafeString=l.default,y.Exception=v.default,y.Utils=H,y.escapeExpression=H.escapeExpression,y.VM=E,y.template=function(p){return E.template(p,y)},y}var w=g();w.create=g,o.default(w),w.default=w,r.default=w,u.exports=r.default},function(u,r){"use strict";r.default=function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n[t]=e[t]);return n.default=e,n},r.__esModule=!0},function(u,r){"use strict";r.default=function(e){return e&&e.__esModule?e:{default:e}},r.__esModule=!0},function(u,r,e){"use strict";var n=e(2).default;r.__esModule=!0,r.HandlebarsEnvironment=g;var t=e(4),f=e(5),a=n(f),i=e(9),l=e(29),h=e(31),v=n(h),P=e(32),H="4.7.7";r.VERSION=H;var C=8;r.COMPILER_REVISION=C;var E=7;r.LAST_COMPATIBLE_COMPILER_REVISION=E;var I={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0 <4.3.0",8:">= 4.3.0"};r.REVISION_CHANGES=I;var o="[object Object]";function g(y,p,R){this.helpers=y||{},this.partials=p||{},this.decorators=R||{},i.registerDefaultHelpers(this),l.registerDefaultDecorators(this)}g.prototype={constructor:g,logger:v.default,log:v.default.log,registerHelper:function(p,R){if(t.toString.call(p)===o){if(R)throw new a.default("Arg not supported with multiple helpers");t.extend(this.helpers,p)}else this.helpers[p]=R},unregisterHelper:function(p){delete this.helpers[p]},registerPartial:function(p,R){if(t.toString.call(p)===o)t.extend(this.partials,p);else{if(typeof R>"u")throw new a.default('Attempting to register a partial called "'+p+'" as undefined');this.partials[p]=R}},unregisterPartial:function(p){delete this.partials[p]},registerDecorator:function(p,R){if(t.toString.call(p)===o){if(R)throw new a.default("Arg not supported with multiple decorators");t.extend(this.decorators,p)}else this.decorators[p]=R},unregisterDecorator:function(p){delete this.decorators[p]},resetLoggedPropertyAccesses:function(){P.resetLoggedProperties()}};var w=v.default.log;r.log=w,r.createFrame=t.createFrame,r.logger=v.default},function(u,r){"use strict";r.__esModule=!0,r.extend=a,r.indexOf=v,r.escapeExpression=P,r.isEmpty=H,r.createFrame=C,r.blockParams=E,r.appendContextPath=I;var e={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},n=/[&<>"'`=]/g,t=/[&<>"'`=]/;function f(o){return e[o]}function a(o){for(var g=1;g0?(a.ids&&(a.ids=[a.name]),t.helpers.each(f,a)):i(this);if(a.data&&a.ids){var h=n.createFrame(a.data);h.contextPath=n.appendContextPath(a.data.contextPath,a.name),a={data:h}}return l(f,a)})},u.exports=r.default},function(u,r,e){(function(n){"use strict";var t=e(12).default,f=e(2).default;r.__esModule=!0;var a=e(4),i=e(5),l=f(i);r.default=function(h){h.registerHelper("each",function(v,P){if(!P)throw new l.default("Must pass iterator to #each");var H=P.fn,C=P.inverse,E=0,I="",o=void 0,g=void 0;P.data&&P.ids&&(g=a.appendContextPath(P.data.contextPath,P.ids[0])+"."),a.isFunction(v)&&(v=v.call(this)),P.data&&(o=a.createFrame(P.data));function w(b,F,c){o&&(o.key=b,o.index=F,o.first=F===0,o.last=!!c,g&&(o.contextPath=g+b)),I=I+H(v[b],{data:o,blockParams:a.blockParams([v[b],b],[g+b,null])})}if(v&&typeof v=="object")if(a.isArray(v))for(var y=v.length;E=0?a=i:a=parseInt(a,10)}return a},log:function(a){if(a=t.lookupLevel(a),typeof console<"u"&&t.lookupLevel(t.level)<=a){var i=t.methodMap[a];console[i]||(i="log");for(var l=arguments.length,h=Array(l>1?l-1:0),v=1;v=P.LAST_COMPATIBLE_COMPILER_REVISION&&O<=P.COMPILER_REVISION))if(O{(function(){var d=Handlebars.template,y=Handlebars.templates=Handlebars.templates||{};y["autocomplete-suggestions"]=d({1:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return' -
    -`+((o=t(a,"if").call(r,l!=null?t(l,"deprecated"):l,{name:"if",hash:{},fn:e.program(2,u,0),inverse:e.program(4,u,0),data:u,loc:{start:{line:16,column:10},end:{line:20,column:17}}}))!=null?o:"")+` -`+((o=t(a,"each").call(r,l!=null?t(l,"labels"):l,{name:"each",hash:{},fn:e.program(6,u,0),inverse:e.noop,data:u,loc:{start:{line:22,column:10},end:{line:24,column:19}}}))!=null?o:"")+`
    - -
    -
    - -
    -
    - -`+((o=t(a,"if").call(r,l!=null?t(l,"description"):l,{name:"if",hash:{},fn:e.program(8,u,0),inverse:e.noop,data:u,loc:{start:{line:39,column:8},end:{line:43,column:15}}}))!=null?o:"")+`
    -`},2:function(e,l,a,p,u){var o,n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' '+((o=(n=(n=r(a,"title")||(l!=null?r(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:u,loc:{start:{line:17,column:49},end:{line:17,column:60}}}):n))!=null?o:"")+` -`},4:function(e,l,a,p,u){var o,n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' '+((o=(n=(n=r(a,"title")||(l!=null?r(l,"title"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"title",hash:{},data:u,loc:{start:{line:19,column:46},end:{line:19,column:57}}}):n))!=null?o:"")+` -`},6:function(e,l,a,p,u){return' '+e.escapeExpression(e.lambda(l,l))+` -`},8:function(e,l,a,p,u){var o,n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`
    - `+((o=(n=(n=r(a,"description")||(l!=null?r(l,"description"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(l??(e.nullContext||{}),{name:"description",hash:{},data:u,loc:{start:{line:41,column:10},end:{line:41,column:27}}}):n))!=null?o:"")+` -
    -`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
    -
    -
    -
    - - Autocompletion results for "`+e.escapeExpression((n=(n=s(a,"term")||(l!=null?s(l,"term"):l))!=null?n:e.hooks.helperMissing,typeof n=="function"?n.call(r,{name:"term",hash:{},data:u,loc:{start:{line:6,column:55},end:{line:6,column:63}}}):n))+`" - - - Press RETURN for full-text search, TAB for previews - -
    -
    -`+((o=s(a,"each").call(r,l!=null?s(l,"suggestions"):l,{name:"each",hash:{},fn:e.program(1,u,0),inverse:e.noop,data:u,loc:{start:{line:13,column:6},end:{line:45,column:15}}}))!=null?o:"")+`
    -
    -
    -`},useData:!0}),y["modal-layout"]=d({compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){return` -`},useData:!0}),y["quick-switch-modal-body"]=d({compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){return`
    - - -
    -
    -`},useData:!0}),y["quick-switch-results"]=d({1:function(e,l,a,p,u){var o,n=l??(e.nullContext||{}),r=e.hooks.helperMissing,s="function",i=e.escapeExpression,c=e.lookupProperty||function(t,f){if(Object.prototype.hasOwnProperty.call(t,f))return t[f]};return'
    - `+i((o=(o=c(a,"name")||(l!=null?c(l,"name"):l))!=null?o:r,typeof o===s?o.call(n,{name:"name",hash:{},data:u,loc:{start:{line:3,column:4},end:{line:3,column:12}}}):o))+` -
    -`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(1,u,0),inverse:e.noop,data:u,loc:{start:{line:1,column:0},end:{line:5,column:9}}}))!=null?o:""},useData:!0}),y["search-results"]=d({1:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return" Search results for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:u,loc:{start:{line:3,column:27},end:{line:3,column:36}}}):o))+` -`},3:function(e,l,a,p,u){return` Invalid search -`},5:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"each").call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"each",hash:{},fn:e.program(6,u,0),inverse:e.noop,data:u,loc:{start:{line:10,column:2},end:{line:21,column:11}}}))!=null?o:""},6:function(e,l,a,p,u){var o,n=e.lambda,r=e.escapeExpression,s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
    -

    - - `+r(n(l!=null?s(l,"title"):l,l))+" ("+r(n(l!=null?s(l,"type"):l,l))+`) - -

    -`+((o=s(a,"each").call(l??(e.nullContext||{}),l!=null?s(l,"excerpts"):l,{name:"each",hash:{},fn:e.program(7,u,0),inverse:e.noop,data:u,loc:{start:{line:17,column:8},end:{line:19,column:17}}}))!=null?o:"")+`
    -`},7:function(e,l,a,p,u){var o;return'

    '+((o=e.lambda(l,l))!=null?o:"")+`

    -`},9:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return((o=(n(a,"isArray")||l&&n(l,"isArray")||e.hooks.helperMissing).call(l??(e.nullContext||{}),l!=null?n(l,"results"):l,{name:"isArray",hash:{},fn:e.program(10,u,0),inverse:e.program(12,u,0),data:u,loc:{start:{line:23,column:2},end:{line:29,column:14}}}))!=null?o:"")+` -

    The search functionality is full-text based. Here are some tips:

    - -
      -
    • Multiple words (such as foo bar) are searched as OR
    • -
    • Use * anywhere (such as fo*) as wildcard
    • -
    • Use + before a word (such as +foo) to make its presence required
    • -
    • Use - before a word (such as -foo) to make its absence required
    • -
    • Use : to search on a particular field (such as field:word). The available fields are title, doc and type
    • -
    • Use WORD^NUMBER (such as foo^2) to boost the given word
    • -
    • Use WORD~NUMBER (such as foo~2) to do a search with edit distance on word
    • -
    - -

    To quickly go to a module, type, or function, use the autocompletion feature in the sidebar search.

    -`},10:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return"

    Sorry, we couldn't find anything for "+e.escapeExpression((o=(o=n(a,"value")||(l!=null?n(l,"value"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"value",hash:{},data:u,loc:{start:{line:24,column:48},end:{line:24,column:57}}}):o))+`.

    -`},12:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"value"):l,{name:"if",hash:{},fn:e.program(13,u,0),inverse:e.program(15,u,0),data:u,loc:{start:{line:25,column:2},end:{line:29,column:2}}}))!=null?o:""},13:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return"

    Invalid search: "+e.escapeExpression((o=(o=n(a,"errorMessage")||(l!=null?n(l,"errorMessage"):l))!=null?o:e.hooks.helperMissing,typeof o=="function"?o.call(l??(e.nullContext||{}),{name:"errorMessage",hash:{},data:u,loc:{start:{line:26,column:23},end:{line:26,column:39}}}):o))+`.

    -`},15:function(e,l,a,p,u){return`

    Please type something into the search bar to perform a search.

    - `},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=l??(e.nullContext||{}),r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`

    -`+((o=r(a,"if").call(n,l!=null?r(l,"value"):l,{name:"if",hash:{},fn:e.program(1,u,0),inverse:e.program(3,u,0),data:u,loc:{start:{line:2,column:2},end:{line:6,column:9}}}))!=null?o:"")+`

    - -`+((o=(r(a,"isNonEmptyArray")||l&&r(l,"isNonEmptyArray")||e.hooks.helperMissing).call(n,l!=null?r(l,"results"):l,{name:"isNonEmptyArray",hash:{},fn:e.program(5,u,0),inverse:e.program(9,u,0),data:u,loc:{start:{line:9,column:0},end:{line:44,column:20}}}))!=null?o:"")},useData:!0}),y["settings-modal-body"]=d({1:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"description"):l,{name:"if",hash:{},fn:e.program(2,u,0),inverse:e.noop,data:u,loc:{start:{line:40,column:6},end:{line:53,column:13}}}))!=null?o:""},2:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    -
    - `+e.escapeExpression(e.lambda(l!=null?n(l,"description"):l,l))+` -
    -
    -`+((o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"displayAs"):l,{name:"if",hash:{},fn:e.program(3,u,0),inverse:e.program(5,u,0),data:u,loc:{start:{line:46,column:12},end:{line:50,column:19}}}))!=null?o:"")+`
    -
    -`},3:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return" "+((o=e.lambda(l!=null?n(l,"displayAs"):l,l))!=null?o:"")+` -`},5:function(e,l,a,p,u){var o=e.lookupProperty||function(n,r){if(Object.prototype.hasOwnProperty.call(n,r))return n[r]};return" "+e.escapeExpression(e.lambda(l!=null?o(l,"key"):l,l))+` -`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    -
    - - - - -
    - -
    -`},useData:!0}),y["sidebar-items"]=d({1:function(e,l,a,p,u,o,n){var r,s=l??(e.nullContext||{}),i=e.hooks.helperMissing,c=e.lookupProperty||function(t,f){if(Object.prototype.hasOwnProperty.call(t,f))return t[f]};return((r=(c(a,"groupChanged")||l&&c(l,"groupChanged")||i).call(s,n[1],(r=o[0][0])!=null?c(r,"group"):r,{name:"groupChanged",hash:{},fn:e.program(2,u,0,o,n),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:2,column:2},end:{line:6,column:19}}}))!=null?r:"")+` -`+((r=(c(a,"nestingChanged")||l&&c(l,"nestingChanged")||i).call(s,n[1],o[0][0],{name:"nestingChanged",hash:{},fn:e.program(7,u,0,o,n),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:8,column:2},end:{line:10,column:21}}}))!=null?r:"")+` -
  • - -`+((r=c(a,"if").call(s,(r=o[0][0])!=null?c(r,"nested_title"):r,{name:"if",hash:{},fn:e.program(17,u,0,o,n),inverse:e.program(19,u,0,o,n),data:u,blockParams:o,loc:{start:{line:14,column:6},end:{line:18,column:13}}}))!=null?r:"")+` - -`+((r=(c(a,"isEmptyArray")||l&&c(l,"isEmptyArray")||i).call(s,(r=o[0][0])!=null?c(r,"headers"):r,{name:"isEmptyArray",hash:{},fn:e.program(3,u,0,o,n),inverse:e.program(21,u,0,o,n),data:u,blockParams:o,loc:{start:{line:21,column:4},end:{line:24,column:21}}}))!=null?r:"")+` -`+((r=(c(a,"isArray")||l&&c(l,"isArray")||i).call(s,(r=o[0][0])!=null?c(r,"headers"):r,{name:"isArray",hash:{},fn:e.program(24,u,0,o,n),inverse:e.program(28,u,0,o,n),data:u,blockParams:o,loc:{start:{line:26,column:4},end:{line:74,column:16}}}))!=null?r:"")+`
  • -`},2:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return'
  • - `+e.escapeExpression(e.lambda((n=o[1][0])!=null?r(n,"group"):n,l))+` -
  • -`},3:function(e,l,a,p,u){return""},5:function(e,l,a,p,u){return'translate="no"'},7:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' -`},9:function(e,l,a,p,u){return"current-page open"},11:function(e,l,a,p,u){return"#content"},13:function(e,l,a,p,u){return"page"},15:function(e,l,a,p,u){return"false"},17:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return" "+((n=e.lambda((n=o[1][0])!=null?r(n,"nested_title"):n,l))!=null?n:"")+` -`},19:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return" "+((n=e.lambda((n=o[1][0])!=null?r(n,"title"):n,l))!=null?n:"")+` -`},21:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return' -`},22:function(e,l,a,p,u){return"true"},24:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return(n=(r(a,"isNonEmptyArray")||l&&r(l,"isNonEmptyArray")||e.hooks.helperMissing).call(l??(e.nullContext||{}),(n=o[1][0])!=null?r(n,"headers"):n,{name:"isNonEmptyArray",hash:{},fn:e.program(25,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:27,column:6},end:{line:35,column:26}}}))!=null?n:""},25:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return'
      -`+((n=r(a,"each").call(l??(e.nullContext||{}),(n=o[2][0])!=null?r(n,"headers"):n,{name:"each",hash:{},fn:e.program(26,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:29,column:10},end:{line:33,column:19}}}))!=null?n:"")+`
    -`},26:function(e,l,a,p,u,o){var n,r,s=l??(e.nullContext||{}),i=e.hooks.helperMissing,c="function",t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return`
  • - '+((n=(r=(r=t(a,"id")||(l!=null?t(l,"id"):l))!=null?r:i,typeof r===c?r.call(s,{name:"id",hash:{},data:u,blockParams:o,loc:{start:{line:31,column:54},end:{line:31,column:62}}}):r))!=null?n:"")+` -
  • -`},28:function(e,l,a,p,u,o){var n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i=e.lookupProperty||function(c,t){if(Object.prototype.hasOwnProperty.call(c,t))return c[t]};return'
      -`+((n=(i(a,"showSections")||l&&i(l,"showSections")||s).call(r,o[1][0],{name:"showSections",hash:{},fn:e.program(29,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:38,column:8},end:{line:52,column:25}}}))!=null?n:"")+((n=(i(a,"showSummary")||l&&i(l,"showSummary")||s).call(r,o[1][0],{name:"showSummary",hash:{},fn:e.program(34,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:53,column:8},end:{line:57,column:24}}}))!=null?n:"")+((n=i(a,"each").call(r,(n=o[1][0])!=null?i(n,"nodeGroups"):n,{name:"each",hash:{},fn:e.program(36,u,1,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:58,column:8},end:{line:72,column:17}}}))!=null?n:"")+`
    -`},29:function(e,l,a,p,u,o){var n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i=e.lambda,c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return'
  • - - Sections - - -
      -`+((n=t(a,"each").call(r,l!=null?t(l,"sections"):l,{name:"each",hash:{},fn:e.program(32,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:45,column:14},end:{line:49,column:23}}}))!=null?n:"")+`
    -
  • -`},30:function(e,l,a,p,u){return"open"},32:function(e,l,a,p,u,o){var n,r,s=e.escapeExpression,i=l??(e.nullContext||{}),c=e.hooks.helperMissing,t="function",f=e.lookupProperty||function(m,v){if(Object.prototype.hasOwnProperty.call(m,v))return m[v]};return`
  • - '+((n=(r=(r=f(a,"id")||(l!=null?f(l,"id"):l))!=null?r:c,typeof r===t?r.call(i,{name:"id",hash:{},data:u,blockParams:o,loc:{start:{line:47,column:56},end:{line:47,column:64}}}):r))!=null?n:"")+` -
  • -`},34:function(e,l,a,p,u,o){var n,r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`
  • - Summary -
  • -`},36:function(e,l,a,p,u,o){var n,r=e.lambda,s=e.escapeExpression,i=e.lookupProperty||function(c,t){if(Object.prototype.hasOwnProperty.call(c,t))return c[t]};return`
  • - - `+s(r((n=o[0][0])!=null?i(n,"name"):n,l))+` - - -
      -`+((n=i(a,"each").call(l??(e.nullContext||{}),(n=o[0][0])!=null?i(n,"nodes"):n,{name:"each",hash:{},fn:e.program(37,u,0,o),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:65,column:14},end:{line:69,column:23}}}))!=null?n:"")+`
    -
  • -`},37:function(e,l,a,p,u,o){var n,r,s=e.escapeExpression,i=l??(e.nullContext||{}),c=e.hooks.helperMissing,t="function",f=e.lookupProperty||function(m,v){if(Object.prototype.hasOwnProperty.call(m,v))return m[v]};return`
  • - '+s((r=(r=f(a,"id")||(l!=null?f(l,"id"):l))!=null?r:c,typeof r===t?r.call(i,{name:"id",hash:{},data:u,blockParams:o,loc:{start:{line:67,column:89},end:{line:67,column:95}}}):r))+` -
  • -`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u,o,n){var r,s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return(r=s(a,"each").call(l??(e.nullContext||{}),l!=null?s(l,"nodes"):l,{name:"each",hash:{},fn:e.program(1,u,2,o,n),inverse:e.noop,data:u,blockParams:o,loc:{start:{line:1,column:0},end:{line:76,column:9}}}))!=null?r:""},useData:!0,useDepths:!0,useBlockParams:!0}),y.tabset=d({1:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return' -`},2:function(e,l,a,p,u){return"-1"},4:function(e,l,a,p,u){return"0"},6:function(e,l,a,p,u){return"false"},8:function(e,l,a,p,u){return"true"},10:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return'
    -`+((o=t(a,"each").call(r,l!=null?t(l,"content"):l,{name:"each",hash:{},fn:e.program(13,u,0),inverse:e.noop,data:u,loc:{start:{line:16,column:4},end:{line:18,column:13}}}))!=null?o:"")+`
    -`},11:function(e,l,a,p,u){return"hidden"},13:function(e,l,a,p,u){var o;return" "+((o=e.lambda(l,l))!=null?o:"")+` -`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=l??(e.nullContext||{}),r=e.lookupProperty||function(s,i){if(Object.prototype.hasOwnProperty.call(s,i))return s[i]};return`
    -`+((o=r(a,"each").call(n,l!=null?r(l,"tabs"):l,{name:"each",hash:{},fn:e.program(1,u,0),inverse:e.noop,data:u,loc:{start:{line:2,column:2},end:{line:9,column:11}}}))!=null?o:"")+`
    - -`+((o=r(a,"each").call(n,l!=null?r(l,"tabs"):l,{name:"each",hash:{},fn:e.program(10,u,0),inverse:e.noop,data:u,loc:{start:{line:12,column:0},end:{line:20,column:9}}}))!=null?o:"")},useData:!0}),y["tooltip-body"]=d({1:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    - `+e.escapeExpression(e.lambda((o=l!=null?n(l,"hint"):l)!=null?n(o,"description"):o,l))+` -
    -`},3:function(e,l,a,p,u){var o,n=e.lambda,r=e.escapeExpression,s=e.lookupProperty||function(i,c){if(Object.prototype.hasOwnProperty.call(i,c))return i[c]};return`
    -

    - `+r(n((o=l!=null?s(l,"hint"):l)!=null?s(o,"title"):o,l))+` -
    `+r(n((o=l!=null?s(l,"hint"):l)!=null?s(o,"version"):o,l))+`
    -

    -
    -`+((o=s(a,"if").call(l??(e.nullContext||{}),(o=l!=null?s(l,"hint"):l)!=null?s(o,"description"):o,{name:"if",hash:{},fn:e.program(4,u,0),inverse:e.noop,data:u,loc:{start:{line:12,column:2},end:{line:16,column:9}}}))!=null?o:"")},4:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    - `+((o=e.lambda((o=l!=null?n(l,"hint"):l)!=null?n(o,"description"):o,l))!=null?o:"")+` -
    -`},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return(o=n(a,"if").call(l??(e.nullContext||{}),l!=null?n(l,"isPlain"):l,{name:"if",hash:{},fn:e.program(1,u,0),inverse:e.program(3,u,0),data:u,loc:{start:{line:1,column:0},end:{line:17,column:7}}}))!=null?o:""},useData:!0}),y["tooltip-layout"]=d({compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){return`
    -
    -
    -`},useData:!0}),y["versions-dropdown"]=d({1:function(e,l,a,p,u){var o,n,r=l??(e.nullContext||{}),s=e.hooks.helperMissing,i="function",c=e.escapeExpression,t=e.lookupProperty||function(f,m){if(Object.prototype.hasOwnProperty.call(f,m))return f[m]};return' -`},2:function(e,l,a,p,u){return" selected disabled"},compiler:[8,">= 4.3.0"],main:function(e,l,a,p,u){var o,n=e.lookupProperty||function(r,s){if(Object.prototype.hasOwnProperty.call(r,s))return r[s]};return`
    - -
    -`},useData:!0})})();})(); diff --git a/doc/dist/html-BHYOTRCH.js b/doc/dist/html-BHYOTRCH.js deleted file mode 100644 index 5880235..0000000 --- a/doc/dist/html-BHYOTRCH.js +++ /dev/null @@ -1,56 +0,0 @@ -(()=>{var Zn=Object.create;var ut=Object.defineProperty;var ei=Object.getOwnPropertyDescriptor;var ti=Object.getOwnPropertyNames;var ni=Object.getPrototypeOf,ii=Object.prototype.hasOwnProperty;var dt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ri=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ti(t))!ii.call(e,r)&&r!==n&&ut(e,r,{get:()=>t[r],enumerable:!(i=ei(t,r))||i.enumerable});return e};var ft=(e,t,n)=>(n=e!=null?Zn(ni(e)):{},ri(t||!e||!e.__esModule?ut(n,"default",{value:e,enumerable:!0}):n,e));var kt=dt((ro,wt)=>{var Tt="Expected a function",Et=NaN,mi="[object Symbol]",gi=/^\s+|\s+$/g,yi=/^[-+]0x[0-9a-f]+$/i,vi=/^0b[01]+$/i,bi=/^0o[0-7]+$/i,Si=parseInt,xi=typeof global=="object"&&global&&global.Object===Object&&global,Ei=typeof self=="object"&&self&&self.Object===Object&&self,Li=xi||Ei||Function("return this")(),Ti=Object.prototype,wi=Ti.toString,ki=Math.max,_i=Math.min,Fe=function(){return Li.Date.now()};function Oi(e,t,n){var i,r,s,o,a,l,u=0,f=!1,y=!1,g=!0;if(typeof e!="function")throw new TypeError(Tt);t=Lt(t)||0,ve(n)&&(f=!!n.leading,y="maxWait"in n,s=y?ki(Lt(n.maxWait)||0,t):s,g="trailing"in n?!!n.trailing:g);function L(S){var C=i,D=r;return i=r=void 0,u=S,o=e.apply(D,C),o}function b(S){return u=S,a=setTimeout(h,t),f?L(S):o}function T(S){var C=S-l,D=S-u,V=t-C;return y?_i(V,s-D):V}function m(S){var C=S-l,D=S-u;return l===void 0||C>=t||C<0||y&&D>=s}function h(){var S=Fe();if(m(S))return _(S);a=setTimeout(h,T(S))}function _(S){return a=void 0,g&&i?L(S):(i=r=void 0,o)}function w(){a!==void 0&&clearTimeout(a),u=0,i=l=r=a=void 0}function N(){return a===void 0?o:_(Fe())}function F(){var S=Fe(),C=m(S);if(i=arguments,r=this,l=S,C){if(a===void 0)return b(l);if(y)return a=setTimeout(h,t),L(l)}return a===void 0&&(a=setTimeout(h,t)),o}return F.cancel=w,F.flush=N,F}function Ii(e,t,n){var i=!0,r=!0;if(typeof e!="function")throw new TypeError(Tt);return ve(n)&&(i="leading"in n?!!n.leading:i,r="trailing"in n?!!n.trailing:r),Oi(e,t,{leading:i,maxWait:t,trailing:r})}function ve(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function Ci(e){return!!e&&typeof e=="object"}function Ai(e){return typeof e=="symbol"||Ci(e)&&wi.call(e)==mi}function Lt(e){if(typeof e=="number")return e;if(Ai(e))return Et;if(ve(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=ve(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=e.replace(gi,"");var n=vi.test(e);return n||bi.test(e)?Si(e.slice(2),n?2:8):yi.test(e)?Et:+e}wt.exports=Ii});var ln=dt((an,cn)=>{(function(){var e=function(t){var n=new e.Builder;return n.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),n.searchPipeline.add(e.stemmer),t.call(n,n),n.build()};e.version="2.3.9";e.utils={},e.utils.warn=function(t){return function(n){t.console&&console.warn&&console.warn(n)}}(this),e.utils.asString=function(t){return t==null?"":t.toString()},e.utils.clone=function(t){if(t==null)return t;for(var n=Object.create(null),i=Object.keys(t),r=0;r0){var f=e.utils.clone(n)||{};f.position=[a,u],f.index=s.length,s.push(new e.Token(i.slice(a,o),f))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/;e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,n){n in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+n),t.label=n,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var n=t.label&&t.label in this.registeredFunctions;n||e.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,t)},e.Pipeline.load=function(t){var n=new e.Pipeline;return t.forEach(function(i){var r=e.Pipeline.registeredFunctions[i];if(r)n.add(r);else throw new Error("Cannot load unregistered function: "+i)}),n},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(n){e.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},e.Pipeline.prototype.after=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i=i+1,this._stack.splice(i,0,n)},e.Pipeline.prototype.before=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},e.Pipeline.prototype.remove=function(t){var n=this._stack.indexOf(t);n!=-1&&this._stack.splice(n,1)},e.Pipeline.prototype.run=function(t){for(var n=this._stack.length,i=0;i1&&(ot&&(i=s),o!=t);)r=i-n,s=n+Math.floor(r/2),o=this.elements[s*2];if(o==t||o>t)return s*2;if(ol?f+=2:a==l&&(n+=i[u+1]*r[f+1],u+=2,f+=2);return n},e.Vector.prototype.similarity=function(t){return this.dot(t)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var t=new Array(this.elements.length/2),n=1,i=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new e.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),r.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),r.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&r.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),r.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var f=s.str.charAt(0),y=s.str.charAt(1),g;y in s.node.edges?g=s.node.edges[y]:(g=new e.TokenSet,s.node.edges[y]=g),s.str.length==1&&(g.final=!0),r.push({node:g,editsRemaining:s.editsRemaining-1,str:f+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var n=new e.TokenSet,i=n,r=0,s=t.length;r=t;n--){var i=this.uncheckedNodes[n],r=i.child.toString();r in this.minimizedNodes?i.parent.edges[i.char]=this.minimizedNodes[r]:(i.child._str=r,this.minimizedNodes[r]=i.child),this.uncheckedNodes.pop()}};e.Index=function(t){this.invertedIndex=t.invertedIndex,this.fieldVectors=t.fieldVectors,this.tokenSet=t.tokenSet,this.fields=t.fields,this.pipeline=t.pipeline},e.Index.prototype.search=function(t){return this.query(function(n){var i=new e.QueryParser(t,n);i.parse()})},e.Index.prototype.query=function(t){for(var n=new e.Query(this.fields),i=Object.create(null),r=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=t},e.Builder.prototype.k1=function(t){this._k1=t},e.Builder.prototype.add=function(t,n){var i=t[this._ref],r=Object.keys(this._fields);this._documents[i]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,n;do t=this.next(),n=t.charCodeAt(0);while(n>47&&n<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var n=t.next();if(n==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){t.escapeCharacter();continue}if(n==":")return e.QueryLexer.lexField;if(n=="~")return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if(n=="^")return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if(n=="+"&&t.width()===1||n=="-"&&t.width()===1)return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(n.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}},e.QueryParser=function(t,n){this.lexer=new e.QueryLexer(t),this.query=n,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var t=this.peekLexeme();return this.lexemeIdx+=1,t},e.QueryParser.prototype.nextClause=function(){var t=this.currentClause;this.query.clause(t),this.currentClause={}},e.QueryParser.parseClause=function(t){var n=t.peekLexeme();if(n!=null)switch(n.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(i+=" with value '"+n.str+"'"),new e.QueryParseError(i,n.start,n.end)}},e.QueryParser.parsePresence=function(t){var n=t.consumeLexeme();if(n!=null){switch(n.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+n.str+"'";throw new e.QueryParseError(i,n.start,n.end)}var r=t.peekLexeme();if(r==null){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,n.start,n.end)}switch(r.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+r.type+"'";throw new e.QueryParseError(i,r.start,r.end)}}},e.QueryParser.parseField=function(t){var n=t.consumeLexeme();if(n!=null){if(t.query.allFields.indexOf(n.str)==-1){var i=t.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),r="unrecognised field '"+n.str+"', possible fields: "+i;throw new e.QueryParseError(r,n.start,n.end)}t.currentClause.fields=[n.str];var s=t.peekLexeme();if(s==null){var r="expecting term, found nothing";throw new e.QueryParseError(r,n.start,n.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var r="expecting term, found '"+s.type+"'";throw new e.QueryParseError(r,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var n=t.consumeLexeme();if(n!=null){t.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(i==null){t.nextClause();return}switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(r,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var n=t.consumeLexeme();if(n!=null){var i=parseInt(n.str,10);if(isNaN(i)){var r="edit distance must be numeric";throw new e.QueryParseError(r,n.start,n.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(s==null){t.nextClause();return}switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(r,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var n=t.consumeLexeme();if(n!=null){var i=parseInt(n.str,10);if(isNaN(i)){var r="boost must be numeric";throw new e.QueryParseError(r,n.start,n.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(s==null){t.nextClause();return}switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(r,s.start,s.end)}}},function(t,n){typeof define=="function"&&define.amd?define(n):typeof an=="object"?cn.exports=n():t.lunr=n()}(this,function(){return e})})()});Handlebars.registerHelper("groupChanged",function(e,t,n){let i=t||"";if(e.group!==i)return delete e.nestedContext,e.group=i,n.fn(this)});Handlebars.registerHelper("nestingChanged",function(e,t,n){if(t.nested_context&&t.nested_context!==e.nestedContext){if(e.nestedContext=t.nested_context,e.lastModuleSeenInGroup!==t.nested_context)return n.fn(this)}else e.lastModuleSeenInGroup=t.title});Handlebars.registerHelper("showSections",function(e,t){if(e.sections.length>0)return t.fn(this)});Handlebars.registerHelper("showSummary",function(e,t){if(e.nodeGroups)return t.fn(this)});Handlebars.registerHelper("isArray",function(e,t){return Array.isArray(e)?t.fn(this):t.inverse(this)});Handlebars.registerHelper("isNonEmptyArray",function(e,t){return Array.isArray(e)&&e.length>0?t.fn(this):t.inverse(this)});Handlebars.registerHelper("isEmptyArray",function(e,t){return Array.isArray(e)&&e.length===0?t.fn(this):t.inverse(this)});Handlebars.registerHelper("isLocal",function(e,t){let n=window.location.pathname.split("/").pop();return e+".html"===n?t.fn(this):t.inverse(this)});var c=document.querySelector.bind(document),k=document.querySelectorAll.bind(document);function pt(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function he(e){return String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function $(){return document.body.dataset.type}function ht(e,t){if(e){for(let n of e){let i=n.nodeGroups&&n.nodeGroups.find(r=>r.nodes.some(s=>s.anchor===t));if(i)return i.key}return null}}function me(e,t=!1){if(!e)return t?document.getElementById("top-content"):null;let n=document.getElementById(e);return n?n.matches(".detail")?n:["h1","h2","h3","h4","h5","h6"].includes(n.tagName.toLowerCase())?si(n):null:null}function si(e){let t=[e],n=e.nextElementSibling,i=e.tagName.toLowerCase();for(;n;){let s=n.tagName.toLowerCase();["h1","h2","h3","h4","h5","h6"].includes(s)&&s<=i?n=null:(t.push(n),n=n.nextElementSibling)}let r=document.createElement("div");return r.append(...t),r}function ee(){return window.location.hash.replace(/^#/,"")}function mt(e){return new URLSearchParams(window.location.search).get(e)}function gt(e){return fetch(e).then(t=>t.ok).catch(()=>!1)}function yt(e){document.readyState!=="loading"?e():document.addEventListener("DOMContentLoaded",e)}function te(e){return!e||e.trim()===""}function vt(e,t){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>{n=null,e(...r)},t)}}function ge(){return document.head.querySelector("meta[name=project][content]").content}function ye(){return/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)}var bt="ex_doc:settings",oi={tooltips:!0,theme:null,livebookUrl:null},He=class{constructor(){this._subscribers=[],this._settings=oi,this._loadSettings()}get(){return this._settings}update(t){let n=this._settings;this._settings={...this._settings,...t},this._subscribers.forEach(i=>i(this._settings,n)),this._storeSettings()}getAndSubscribe(t){this._subscribers.push(t),t(this._settings)}_loadSettings(){try{let t=localStorage.getItem(bt);if(t){let n=JSON.parse(t);this._settings={...this._settings,...n}}this._loadSettingsLegacy()}catch(t){console.error(`Failed to load settings: ${t}`)}}_storeSettings(){try{this._storeSettingsLegacy(),localStorage.setItem(bt,JSON.stringify(this._settings))}catch(t){console.error(`Failed to persist settings: ${t}`)}}_loadSettingsLegacy(){localStorage.getItem("tooltipsDisabled")!==null&&(this._settings={...this._settings,tooltips:!1}),localStorage.getItem("night-mode")==="true"&&(this._settings={...this._settings,nightMode:!0}),this._settings.nightMode===!0&&(this._settings={...this._settings,theme:"dark"})}_storeSettingsLegacy(){this._settings.tooltips?localStorage.removeItem("tooltipsDisabled"):localStorage.setItem("tooltipsDisabled","true"),this._settings.nightMode!==null?localStorage.setItem("night-mode",this._settings.nightMode===!0?"true":"false"):localStorage.removeItem("night-mode"),this._settings.theme!==null?(localStorage.setItem("night-mode",this._settings.theme==="dark"?"true":"false"),this._settings.nightMode=this._settings.theme==="dark"):(delete this._settings.nightMode,localStorage.removeItem("night-mode"))}},O=new He;var ai=".content",St=".content-inner",ci=".livebook-badge";function xt(e){e||di(),fi(),li(),ui()}function li(){c(ai).querySelectorAll("a").forEach(e=>{e.querySelector("code, img")&&e.classList.add("no-underline")})}function ui(){["warning","info","error","neutral","tip"].forEach(t=>{k(`blockquote h3.${t}, blockquote h4.${t}`).forEach(n=>{n.closest("blockquote").classList.add(t)})})}function di(){c(St).setAttribute("tabindex",-1),c(St).focus()}function fi(){let t=window.location.pathname.replace(/(\.html)?$/,".livemd"),n=new URL(t,window.location.href).toString();O.getAndSubscribe(i=>{let r=i.livebookUrl?hi(i.livebookUrl,n):pi(n);for(let s of k(ci))s.href=r})}function pi(e){return`https://livebook.dev/run?url=${encodeURIComponent(e)}`}function hi(e,t){return`${e}/import?url=${encodeURIComponent(t)}`}var Ot=ft(kt());var Pi=768,De=300,ne=".sidebar-toggle",Ri=".content",M={CLOSED:"closed",OPEN:"open",NO_PREF:"no_pref"},Q={opened:"sidebar-opened",openingStart:"sidebar-opening-start",opening:"sidebar-opening",closed:"sidebar-closed",closingStart:"sidebar-closing-start",closing:"sidebar-closing"},Ni=Object.values(Q),A={togglingTimeout:null,lastWindowWidth:window.innerWidth,sidebarPreference:M.NO_PREF};function It(){Ct(),Qi(),Hi()}function Qi(){let e=sessionStorage.getItem("sidebar_width");e&&_t(e),new ResizeObserver(n=>{for(let i of n)_t(i.contentRect.width)}).observe(document.getElementById("sidebar"))}function _t(e){sessionStorage.setItem("sidebar_width",e),document.body.style.setProperty("--sidebarWidth",`${e}px`)}function Ct(){sessionStorage.getItem("sidebar_state")==="closed"||At()?(q(Q.closed),c(ne).setAttribute("aria-expanded","false")):(q(Q.opened),c(ne).setAttribute("aria-expanded","true")),setTimeout(()=>c(ne).classList.add("sidebar-toggle--animated"),De)}function At(){return window.matchMedia(`screen and (max-width: ${Pi}px)`).matches}function q(...e){document.body.classList.remove(...Ni),document.body.classList.add(...e)}function Hi(){c(ne).addEventListener("click",e=>{Me(),Bi()}),c(Ri).addEventListener("click",e=>{Mi()}),window.addEventListener("resize",(0,Ot.default)(e=>{Di()},100))}function Me(){return Be()?Pt():Fi()}function Be(){return document.body.classList.contains(Q.opened)||document.body.classList.contains(Q.opening)}function Fi(){Rt(),sessionStorage.setItem("sidebar_state","opened"),c(ne).setAttribute("aria-expanded","true"),requestAnimationFrame(()=>{q(Q.openingStart),requestAnimationFrame(()=>(q(Q.opening),new Promise((e,t)=>{A.togglingTimeout=setTimeout(()=>{q(Q.opened),e()},De)})))})}function Pt(){Rt(),sessionStorage.setItem("sidebar_state","closed"),c(ne).setAttribute("aria-expanded","false"),requestAnimationFrame(()=>{q(Q.closingStart),requestAnimationFrame(()=>(q(Q.closing),new Promise((e,t)=>{A.togglingTimeout=setTimeout(()=>{q(Q.closed),e()},De)})))})}function Rt(){A.togglingTimeout&&(clearTimeout(A.togglingTimeout),A.togglingTimeout=null)}function Di(){A.lastWindowWidth!==window.innerWidth&&(A.lastWindowWidth=window.innerWidth,(A.sidebarPreference===M.OPEN||A.sidebarPreference===M.NO_PREF)&&Ct())}function Mi(){At()&&Be()&&Pt()}function Bi(){switch(A.sidebarPreference){case M.OPEN:A.sidebarPreference=M.CLOSED;break;case M.CLOSED:A.sidebarPreference=M.OPEN;break;case M.NO_PREF:Be()?A.sidebarPreference=M.OPEN:A.sidebarPreference=M.CLOSED}}function ce(){return window.sidebarNodes||{}}function Nt(){return window.versionNodes||[]}var ze={search:"search",extras:"extras",modules:"modules",tasks:"tasks"},$e=[ze.extras,ze.modules,ze.tasks],Se=e=>`#${e}-full-list`;function Qt(){$e.forEach(e=>{zi(ce(),e)}),be($()),Ft(),Ht(),Gi()}function zi(e,t){let n=e[t]||[],i=c(Se(t));if(!i)return;let r=Handlebars.templates["sidebar-items"]({nodes:n,group:""});i.innerHTML=r,i.querySelectorAll("ul").forEach(s=>{if(s.innerHTML.trim()===""){let o=s.previousElementSibling;o.classList.contains("expand")&&o.classList.remove("expand"),s.remove()}}),i.querySelectorAll("li a + button").forEach(s=>{s.addEventListener("click",o=>{let l=o.target.closest("li");qi(l)})}),i.querySelectorAll("li a").forEach(s=>{s.addEventListener("click",o=>{let l=o.target.closest("li"),u=i.querySelector(".current-section");u&&ji(u),s.matches(".expand")&&s.pathname===window.location.pathname&&qe(l)})})}function qe(e){e.classList.add("open"),e.querySelector("button[aria-controls]").setAttribute("aria-expanded","true")}function $i(e){e.classList.remove("open"),e.querySelector("button[aria-controls]").setAttribute("aria-expanded","false")}function qi(e){e.classList.contains("open")?$i(e):qe(e)}function Vi(e){e.classList.add("current-section"),e.querySelector("a").setAttribute("aria-current","true")}function ji(e){e.classList.remove("current-section"),e.querySelector("a").setAttribute("aria-current","false")}function Ui(e){e.classList.add("current-hash"),e.querySelector("a").setAttribute("aria-current","true")}function Wi(e){e.classList.remove("current-hash"),e.querySelector("a").setAttribute("aria-current","false")}function be(e){$e.forEach(t=>{let n=c(`#${t}-list-tab-button`);if(n){let i=c(`#${n.getAttribute("aria-controls")}`);t===e?(n.parentElement.classList.add("selected"),n.setAttribute("aria-selected","true"),n.setAttribute("tabindex","0"),i.removeAttribute("hidden")):(n.parentElement.classList.remove("selected"),n.setAttribute("aria-selected","false"),n.setAttribute("tabindex","-1"),i.setAttribute("hidden","hidden"))}})}function Ht(){let e=c(Se($()));if(!e)return;let t=e.querySelector("li.current-page");t&&(t.scrollIntoView(),e.scrollTop-=40)}function Ft(){let e=ee()||"content",n=ce()[$()]||[],i=ht(n,e),r=c(Se($()));if(!r)return;let s=r.querySelector(`li.current-page a.expand[href$="#${i}"]`);s&&qe(s.closest("li"));let o=r.querySelector(`li.current-page a[href$="#${e}"]`);if(o){let a=o.closest("ul");a.classList.contains("deflist")&&Vi(a.closest("li")),Ui(o.closest("li"))}}function Gi(){$e.forEach(t=>{let n=c(`#${t}-list-tab-button`);n&&n.addEventListener("click",i=>{be(t),Ht()})});let e=c("#sidebar-listNav");e.addEventListener("keydown",t=>{if(t.key!=="ArrowRight"&&t.key!=="ArrowLeft")return;let n=Array.from(e.querySelectorAll('[role="tab"]')).map(r=>r.dataset.type),i=e.querySelector('[role="tab"][aria-selected="true"]').dataset.type;if(t.key==="ArrowRight"){let r=n.indexOf(i)+1;r>=n.length&&(r=0);let s=n[r];be(s),c(`#${s}-list-tab-button`).focus()}else if(t.key==="ArrowLeft"){let r=n.indexOf(i)-1;r<0&&(r=n.length-1);let s=n[r];be(s),c(`#${s}-list-tab-button`).focus()}}),window.addEventListener("hashchange",t=>{let n=c(Se($()));if(!n)return;let i=n.querySelector("li.current-page li.current-hash");i&&Wi(i),Ft()})}var B={module:"module",moduleChild:"module-child",mixTask:"mix-task",extra:"extra",section:"section"};function Mt(e,t=8){if(te(e))return[];let n=ce(),i=[...Ve(n.modules,e,B.module,"module"),...Ki(n.modules,e,B.moduleChild),...Ve(n.tasks,e,B.mixTask,"mix task"),...Ve(n.extras,e,B.extra,"page"),...je(n.modules,e,B.section,"module"),...je(n.tasks,e,B.section,"mix task"),...je(n.extras,e,B.section,"page")].filter(r=>r!==null);return nr(i).slice(0,t)}function Ve(e,t,n,i){return e.map(r=>Ji(r,t,n,i))}function Ki(e,t,n){return e.filter(i=>i.nodeGroups).flatMap(i=>i.nodeGroups.flatMap(({key:r,nodes:s})=>{let o=tr(r);return s.map(a=>Xi(a,i.id,t,n,o)||er(a,i.id,t,n,o))}))}function je(e,t,n,i){return e.flatMap(r=>Yi(r).map(s=>Zi(r,s,t,n,i)))}function Yi(e){return(e.sections||[]).concat(e.headers||[])}function Ji(e,t,n,i){return Ee(e.title,t)?{link:`${e.id}.html`,title:we(e.title,t),description:null,matchQuality:Le(e.title,t),deprecated:e.deprecated,labels:[i],category:n}:null}function Xi(e,t,n,i,r){return Ee(e.id,n)?{link:`${t}.html#${e.anchor}`,title:we(e.id,n),labels:[r],description:t,matchQuality:Le(e.id,n),deprecated:e.deprecated,category:i}:null}function Zi(e,t,n,i,r){return Bt(t.id,n)?{link:`${e.id}.html#${t.anchor}`,title:we(t.id,n),description:e.title,matchQuality:Le(t.id,n),labels:[r,"section"],category:i}:null}function er(e,t,n,i,r){let s=`${t}.${e.id}`,o=`${t}:${e.id}`,a,l;if(Ee(s,n))a=s,l=/\./g;else if(Ee(o,n))a=o,l=/:/g;else return null;let u=n.replace(l," ");return Bt(e.id,u)?{link:`${t}.html#${e.anchor}`,title:we(e.id,u),label:r,description:t,matchQuality:Le(a,n),deprecated:e.deprecated,category:i}:null}function tr(e){switch(e){case"callbacks":return"callback";case"types":return"type";default:return"function"}}function nr(e){return e.slice().sort((t,n)=>t.matchQuality!==n.matchQuality?n.matchQuality-t.matchQuality:Dt(t.category)-Dt(n.category))}function Dt(e){switch(e){case B.module:return 1;case B.moduleChild:return 2;case B.mixTask:return 3;default:return 4}}function Bt(e,t){return Te(t).some(i=>zt(e,i))}function Ee(e,t){return Te(t).every(i=>zt(e,i))}function zt(e,t){return e.toLowerCase().includes(t.toLowerCase())}function Le(e,t){let n=Te(t),r=n.map(o=>o.length).reduce((o,a)=>o+a,0)/e.length,s=ir(e,n[0])?1:0;return r+s}function ir(e,t){return e.toLowerCase().startsWith(t.toLowerCase())}function Te(e){return e.trim().split(/\s+/)}function we(e,t){let n=Te(t).sort((i,r)=>r.length-i.length);return xe(e,n)}function xe(e,t){if(t.length===0)return e;let[n,...i]=t,r=e.match(new RegExp(`(.*)(${pt(n)})(.*)`,"i"));if(r){let[,s,o,a]=r;return xe(s,t)+""+he(o)+""+xe(a,t)}else return xe(e,i)}var ke=null,G=null;function $t(){G=document.getElementById("toast"),G.addEventListener("click",e=>{clearTimeout(ke),e.target.classList.remove("show")})}function Ue(e){G&&(clearTimeout(ke),G.innerText=e,G.classList.add("show"),ke=setTimeout(()=>{G.classList.remove("show"),ke=setTimeout(function(){G.innerText=""},1e3)},5e3))}var qt="dark",We=["system","dark","light"];function Vt(e){O.getAndSubscribe(t=>{document.body.classList.toggle(qt,Ut(e||t.theme))}),sr()}function jt(){let e=We[We.indexOf(Ge())+1]||We[0];O.update({theme:e}),Ue(`Set theme to "${e}"`)}function Ge(){return O.get().theme||"system"}function Ut(e){return e==="dark"||rr()&&(e==null||e==="system")}function rr(){return window.matchMedia("(prefers-color-scheme: dark)").matches}function sr(){window.matchMedia("(prefers-color-scheme: dark)").addListener(e=>{let t=O.get().theme,n=Ut(t);(t==null||t==="system")&&(document.body.classList.toggle(qt,n),Ue(`Browser changed theme to "${n?"dark":"light"}"`))})}var ie=".autocomplete",Oe=".autocomplete-suggestions",_e=".autocomplete-suggestion",I={autocompleteSuggestions:[],previewOpen:!1,selectedIdx:-1};function or(){c(ie).classList.add("shown")}function Ke(){c(ie).classList.remove("shown")}function Wt(){return c(ie).classList.contains("shown")}function Ye(e){I.autocompleteSuggestions=Mt(e),I.selectedIdx=-1,te(e)?Ke():(ar({term:e,suggestions:I.autocompleteSuggestions}),Ie(0),or())}function ar({term:e,suggestions:t}){let n=Handlebars.templates["autocomplete-suggestions"]({suggestions:t,term:e}),i=c(ie);i.innerHTML=n}function Gt(){return I.selectedIdx===-1?null:I.autocompleteSuggestions[I.selectedIdx]}function Ie(e){Yt(cr(e))}function Kt(e){if(e.data.type==="preview"){let{contentHeight:t}=e.data,n=c(".autocomplete-preview");n&&(n.style.height=`${t+32}px`,n.classList.remove("loading"))}}function Yt(e){I.selectedIdx=e;let t=c(Oe),n=c(`${_e}.selected`),i=c(`${_e}[data-index="${I.selectedIdx}"]`);if(n&&n.classList.remove("selected"),i){if(I.previewOpen){Xt(),window.addEventListener("message",Kt),t.classList.add("previewing");let r=document.createElement("div");r.classList.add("autocomplete-preview"),r.classList.add("loading");let s=i.href.replace(".html",`.html?preview=true&theme=${Ge()}`),o=document.createElement("iframe");o.setAttribute("src",s),r.appendChild(document.createElement("div")),r.appendChild(document.createElement("span")),r.appendChild(o),i.parentNode.insertBefore(r,i.nextSibling)}i.classList.add("selected"),i.scrollIntoView({block:"nearest"})}else t&&(t.scrollTop=0)}function Jt(){I.previewOpen?Ce():Je()}function Ce(){I.previewOpen=!1;let e=c(Oe);e&&e.classList.remove("previewing"),Xt()}function Je(e){I.previewOpen=!0,e?e=e.closest(_e):e=c(`${_e}[data-index="${I.selectedIdx}"]`),e&&Yt(parseInt(e.dataset.index))}function Xt(){let e=c(".autocomplete-preview");e&&(e.remove(),window.removeEventListener("message",Kt))}function cr(e){let t=I.autocompleteSuggestions.length+1;return(I.selectedIdx+e+1+t)%t-1}var le="form.search-bar input",lr="form.search-bar .search-close-button";function nn(){ur(),window.onTogglePreviewClick=function(e,t){e.preventDefault(),e.stopImmediatePropagation(),Xe(),t?Je(e.target):Ce()}}function rn(e){let t=c(le);t.value=e}function Xe(){let e=c(le);document.body.classList.add("search-focused"),e.focus()}function ur(){let e=c(le);if(document.querySelector('meta[name="exdoc:autocomplete"][content="off"]'))return e.addEventListener("keydown",t=>{t.key==="Enter"&&Zt(t)}),!0;e.addEventListener("keydown",t=>{let n=ye();t.key==="Escape"?(Ae(),e.blur()):t.key==="Enter"?Zt(t):t.key==="ArrowUp"||n&&t.ctrlKey&&t.key==="p"?(Ie(-1),t.preventDefault()):t.key==="ArrowDown"||n&&t.ctrlKey&&t.key==="n"?(Ie(1),t.preventDefault()):t.key==="Tab"&&(Jt(),t.preventDefault())}),e.addEventListener("input",t=>{Ye(t.target.value)}),e.addEventListener("focus",t=>{document.body.classList.contains("search-focused")||(document.body.classList.add("search-focused"),Ye(t.target.value))}),e.addEventListener("blur",t=>{let n=t.relatedTarget,i=c(Oe);if(n&&i&&i.contains(n))return setTimeout(()=>{Wt()&&e.focus()},1e3),null;Pe()}),c(ie).addEventListener("click",t=>{t.shiftKey||t.ctrlKey?e.focus():(Ae(),Pe())}),c(lr).addEventListener("click",t=>{Ae(),Pe()})}function Zt(e){let t=c(le),n=e.shiftKey||e.ctrlKey,i=Gt();e.preventDefault();let r=n?"_blank":"_self",s=document.createElement("a");if(s.setAttribute("target",r),i)s.setAttribute("href",i.link);else{let o=document.querySelector('meta[name="exdoc:full-text-search-url"]'),a=o?o.getAttribute("content"):"search.html?q=";s.setAttribute("href",`${a}${encodeURIComponent(t.value)}`)}s.click(),n||(Ae(),Pe())}function Ae(){let e=c(le);e.value=""}function Pe(){Ce(),document.body.classList.remove("search-focused"),Ke()}var en=window.scrollY,tn=70;window.addEventListener("scroll",function(){let e=window.scrollY;e>tn*2&&document.body.classList.add("scroll-sticky"),e===0&&document.body.classList.remove("scroll-sticky"),e>en&&e>tn?document.body.classList.remove("scroll-sticky"):document.body.classList.add("scroll-sticky"),en=e<=0?0:e},!1);var sn=".sidebar-projectVersion",dr=".sidebar-projectVersionsDropdown";function on(){let e=Nt();if(e.length>0){let n=c(sn).textContent.trim(),i=pr(e,n);fr({nodes:i})}}function fr({nodes:e}){let t=c(sn),n=Handlebars.templates["versions-dropdown"]({nodes:e});t.innerHTML=n,c(dr).addEventListener("change",mr)}function pr(e,t){return hr(e,t).map(i=>({...i,isCurrentVersion:i.version===t}))}function hr(e,t){return e.some(i=>i.version===t)?e:[{version:t,url:"#"},...e]}function mr(e){let t=e.target.value,n=window.location.pathname.split("/").pop()+window.location.hash,i=`${t}/${n}`;gt(i).then(r=>{r?window.location.href=i:window.location.href=t})}var H=ft(ln());var Re=80,gr="#search";function dn(){if(window.location.pathname.endsWith("/search.html")){let e=mt("q");yr(e)}}async function yr(e){if(te(e))Ze({value:e});else{rn(e);let t=await vr();try{let n=e.replaceAll(/(\B|\\):/g,"\\:"),i=Or(t.search(n));Ze({value:e,results:i})}catch(n){Ze({value:e,errorMessage:n.message})}}}function Ze({value:e,results:t,errorMessage:n}){let i=c(gr),r=Handlebars.templates["search-results"]({value:e,results:t,errorMessage:n});i.innerHTML=r}async function vr(){H.default.tokenizer.separator=/\s+/,H.default.QueryLexer.termSeparator=/\s+/,H.default.Pipeline.registerFunction(pn,"docTokenSplitter"),H.default.Pipeline.registerFunction(hn,"docTrimmer");let e=await br();if(e)return e;let t=wr();return Sr(t),t}async function br(){try{let e=sessionStorage.getItem(fn());if(e){let t=await Er(e);return H.default.Index.load(t)}else return null}catch(e){return console.error("Failed to load index: ",e),null}}async function Sr(e){try{let t=await xr(e);sessionStorage.setItem(fn(),t)}catch(t){console.error("Failed to save index: ",t)}}async function xr(e){let t=new Blob([JSON.stringify(e)],{type:"application/json"}).stream().pipeThrough(new window.CompressionStream("gzip")),i=await(await new Response(t).blob()).arrayBuffer();return Lr(i)}async function Er(e){let t=new Blob([Tr(e)],{type:"application/json"}).stream().pipeThrough(new window.DecompressionStream("gzip")),n=await new Response(t).text();return JSON.parse(n)}function Lr(e){let t="",n=new Uint8Array(e),i=n.byteLength;for(let r=0;r{this.add(e)})})}function kr(e){e.pipeline.before(H.default.stemmer,pn)}function pn(e){let t=e.toString().split(/\:|\.|\/|_|-/).map(n=>e.clone().update(()=>n));return t.length>1?[...t,e]:t}function _r(e){e.pipeline.before(H.default.stemmer,hn)}function hn(e){return e.update(function(t){return t.replace(/^[^@:\w]+/,"").replace(/[^\?\!\w]+$/,"")})}function Or(e){return e.filter(t=>un(t.ref)).map(t=>{let n=un(t.ref),i=t.matchData.metadata;return{...n,metadata:i,excerpts:Ir(n,i)}})}function un(e){return searchData.items.find(t=>t.ref===e)||null}function Ir(e,t){let{doc:n}=e,r=Object.keys(t).filter(s=>"doc"in t[s]).map(s=>t[s].doc.position.map(([o,a])=>Cr(n,o,a))).reduce((s,o)=>s.concat(o),[]);return r.length===0?[n.slice(0,Re*2)+(Re*20?"...":"",e.slice(i,t),""+he(e.slice(t,t+n))+"",e.slice(t+n,r),r{let n=t.getAttribute("data-group-id");t.addEventListener("mouseenter",i=>{mn(n,!0)}),t.addEventListener("mouseleave",i=>{mn(n,!1)})})}function mn(e,t){k(`[data-group-id="${e}"]`).forEach(i=>{i.classList.toggle(Ar,t)})}var K=".modal",Rr=".modal .modal-close",Nr=".modal .modal-title",Qr=".modal .modal-body",yn='button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])',z={prevFocus:null,lastFocus:null,ignoreFocusChanges:!1};function vn(){Hr()}function Hr(){let e=Handlebars.templates["modal-layout"]();document.body.insertAdjacentHTML("beforeend",e),c(K).addEventListener("keydown",t=>{t.key==="Escape"&&re()}),c(Rr).addEventListener("click",t=>{re()}),c(K).addEventListener("click",t=>{t.target.classList.contains("modal")&&re()})}function bn(e){if(z.ignoreFocusChanges)return;let t=c(K);if(t.contains(e.target))z.lastFocus=e.target;else{z.ignoreFocusChanges=!0;let n=Fr(t);z.lastFocus===n?Dr(t).focus():n.focus(),z.ignoreFocusChanges=!1,z.lastFocus=document.activeElement}}function Fr(e){return e.querySelector(yn)}function Dr(e){let t=e.querySelectorAll(yn);return t[t.length-1]}function Ne({title:e,body:t}){z.prevFocus=document.activeElement,document.addEventListener("focus",bn,!0),c(Nr).innerHTML=e,c(Qr).innerHTML=t,c(K).classList.add("shown"),c(K).focus()}function re(){c(K).classList.remove("shown"),document.addEventListener("focus",bn,!0),z.prevFocus&&z.prevFocus.focus(),z.prevFocus=null}function Sn(){return c(K).classList.contains("shown")}var Mr="https://hexdocs.pm/%%",Br="https://hex.pm/api/packages?search=name:%%*",zr=".display-quick-switch",et="#quick-switch-input",En="#quick-switch-results",$r=".quick-switch-result",qr=300,Vr=9,jr=["elixir","eex","ex_unit","hex","iex","logger","mix"].map(e=>({name:e})),Ln=2,P={autocompleteResults:[],selectedIdx:null};function Tn(){Ur()}function Ur(){k(zr).forEach(e=>{e.addEventListener("click",t=>{nt()})})}function Wr(e){if(e.key==="Enter"){let t=e.target.value;Kr(t),e.preventDefault()}else e.key==="ArrowUp"?(xn(-1),e.preventDefault()):e.key==="ArrowDown"&&(xn(1),e.preventDefault())}function Gr(e){let t=e.target.value;if(t.lengthn.json()).then(n=>{Array.isArray(n)&&(P.autocompleteResults=Zr(e,n),P.selectedIdx=null,c(et).value.length>=Ln&&Xr({results:P.autocompleteResults}))})}function Xr({results:e}){let t=c(En),n=Handlebars.templates["quick-switch-results"]({results:e});t.innerHTML=n,k($r).forEach(i=>{i.addEventListener("click",r=>{let s=i.getAttribute("data-index"),o=P.autocompleteResults[s];tt(o.name)})})}function Zr(e,t){return jr.concat(t).filter(n=>n.name.toLowerCase().includes(e.toLowerCase())).filter(n=>n.releases===void 0||n.releases[0].has_docs===!0).slice(0,Vr)}function xn(e){P.selectedIdx=es(e);let t=c(".quick-switch-result.selected"),n=c(`.quick-switch-result[data-index="${P.selectedIdx}"]`);t&&t.classList.remove("selected"),n&&n.classList.add("selected")}function es(e){let t=P.autocompleteResults.length;if(P.selectedIdx===null){if(e>=0)return 0;if(e<0)return t-1}return(P.selectedIdx+e+t)%t}var ts=".display-settings",ns="#settings-modal-content",it="#modal-settings-tab",rt="#modal-keyboard-shortcuts-tab",kn="#settings-content",_n="#keyboard-shortcuts-content",is=[{title:"Settings",id:"modal-settings-tab"},{title:"Keyboard shortcuts",id:"modal-keyboard-shortcuts-tab"}];function On(){rs()}function rs(){k(ts).forEach(e=>{e.addEventListener("click",t=>{st()})})}function wn(){c(rt).classList.remove("active"),c(it).classList.add("active"),c(kn).classList.remove("hidden"),c(_n).classList.add("hidden")}function ss(){c(rt).classList.add("active"),c(it).classList.remove("active"),c(_n).classList.remove("hidden"),c(kn).classList.add("hidden")}function st(){Ne({title:is.map(({id:s,title:o})=>``).join(""),body:Handlebars.templates["settings-modal-body"]({shortcuts:ot})});let e=c(ns),t=e.querySelector('[name="theme"]'),n=e.querySelector('[name="tooltips"]'),i=e.querySelector('[name="direct_livebook_url"]'),r=e.querySelector('[name="livebook_url"]');O.getAndSubscribe(s=>{t.value=s.theme||"system",n.checked=s.tooltips,s.livebookUrl===null?(i.checked=!1,r.classList.add("hidden"),r.tabIndex=-1):(i.checked=!0,r.classList.remove("hidden"),r.tabIndex=0,r.value=s.livebookUrl)}),t.addEventListener("change",s=>{O.update({theme:s.target.value})}),n.addEventListener("change",s=>{O.update({tooltips:s.target.checked})}),i.addEventListener("change",s=>{let o=s.target.checked?r.value:null;O.update({livebookUrl:o})}),r.addEventListener("input",s=>{O.update({livebookUrl:s.target.value})}),c(it).addEventListener("click",s=>{wn()}),c(rt).addEventListener("click",s=>{ss()}),wn()}var os="#settings-modal-content",ot=[{key:"c",description:"Toggle sidebar",action:Me},{key:"n",description:"Cycle themes",action:jt},{key:"s",description:"Focus search bar",displayAs:"/ or s",action:at},{key:"/",action:at},{key:"k",hasModifier:!0,action:at},{key:"g",description:"Search HexDocs package",displayAs:"g",action:nt},{key:"?",displayAs:"?",description:"Bring up this modal",action:us}],ct={shortcutBeingPressed:null};function In(){as()}function as(){document.addEventListener("keydown",cs),document.addEventListener("keyup",ls)}function cs(e){if(ct.shortcutBeingPressed||e.target.matches("input, textarea"))return;let t=ot.find(n=>n.hasModifier?ye()&&e.metaKey||e.ctrlKey?n.key===e.key:!1:e.ctrlKey||e.metaKey||e.altKey?!1:n.key===e.key);t&&(ct.shortcutBeingPressed=t,e.preventDefault(),t.action(e))}function ls(e){ct.shortcutBeingPressed=null}function at(e){re(),Xe()}function us(){ds()?re():st()}function ds(){return Sn()&&c(os)}var Y={plain:"plain",function:"function",module:"module"},fs=[{href:"typespecs.html#basic-types",hint:{kind:Y.plain,description:"Basic type"}},{href:"typespecs.html#literals",hint:{kind:Y.plain,description:"Literal"}},{href:"typespecs.html#built-in-types",hint:{kind:Y.plain,description:"Built-in type"}}],Qe={cancelHintFetching:null};function Cn(e){if(Pn(e))return!0;let t=/#.*\//;return e.includes("#")&&!t.test(e)?!1:e.includes(".html")}function An(e){let t=Pn(e);return t?Promise.resolve(t):ps(e)}function Pn(e){let t=fs.find(n=>e.includes(n.href));return t?t.hint:null}function ps(e){let t=e.replace(".html",".html?hint=true");return new Promise((n,i)=>{let r=document.createElement("iframe");r.setAttribute("src",t),r.style.display="none";function s(a){let{href:l,hint:u}=a.data;t===l&&(o(),n(u))}Qe.cancelHintFetching=()=>{o(),i(new Error("cancelled"))};function o(){r.remove(),window.removeEventListener("message",s),Qe.cancelHintFetching=null}window.addEventListener("message",s),document.body.appendChild(r)})}function Rn(){Qe.cancelHintFetching&&Qe.cancelHintFetching()}function Nn(e){let n=e.querySelector("h1").textContent,i=e.querySelector(".docstring > p"),r=i?i.innerHTML:"";return{kind:Y.function,title:n.trim(),description:r.trim()}}function Qn(e){let n=e.querySelector("h1 > span").textContent,i=e.querySelector("#moduledoc p"),r=i?i.innerHTML:"";return{kind:Y.module,title:n.trim(),description:r.trim()}}var hs=".content a",lt=".tooltip",ms=".tooltip .tooltip-body",Fn="body .content-inner",gs="#content",Dn="tooltip-shown",ue=10,ys=ue*4,Hn={height:450,width:768},vs=100,se={currentLinkElement:null,hoverDelayTimeout:null};function Mn(){bs(),Ss()}function bs(){let e=Handlebars.templates["tooltip-layout"]();c(Fn).insertAdjacentHTML("beforeend",e)}function Ss(){k(hs).forEach(e=>{xs(e)&&(e.addEventListener("mouseenter",t=>{Ls(e)}),e.addEventListener("mouseleave",t=>{_s(e)}))})}function xs(e){return!(e.getAttribute("data-no-tooltip")!==null||Es(e.href)||!Cn(e.href))}function Es(e){let t=e.replace(gs,"");return window.location.href.split("#")[0]===t}function Ls(e){Ts()&&(se.currentLinkElement=e,se.hoverDelayTimeout=setTimeout(()=>{An(e.href).then(t=>{ws(t),ks()}).catch(()=>{})},vs))}function Ts(){let e=window.innerWidthe.firstElementChild&&e.firstElementChild.tagName==="CODE").forEach(e=>e.insertAdjacentHTML("beforeend",Hs)),Array.from(k(".copy-button")).forEach(e=>{let t;e.addEventListener("click",()=>{let n=e.querySelector("[aria-live]");t&&clearTimeout(t);let i=Array.from(e.parentElement.querySelector("code").childNodes).filter(r=>!(r.tagName==="SPAN"&&r.classList.contains("unselectable"))).map(r=>r.textContent).join("");navigator.clipboard.writeText(i),e.classList.add("clicked"),n.innerHTML="Copied! ✓",t=setTimeout(()=>{e.classList.remove("clicked"),n.innerHTML=""},3e3)})})}function Vn(){let t=/(Macintosh|iPhone|iPad|iPod)/.test(window.navigator.userAgent)?"apple-os":"non-apple-os";document.documentElement.classList.add(t)}var Ds="content",Ms="tabs-open",Bs="tabs-close",zs="H3",$s="tabset";function Un(){qs().map(Vs).forEach(n=>Ws(n))}function qs(){let e=document.createNodeIterator(document.getElementById(Ds),NodeFilter.SHOW_COMMENT,{acceptNode(i){return i.nodeValue.trim()===Ms?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),t=[],n;for(;n=e.nextNode();)t.push(n);return t}function Vs(e,t,n){let i=[],r=[],s={label:"",content:[]};for(;e=e.nextSibling;){if(js(e)){jn(s,r,t);break}i.push(e),e.nodeName===zs?(jn(s,r,t),s.label=e.innerText,s.content=[]):s.content.push(e.outerHTML)}let o=document.createElement("div");return o.className=$s,Us(i,o),o.innerHTML=Handlebars.templates.tabset({tabs:r}),o}function js(e){return e.nodeName==="#comment"&&e.nodeValue.trim()===Bs}function jn(e,t,n){if(e.label===""&&!e.content.length)return!1;let i=e.label,r=e.content;t.push({label:i,content:r,setIndex:n})}function Us(e,t){if(!e||!e.length)return!1;e[0].parentNode.insertBefore(t,e[0]),e.forEach(n=>t.appendChild(n))}function Ws(e){let t={tabs:e.querySelectorAll(':scope [role="tab"]'),panels:e.querySelectorAll(':scope [role="tabpanel"]'),activeIndex:0};t.tabs.forEach((n,i)=>{n.addEventListener("click",r=>{J(i,t)}),n.addEventListener("keydown",r=>{let s=t.tabs.length-1;r.code==="ArrowLeft"?(r.preventDefault(),t.activeIndex===0?J(s,t):J(t.activeIndex-1,t)):r.code==="ArrowRight"?(r.preventDefault(),t.activeIndex===s?J(0,t):J(t.activeIndex+1,t)):r.code==="Home"?(r.preventDefault(),J(0,t)):r.code==="End"&&(r.preventDefault(),J(s,t))})})}function J(e,t){t.tabs[t.activeIndex].setAttribute("aria-selected","false"),t.tabs[t.activeIndex].tabIndex=-1,t.tabs[e].setAttribute("aria-selected","true"),t.tabs[e].tabIndex=0,t.tabs[e].focus(),t.panels[t.activeIndex].setAttribute("hidden",""),t.panels[t.activeIndex].tabIndex=-1,t.panels[e].removeAttribute("hidden"),t.panels[e].tabIndex=0,t.activeIndex=e}function Gn(){let e=me(ee(),!0);e&&Gs(e)}function Gs(e){Js(e),Ks(),Ys(),Wn(),window.addEventListener("resize",t=>{Wn()})}function Wn(){let e=document.body.scrollHeight,t=document.getElementById("content").parentElement.offsetHeight,n={type:"preview",maxHeight:e,contentHeight:t};window.parent.postMessage(n,"*")}function Ks(){let e=document.getElementsByTagName("a");for(let t of e)t.getAttribute("target")!=="_blank"&&t.setAttribute("target","_parent")}function Ys(){window.scrollTo(0,0)}function Js(e){document.body.classList.add("preview");let t=document.getElementById("content");t.innerHTML=e.innerHTML}yt(()=>{let e=new URLSearchParams(window.location.search),t=e.has("preview");Vt(e.get("theme")),xt(t),gn(),Mn(),$n(),qn(),Vn(),Un(),t?Gn():(on(),It(),Qt(),nn(),vn(),In(),Tn(),$t(),dn(),On())});})(); -/*! Bundled license information: - -lunr/lunr.js: - (** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - *) - (*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - *) - (*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - *) -*/ diff --git a/doc/dist/html-erlang-EBZIIHAS.css b/doc/dist/html-erlang-EBZIIHAS.css deleted file mode 100644 index e51da55..0000000 --- a/doc/dist/html-erlang-EBZIIHAS.css +++ /dev/null @@ -1,6 +0,0 @@ -:root{--main: hsl(0, 100%, 44%);--mainDark: hsl(0, 100%, 34%);--mainDarkest: hsl(0, 100%, 24%);--mainLight: hsl(0, 100%, 64%);--mainLightest: hsl(0, 100%, 74%);--searchBarFocusColor: hsl(0, 100%, 50%);--searchBarBorderColor: rgb(255, 71, 71, .1);--linksNoUnderline: #0969da;--linksNoUnderlineVisited: #085fc4}body.dark{--linksNoUnderline: #71b7ff;--linksNoUnderlineVisited: #65a4e5}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:300;src:url(./lato-latin-ext-300-normal-VPGGJKJL.woff2) format("woff2"),url(./lato-all-300-normal-GIV56FBX.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:300;src:url(./lato-latin-300-normal-YUMVEFOL.woff2) format("woff2"),url(./lato-all-300-normal-GIV56FBX.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:400;src:url(./lato-latin-ext-400-normal-N27NCBWW.woff2) format("woff2"),url(./lato-all-400-normal-MNITWADU.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:400;src:url(./lato-latin-400-normal-W7754I4D.woff2) format("woff2"),url(./lato-all-400-normal-MNITWADU.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:700;src:url(./lato-latin-ext-700-normal-Q2L5DVMW.woff2) format("woff2"),url(./lato-all-700-normal-XMT5XFBS.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lato;font-style:normal;font-display:swap;font-weight:700;src:url(./lato-latin-700-normal-2XVSBPG4.woff2) format("woff2"),url(./lato-all-700-normal-XMT5XFBS.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(./inconsolata-vietnamese-400-normal-IGQPHHJH.woff2) format("woff2"),url(./inconsolata-all-400-normal-HMVRHNDU.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(./inconsolata-latin-ext-400-normal-K7HVGTP7.woff2) format("woff2"),url(./inconsolata-all-400-normal-HMVRHNDU.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(./inconsolata-latin-400-normal-RGKDDNDD.woff2) format("woff2"),url(./inconsolata-all-400-normal-HMVRHNDU.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(./inconsolata-vietnamese-700-normal-LHEGSN35.woff2) format("woff2"),url(./inconsolata-all-700-normal-WFUKXZPS.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(./inconsolata-latin-ext-700-normal-4MPBLFZC.woff2) format("woff2"),url(./inconsolata-all-700-normal-WFUKXZPS.woff) format("woff");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(./inconsolata-latin-700-normal-DTS2D7TO.woff2) format("woff2"),url(./inconsolata-all-700-normal-WFUKXZPS.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--content-width: 949px;--content-gutter: 60px;--borderRadius: 4px;--navTabBorderWidth: 4px;--defaultFontFamily: -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";--sansFontFamily: "Lato", sans-serif;--monoFontFamily: "Inconsolata", Menlo, Courier, monospace;--baseFontSize: 18px;--baseLineHeight: 1.5em;--gray25: hsl(207, 43%, 98%);--gray50: hsl(207, 43%, 96%);--gray100: hsl(212, 33%, 91%);--gray200: hsl(210, 29%, 88%);--gray300: hsl(210, 26%, 84%);--gray400: hsl(210, 21%, 64%);--gray450: hsl(210, 21%, 49%);--gray500: hsl(210, 21%, 34%);--gray600: hsl(210, 27%, 26%);--gray700: hsl(212, 35%, 17%);--gray750: hsl(214, 46%, 14%);--gray800: hsl(216, 52%, 11%);--gray800-opacity-0: hsla(216, 52%, 11%, 0%);--gray850: hsl(216, 63%, 8%);--gray900: hsl(218, 73%, 4%);--gray900-opacity-50: hsla(218, 73%, 4%, 50%);--gray900-opacity-0: hsla(218, 73%, 4%, 0%);--coldGrayFaint: hsl(240, 5%, 97%);--coldGrayLight: hsl(240, 5%, 88%);--coldGray-lightened-10: hsl(240, 5%, 56%);--coldGray: hsl(240, 5%, 46%);--coldGray-opacity-10: hsla(240, 5%, 46%, 10%);--coldGrayDark: hsl(240, 5%, 28%);--coldGrayDim: hsl(240, 5%, 18%);--yellowLight: hsl(60, 100%, 81%);--yellowDark: hsl(60, 100%, 43%, 62%);--yellow: hsl(60, 100%, 43%);--green-lightened-10: hsl(90, 100%, 45%);--green: hsl(90, 100%, 35%);--white: hsl(0, 0%, 100%);--white-opacity-50: hsla(0, 0%, 100%, 50%);--white-opacity-10: hsla(0, 0%, 100%, 10%);--white-opacity-0: hsla(0, 0%, 100%, 0%);--black: hsl(0, 0%, 0%);--black-opacity-10: hsla(0, 0%, 0%, 10%);--black-opacity-50: hsla(0, 0%, 0%, 50%)}@media screen and (max-width: 768px){:root{--content-width: 100%;--content-gutter: 20px}}:root{--background: var(--white);--contrast: var(--black);--textBody: var(--gray800);--textHeaders: var(--gray900);--textDetailAccent: var(--mainLight);--textDetailBackground: var(--coldGrayFaint);--textFooter: var(--gray700);--links: var(--black);--linksVisited: var(--black);--linksDecoration: var(--gray450);--iconAction: var(--coldGray);--iconActionHover: var(--gray800);--blockquoteBackground: var(--coldGrayFaint);--blockquoteBorder: var(--coldGrayLight);--tableHeadBorder: var(--gray100);--tableBodyBorder: var(--gray50);--warningBackground: hsl( 33, 100%, 97%);--warningHeadingBackground: hsl( 33, 87%, 64%);--warningHeading: var(--black);--errorBackground: hsl( 7, 81%, 96%);--errorHeadingBackground: hsl( 6, 80%, 60%);--errorHeading: var(--white);--infoBackground: hsl(206, 91%, 96%);--infoHeadingBackground: hsl(213, 92%, 62%);--infoHeading: var(--white);--neutralBackground: hsl(212, 29%, 92%);--neutralHeadingBackground: hsl(220, 43%, 11%);--neutralHeading: var(--white);--tipBackground: hsl(142, 31%, 93%);--tipHeadingBackground: hsl(134, 39%, 36%);--tipHeading: var(--white);--fnSpecAttr: var(--coldGray);--fnDeprecated: var(--yellowLight);--blink: var(--yellowLight);--codeBackground: var(--gray25);--codeBorder: var(--gray100);--codeScrollThumb: var(--gray400);--codeScrollBackground: var(--codeBorder);--admCodeBackground: var(--gray25);--admCodeBorder: var(--gray100);--admCodeColor: var(--black);--admInlineCodeColor: var(--black);--admInlineCodeBackground: var(--gray25);--admInlineCodeBorder: var(--gray100);--tabBackground: var(--white);--tabBorder: var(--gray300);--tabBorderTop: var(--gray100);--tab: var(--gray600);--tabShadow: var(--gray25);--bottomActionsBtnBorder: var(--black-opacity-10);--bottomActionsBtnSubheader: var(--mainDark);--modalBackground: var(--white);--settingsInput: var(--gray500);--settingsInputBackground: var(--white);--settingsInputBorder: var(--gray300);--settingsSectionBorder: var(--gray300);--quickSwitchInput: var(--gray500);--quickSwitchContour: var(--coldGray);--success: var(--green);--sidebarButtonBackground: linear-gradient(180deg, var(--white) 20%, var(--white-opacity-50) 70%, var(--white-opacity-0) 100%);--sidebarAccentMain: var(--gray50);--sidebarBackground: var(--gray800);--sidebarHeader: var(--gray700);--sidebarMuted: var(--gray300);--sidebarHover: var(--white);--sidebarScrollbarThumb: var(--coldGray);--sidebarScrollbarTrack: var(--sidebarBackground);--sidebarSubheadings: var(--gray400);--sidebarItem: var(--gray200);--sidebarInactiveItemMarker: var(--gray600);--sidebarLanguageAccentBar: var(--mainLight);--sidebarActiveItem: var(--mainLightest);--searchBarBorder: var(--gray200);--searchAccentMain: var(--gray-400);--searchLanguageAccentBar: var(--main);--searchSearch: var(--white);--autocompleteBorder: rgba(3, 9, 19, .1);--autocompletePreview: var(--gray25);--autocompleteHover: var(--grey50, #F0F5F9);--autocompleteBackground: var(--white);--suggestionBorder: var(--gray200);--autocompleteResults: var(--gray600);--autocompleteResultsBold: var(--gray800);--autocompleteSrollbarThumb: var(--gray200);--autocompleteSrollbarTrack: var(--gray50);--autocompleteLabelBack: var(--gray100);--autocompleteLabelFont: var(--gray600)}body.dark{--background: var(--gray900);--contrast: var(--white);--textBody: var(--gray200);--textHeaders: var(--gray100);--textDetailAccent: var(--mainLight);--textDetailBackground: var(--gray700);--textFooter: var(--gray300);--links: var(--gray100);--linksVisited: var(--gray100);--linksDecoration: var(--gray450);--iconAction: var(--coldGray-lightened-10);--iconActionHover: var(--white);--blockquoteBackground: var(--coldGray-opacity-10);--blockquoteBorder: var(--coldGrayDim);--tableHeadBorder: var(--gray600);--tableBodyBorder: var(--gray700);--warningBackground: hsla( 33, 30%, 60%, 10%);--warningHeadingBackground: hsla( 33, 66%, 35%, 80%);--warningHeading: var(--white);--errorBackground: hsla( 7, 30%, 60%, 10%);--errorHeadingBackground: hsla( 6, 70%, 40%, 80%);--errorHeading: var(--white);--infoBackground: hsla(206, 30%, 60%, 10%);--infoHeadingBackground: hsla(213, 55%, 35%, 80%);--infoHeading: var(--white);--neutralBackground: hsl(210, 30%, 60%, 10%);--neutralHeadingBackground: var(--gray600);--neutralHeading: var(--white);--tipBackground: hsla(142, 30%, 60%, 10%);--tipHeadingBackground: hsla(134, 45%, 30%, 80%);--tipHeading: var(--white);--fnSpecAttr: var(--gray400);--fnDeprecated: var(--yellowDark);--blink: var(--gray600);--codeBackground: var(--gray750);--codeBorder: var(--gray600);--codeScrollThumb: var(--gray500);--codeScrollBackground: var(--codeBorder);--admCodeBackground: var(--gray750);--admCodeBorder: var(--gray600);--admCodeColor: var(--gray100);--admInlineCodeColor: var(--gray100);--admInlineCodeBackground: var(--gray750);--admInlineCodeBorder: var(--gray600);--tabBackground: var(--gray900);--tabBorder: var(--gray700);--tabBorderTop: var(--gray700);--tab: var(--white);--tabShadow: var(--black);--bottomActionsBtnBorder: var(--white-opacity-10);--bottomActionsBtnSubheader: var(--mainLight);--modalBackground: var(--gray800);--settingsInput: var(--white);--settingsInputBackground: var(--gray700);--settingsInputBorder: var(--gray700);--settingsSectionBorder: var(--gray700);--quickSwitchInput: var(--gray300);--quickSwitchContour: var(--gray500);--success: var(--green-lightened-10);--sidebarButtonBackground: linear-gradient(180deg, var(--gray900) 20%, var(--gray900-opacity-50) 70%, var(--gray900-opacity-0) 100%);--sidebarAccentMain: var(--gray50);--sidebarBackground: var(--gray800);--sidebarHeader: var(--gray700);--sidebarMuted: var(--gray300);--sidebarHover: var(--white);--sidebarScrollbarThumb: var(--coldGray);--sidebarScrollbarTrack: var(--sidebarBackground);--sidebarSubheadings: var(--gray400);--sidebarItem: var(--gray200);--sidebarInactiveItemMarker: var(--gray600);--sidebarLanguageAccentBar: var(--mainLight);--sidebarActiveItem: var(--mainLightest);--searchBarBorder: var(--gray500);--searchAccentMain: var(--gray300);--searchSearch: var(--gray900);--autocompleteBorder: rgba(28,42,60,.75);--autocompletePreview: var(--gray750);--autocompleteHover: var(--gray700);--autocompleteBackground: var(--gray800);--suggestionBorder: var(--gray600);--autocompleteResults: var(--gray200);--autocompleteResultsBold: var(--gray100);--autocompleteSrollbarThumb: var(--gray600);--autocompleteSrollbarTrack: var(--gray850);--autocompleteLabelBack: var(--gray600);--autocompleteLabelFont: rgba(255, 255, 255, .8)}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}@font-face{font-family:remixicon;src:url(./remixicon-NKANDIL5.woff2) format("woff2");font-display:swap}[class^=ri-],[class*=" ri-"],.remix-icon{font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:root{--icon-arrow-up-s: "\ea78";--icon-arrow-down-s: "\ea4e";--icon-arrow-right-s: "\ea6e";--icon-add: "\ea13";--icon-subtract: "\f1af";--icon-error-warning: "\eca1";--icon-information: "\ee59";--icon-alert: "\ea21";--icon-double-quotes-l: "\ec51";--icon-link-m: "\eeaf";--icon-close-line: "\eb99";--icon-code-s-slash-line: "\ebad";--icon-menu-line: "\ef3e";--icon-search-2-line: "\f0cd";--icon-settings-3-line: "\f0e6";--icon-printer-line: "\f029"}.ri-lg{font-size:1.3333em;line-height:.75em;vertical-align:-.0667em}.ri-settings-3-line:before{content:var(--icon-settings-3-line)}.ri-add-line:before{content:var(--icon-add)}.ri-subtract-line:before{content:var(--icon-subtract)}.ri-arrow-up-s-line:before{content:var(--icon-arrow-up-s)}.ri-arrow-down-s-line:before{content:var(--icon-arrow-down-s)}.ri-arrow-right-s-line:before{content:var(--icon-arrow-right-s)}.ri-search-2-line:before{content:var(--icon-search-2-line)}.ri-menu-line:before{content:var(--icon-menu-line)}.ri-close-line:before{content:var(--icon-close-line)}.ri-link-m:before{content:var(--icon-link-m)}.ri-code-s-slash-line:before{content:var(--icon-code-s-slash-line)}.ri-error-warning-line:before{content:var(--icon-error-warning)}.ri-information-line:before{content:var(--icon-information)}.ri-alert-line:before{content:var(--icon-alert)}.ri-double-quotes-l:before{content:var(--icon-double-quotes-l)}.ri-printer-line:before{content:var(--icon-printer-line)}html,body{box-sizing:border-box;height:100%;width:100%}body{--sidebarWidth: 300px;--sidebarMinWidth: 300px;--sidebarTransitionDuration: .3s;background-color:var(--background);color:var(--textBody);font-size:16px;font-family:var(--sansFontFamily);line-height:1.6875em}*,*:before,*:after{box-sizing:inherit}.body-wrapper{display:flex;height:100%}.sidebar{display:flex;flex-direction:column;width:var(--sidebarWidth);min-width:var(--sidebarMinWidth);height:100%;position:fixed;top:0;left:0;z-index:100;resize:horizontal}.sidebar-button{padding:26px 12px 18px 19px;position:fixed;z-index:200;top:0;left:0;will-change:transform}.sidebar-toggle--animated.sidebar-button{transition:transform var(--sidebarTransitionDuration) ease-in-out}.content{width:calc(100% - var(--sidebarWidth));left:var(--sidebarWidth);height:100%;position:absolute}.content .content-inner{max-width:var(--content-width);min-height:100%;margin:0 auto;padding:0 var(--content-gutter) 10px}.content-inner:focus{outline:none}body:is(.sidebar-opening,.sidebar-opened) .sidebar-button{transform:translate(calc(var(--sidebarWidth) - 100%))}body.sidebar-opening-start .sidebar{left:calc(-1 * var(--sidebarWidth))}body.sidebar-opening-start .content{width:100%;left:0}body.sidebar-opening .sidebar{left:0;transition:left var(--sidebarTransitionDuration) ease-in-out}body.sidebar-opening .content{width:calc(100% - var(--sidebarWidth));left:var(--sidebarWidth);transition:all var(--sidebarTransitionDuration) ease-in-out}body.sidebar-closing .sidebar-button{transform:translate(0)}body.sidebar-closing .sidebar{left:calc(-1 * var(--sidebarWidth));transition:left var(--sidebarTransitionDuration) ease-in-out}body.sidebar-closing .content{width:100%;left:0;transition:all var(--sidebarTransitionDuration) ease-in-out}body.sidebar-closed .sidebar{left:calc(-1 * var(--sidebarWidth));display:none}body.sidebar-closed .content{width:100%;left:0}@media screen and (max-width: 768px){.content,body.sidebar-opening .content{left:0;width:100%}body.sidebar-closed .sidebar-button{position:absolute}}.sidebar{--sidebarFontSize: 16px;--sidebarLineHeight: 20px;font-family:var(--sansFontFamily);font-size:var(--sidebarFontSize);font-weight:300;line-height:var(--sidebarLineHeight);background-color:var(--sidebarBackground);color:var(--sidebarAccentMain);overflow:hidden;scrollbar-color:var(--sidebarScrollbarThumb) var(--sidebarScrollbarTrack)}.non-apple-os .sidebar{font-weight:400}.sidebar ul{list-style:none}.sidebar ul li{margin:0;padding:0 10px}.sidebar a{color:var(--sidebarAccentMain);text-decoration:none;transition:color .3s ease-in-out}.sidebar a:hover{color:var(--sidebarHover)}.sidebar .sidebar-header{background-color:var(--sidebarHeader);width:100%}.sidebar .sidebar-projectInfo{display:flex;justify-content:start;align-items:center;gap:16px;margin:12px 16px 12px 14px;max-width:235px}.sidebar .sidebar-projectImage{align-self:flex-end}.sidebar .sidebar-projectImage img{display:block;max-width:48px;max-height:48px}.sidebar .sidebar-projectName{font-weight:700;font-size:20px;line-height:24px;color:var(--sidebarAccentMain);margin:0;padding:0;max-width:230px;word-wrap:break-word}.sidebar .sidebar-projectVersion{display:block;position:relative;margin:0;padding:0;font-size:var(--sidebarFontSize);line-height:var(--sidebarLineHeight);color:var(--sidebarMuted)}.sidebar .sidebar-projectVersionsDropdown{cursor:pointer;position:relative;margin:0;padding:0 0 0 12px;border:none;-webkit-appearance:none;appearance:none;background-color:transparent;color:var(--sidebarMuted);z-index:2}.sidebar .sidebar-projectVersionsDropdown option{color:initial}.sidebar .sidebar-projectVersionsDropdownCaret{position:absolute;left:0;top:2px;z-index:1;font-size:8px;color:var(--sidebarMuted)}.sidebar .sidebar-projectVersionsDropdown::-ms-expand{display:none}.sidebar .sidebar-listNav{display:flex;margin:0;padding:4px 4px 0}.sidebar .sidebar-listNav :is(li,li button){text-transform:uppercase;letter-spacing:.02em;font-size:14px;color:var(--sidebarMuted)}.sidebar .sidebar-listNav li{display:inline-block;padding:0}.sidebar .sidebar-listNav li button{background:none;border:0;border-radius:0;-webkit-appearance:none;text-align:inherit;color:inherit;font-weight:inherit;cursor:pointer;display:inline-block;line-height:27px;padding:4px 10px 2px;transition:all .15s}.sidebar .sidebar-listNav li:is(.selected) button{background-color:var(--sidebarBackground);border-top:var(--navTabBorderWidth) solid var(--sidebarLanguageAccentBar)}.sidebar .sidebar-listNav li:not(.selected) button{border-top:var(--navTabBorderWidth) solid var(--sidebarHeader)}.sidebar .sidebar-listNav li:is(:hover):not(.selected) button{background-color:var(--gray600);border-top:var(--navTabBorderWidth) solid var(--gray400);color:var(--sidebarAccentMain);transition:all .15s}.sidebar .sidebar-tabpanel{flex:1 1 .01%;overflow-y:auto;overscroll-behavior:contain;position:relative;-webkit-overflow-scrolling:touch;margin-top:12px}.sidebar .full-list{margin:0;padding:0 0 20px;position:relative}.sidebar .full-list :is(li,a){overflow:hidden;text-overflow:ellipsis}.sidebar .full-list li{padding:0;margin-right:30px;line-height:27px;white-space:nowrap}.sidebar .full-list li.docs{margin-right:0}.sidebar .full-list li.open>ul{display:block;margin-left:10px}.sidebar .full-list li a.expand+button.icon-expand{appearance:none;background-color:transparent;border:0;padding:0;cursor:pointer;color:inherit;margin-right:10px;font-size:calc(1.2 * var(--sidebarFontSize));line-height:var(--sidebarLineHeight);position:absolute;display:flex;right:0;transform:translateY(calc(-100% - 4px))}.sidebar .full-list li a+button.icon-expand:after{font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sidebar .full-list li a.expand+button.icon-expand:after{content:var(--icon-arrow-down-s)}.sidebar .full-list li.open>a.expand+button.icon-expand:after{content:var(--icon-arrow-up-s)}.sidebar .full-list li.docs>a+button.icon-expand{margin-right:12px;font-size:var(--sidebarFontSize);line-height:var(--sidebarFontSize);transform:translateY(calc(-100% - 5px))}.sidebar .full-list li.docs>a+button.icon-expand:after{content:var(--icon-add)}.sidebar .full-list li.docs.open>a+button.icon-expand:after{content:var(--icon-subtract)}.sidebar .full-list li.nesting-context{font-weight:700;font-size:.9em;line-height:1.8em;color:var(--sidebarSubheadings);padding-left:15px}.sidebar .full-list li.group{text-transform:uppercase;font-weight:700;font-size:.8em;margin:1.5em 0 0;line-height:1.8em;color:var(--sidebarSubheadings);padding-left:15px}.sidebar .full-list li a{padding:3px 0 3px 15px;color:var(--sidebarItem)}.sidebar .full-list>li>a{display:block;width:100%;height:27px;line-height:var(--sidebarLineHeight)}.sidebar .full-list li .current-section>a{color:var(--sidebarActiveItem)}.sidebar .full-list li .current-section>a+button.icon-expand{color:var(--sidebarActiveItem)}.sidebar .full-list>li>a:hover{border-left:3px solid var(--sidebarLanguageAccentBar);padding-left:12px}.sidebar .full-list>li.current-page>a{color:var(--sidebarActiveItem);border-left:3px solid var(--sidebarLanguageAccentBar);padding-left:12px}.sidebar .full-list>li.current-page>a:after,.sidebar .full-list>li.current-page{color:var(--sidebarActiveItem)}.sidebar .full-list>li:last-child{margin-bottom:30px}.sidebar .full-list>li.group:first-child{margin-top:0}.sidebar .full-list ul{display:none;margin:10px 0 10px 15px;padding:0}.sidebar .full-list ul li{font-weight:300;line-height:var(--sidebarFontSize);padding:0 8px;margin-right:0;color:var(--sidebarAccentMain)}.non-apple-os .sidebar .full-list ul li{font-weight:400}.sidebar .full-list ul li.current-hash{color:var(--sidebarActiveItem)}.sidebar .full-list ul li.current-hash>a{color:var(--sidebarActiveItem)}.sidebar .full-list ul li.current-hash>a:before,.sidebar .full-list>li>ul>li>a:hover:before{content:"\2022";position:absolute;margin-left:-15px;color:var(--sidebarActiveItem)}.sidebar .full-list ul li a{padding-left:15px;display:block;width:100%;height:24px}.sidebar .full-list ul li ul{display:none;margin:9px 0 9px 20px}.sidebar .full-list ul li ul li{margin-right:0;height:20px;color:var(--sidebarAccentMain)}.sidebar .full-list ul li ul li a{border-left:1px solid var(--sidebarInactiveItemMarker);padding:0 10px;height:20px}.sidebar .full-list ul li ul li.current-hash>a:before{content:none}.sidebar .full-list ul li ul li>a:hover{border-color:var(--sidebarLanguageAccentBar)}.sidebar .full-list ul li ul li.current-hash>a{color:var(--sidebarActiveItem);border-color:var(--sidebarLanguageAccentBar)}.sidebar .full-list ul li ul li.current-hash>a{color:var(--sidebarActiveItem);margin-left:0}.sidebar ::-webkit-scrollbar{width:14px}::-webkit-scrollbar-track{background-color:var(--sidebarBackground)}.sidebar ::-webkit-scrollbar-thumb{background-color:var(--sidebarScrollbarThumb);border-radius:10px;border:3px solid var(--sidebarBackground)}.sidebar-button{cursor:pointer;background-color:transparent;border:none;font-size:var(--sidebarFontSize)}.sidebar-button:hover{color:var(--sidebarHover)}.sidebar-button{color:var(--sidebarAccentMain)}.sidebar-closed .sidebar-button{color:var(--contrast)}@media screen and (max-height: 500px){.sidebar{overflow-y:auto}.sidebar .full-list{overflow:visible}}.top-search{background-color:var(--background);top:0;z-index:99;position:relative;width:100%;padding:10px 0}.search-settings{display:flex;column-gap:12px;align-items:center;width:100%;position:relative}.search-bar{border:1px solid var(--searchBarBorder);border-radius:8px;height:48px;position:relative;width:100%}.top-search .search-bar .search-input{background-color:var(--searchSearch);border:none;border-radius:8px;color:var(--searchAccentMain);position:relative;height:46px;padding:8px 35px 8px 43px;width:100%}.top-search .search-bar .search-input::placeholder{color:var(--searchAccentMain);opacity:.5}.top-search .search-bar .search-input:focus{border:1px solid var(--searchBarFocusColor);border-radius:7px;position:relative;box-shadow:0 4px 20px 0 var(--searchBarBorderColor) inset}.top-search .search-bar .search-label{position:relative}.top-search .search-bar .search-button{font-size:14px;color:var(--searchAccentMain);background-color:transparent;border:none;cursor:pointer;left:11px;opacity:.5;padding:5px 1px 5px 5px;position:absolute;top:60%;transform:translateY(-60%);z-index:99}.top-search .search-bar.selected .search-button,.top-search .search-bar .search-button:hover,.top-search .search-bar .search-button:focus{color:var(--top-searchLanguageAccentBar);opacity:1}.top-search .search-bar .search-close-button{font-size:16px;color:var(--searchAccentMain);background-color:transparent;border:none;cursor:pointer;right:11px;margin:0;opacity:.5;padding:5px 1px 5px 0;position:absolute;transform:scaleY(0);top:calc(50% - 13px);transition:.15s transform ease-out;z-index:99}.top-search .search-bar .search-close-button:hover{opacity:.7}.top-search .search-settings button.icon-settings{display:flex;align-items:center;justify-content:flex-end}.top-search .search-settings .icon-settings{font-size:20px;float:right;color:var(--iconAction);text-decoration:none;border:none;transition:color .3s ease-in-out;background-color:transparent;cursor:pointer;padding:0}.top-search .search-settings .icon-settings:hover{color:var(--iconActionHover)}.top-search .search-settings .icon-settings:visited{color:var(--iconAction)}@media screen and (max-width: 768px){.top-search{padding-left:calc(var(--content-gutter) + 36px);padding-right:var(--content-gutter);margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter));width:calc(2 * var(--content-gutter) + 100%)}.search-settings{width:100%;box-sizing:border-box}}body.search-focused .search-bar .search-close-button{transform:scaleY(1);transition:transform .15s ease-out .15s}@media screen and (hover: hover){body.search-focused .top-search{position:sticky!important}body.search-focused.sidebar-closed .sidebar-button{position:fixed!important}}@media screen and (hover: none){body.scroll-sticky .top-search{position:sticky!important}body.scroll-sticky.sidebar-closed .sidebar-button{position:fixed!important}}*:focus,button:focus,[type=button]:focus,[type=reset]:focus,[type=submit]:focus{outline:2px solid var(--main);outline-offset:-2px}*:focus:not(:focus-visible),button:focus:not(:focus-visible),[type=button]:focus:not(:focus-visible),[type=reset]:focus:not(:focus-visible),[type=submit]:focus:not(:focus-visible){outline:0}input[type=text],input[type=number],input[type=date],input[type=datetime],input[type=datetime-local],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=time],input[type=url],input[type=week],textarea{outline:0}.content-inner{font-family:var(--defaultFontFamily);font-size:1em;line-height:1.6875em;position:relative;background-color:var(--background);color:var(--textBody)}.content-inner :is(h1,h2,h3,h4,h5,h6){font-family:var(--sansFontFamily);font-weight:700;line-height:1.5em;word-wrap:break-word;color:var(--textHeaders)}.content-inner h1{font-size:2em;margin:.5em 0}.content-inner h1.signature{margin:0}.content-inner h1.section-heading{margin:1.5em 0 .5em}.content-inner h1 small{font-weight:300}.content-inner h1 .icon-action{font-size:1.2rem;font-weight:400}.content-inner h2{font-size:1.6em;margin:1em 0 .5em;font-weight:700}.content-inner h3{font-size:1.375em;margin:1em 0 .5em;font-weight:700}.content-inner li+li{margin-top:.25em}.content-inner :is(a,.a-main){color:var(--links);text-decoration:underline;text-decoration-color:var(--linksDecoration);text-decoration-skip-ink:auto}.content-inner :is(a:visited,.a-main:visited){color:var(--linksVisited)}.content-inner .icon-action{float:right;color:var(--iconAction);text-decoration:none;border:none;transition:color .3s ease-in-out;background-color:transparent;cursor:pointer}.content-inner button.icon-action{margin-top:12px}.content-inner .icon-action:hover{color:var(--iconActionHover)}.content-inner .icon-action:visited{color:var(--iconAction)}.content-inner .livebook-badge-container{display:flex}.content-inner a.livebook-badge{display:inline-flex}.content-inner .note{color:var(--iconAction);margin-right:5px;font-size:14px;font-weight:400}.content-inner blockquote{border-left:3px solid var(--blockquoteBorder);position:relative;margin:1.5625em 0;padding:0 1.2rem;overflow:auto;background-color:var(--blockquoteBackground);border-radius:var(--borderRadius)}.content-inner blockquote p:last-child{padding-bottom:1em;margin-bottom:0}.content-inner table{margin:2em 0;border-collapse:collapse}.content-inner th{text-align:left;font-family:var(--sansFontFamily);text-transform:uppercase;font-weight:700;padding-bottom:.5em}.content-inner thead tr{border-bottom:1px solid var(--tableHeadBorder)}.content-inner tbody tr{border-bottom:1px solid var(--tableBodyBorder)}.content-inner tbody tr:last-child{border-bottom:none}.content-inner tr{vertical-align:bottom;height:2.5em}.content-inner :is(td,th){padding:.25em .25em .25em 1em;line-height:2em;vertical-align:top}.content-inner .section-heading{--icon-size: 16px;--icon-spacing: 5px;display:grid;grid-template:1fr / 1fr}.content-inner .section-heading>:is(.hover-link,.text){grid-row:1;grid-column:1}.content-inner .section-heading .hover-link{text-decoration:none}.content-inner .section-heading i{font-size:var(--icon-size);margin-top:.1em;margin-left:calc(-1 * (var(--icon-size) + var(--icon-spacing)));padding-right:var(--icon-spacing);opacity:0}@media screen and (max-width: 768px){.content-inner .section-heading i{margin-left:calc(-1 * (var(--icon-size)))}}.content-inner blockquote .section-heading i{display:none}.content-inner .section-heading .hover-link:is(:hover,:focus) i{opacity:1}.content-inner .section-heading .text{pointer-events:none}.content-inner .section-heading .text a{pointer-events:all}.content-inner .app-vsn{display:none!important;font-size:.6em;line-height:1.5em}@media screen and (max-width: 768px){.content-inner .app-vsn{display:block!important}}.content-inner img{max-width:100%}.content-inner strong>code{font-weight:700}.content-inner code{font-family:var(--monoFontFamily);font-style:normal;line-height:24px;font-weight:400}@media screen and (max-width: 768px){.content-inner :is(ol,ul){padding-left:calc(1.5 * var(--content-gutter))}}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip){border-radius:10px;border-left:0}.content-inner blockquote.warning{background-color:var(--warningBackground)}.content-inner blockquote.error{background-color:var(--errorBackground)}.content-inner blockquote.info{background-color:var(--infoBackground)}.content-inner blockquote.neutral{background-color:var(--neutralBackground)}.content-inner blockquote.tip{background-color:var(--tipBackground)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip){color:var(--contrast);margin:0 -1.2rem;padding:.7rem 1.2rem .7rem 3.3rem;font-weight:700;font-style:normal}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip):before{color:var(--contrast);position:absolute;left:1rem;font-size:1.8rem;font-family:remixicon;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.content-inner blockquote :is(h3,h4).warning{background-color:var(--warningHeadingBackground);color:var(--warningHeading)}.content-inner blockquote :is(h3,h4).warning:before{content:var(--icon-error-warning);color:var(--warningHeading)}.content-inner blockquote :is(h3,h4).error{background-color:var(--errorHeadingBackground);color:var(--errorHeading)}.content-inner blockquote :is(h3,h4).error:before{content:var(--icon-error-warning);color:var(--errorHeading)}.content-inner blockquote :is(h3,h4).info{background-color:var(--infoHeadingBackground);color:var(--infoHeading)}.content-inner blockquote :is(h3,h4).info:before{content:var(--icon-information);color:var(--infoHeading)}.content-inner blockquote :is(h3,h4).neutral{background-color:var(--neutralHeadingBackground);color:var(--neutralHeading)}.content-inner blockquote :is(h3,h4).neutral:before{content:var(--icon-double-quotes-l);color:var(--neutralHeading)}.content-inner blockquote :is(h3,h4).tip{background-color:var(--tipHeadingBackground);color:var(--tipHeading)}.content-inner blockquote :is(h3,h4).tip:before{content:var(--icon-information);color:var(--tipHeading)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip) code{margin:0 .5ch}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip) code{background-color:var(--admInlineCodeBackground);border:1px solid var(--admInlineCodeBorder);color:var(--admInlineCodeColor)}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip) pre code{background-color:var(--admCodeBackground);border:1px solid var(--admCodeBorder);color:var(--admCodeColor)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip) :is(a,a:visited){color:inherit;text-decoration-color:currentColor}@media screen and (max-width: 768px){.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip){margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter));padding-left:var(--content-gutter);padding-right:var(--content-gutter);border-radius:0}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip){margin:0 calc(-1 * var(--content-gutter))}}.content-inner .summary h2{font-weight:700}.content-inner .summary h2 a{text-decoration:none;border:none}.content-inner .summary span.deprecated{color:var(--darkDeprecated);font-weight:400;font-style:italic}.content-inner .summary .summary-row .summary-signature{font-family:var(--monoFontFamily);font-weight:700}.content-inner .summary .summary-row .summary-signature a{text-decoration:none;border:none}.content-inner .summary .summary-row .summary-synopsis{font-family:var(--defaultFontFamily);font-style:italic;padding:0 1.2em;margin:0 0 .5em}.content-inner .summary .summary-row .summary-synopsis p{margin:0;padding:0}.content-inner :is(a.no-underline,pre a){color:var(--linksNoUnderline);text-shadow:none;text-decoration:none;background-image:none}.content-inner :is(a.no-underline,pre a):is(:visited,:active,:focus,:hover){color:var(--linksNoUnderlineVisited)}.content-inner code{background-color:var(--codeBackground);vertical-align:baseline;border-radius:2px;padding:.1em .2em;border:1px solid var(--codeBorder);text-transform:none}.content-inner pre{margin:var(--baseLineHeight) 0}.content-inner pre code{display:block;overflow-x:auto;white-space:inherit;padding:.5em 1em}.content-inner pre code::-webkit-scrollbar{width:.4rem;height:.4rem}.content-inner pre code::-webkit-scrollbar-thumb{border-radius:.25rem;background-color:var(--codeScrollThumb)}.content-inner pre code::-webkit-scrollbar-track{background-color:var(--codeScrollBackground)}.content-inner pre code::-webkit-scrollbar-corner{background-color:var(--codeScrollBackground)}.content-inner pre code.output{margin:0 12px;max-height:400px;overflow:auto}.content-inner pre code.output+.copy-button{margin-right:12px}.content-inner pre code.output:before{content:"Output";display:block;position:absolute;top:-16px;left:12px;padding:2px 4px;font-size:12px;font-family:var(--monoFontFamily);line-height:1;color:var(--textHeaders);background-color:var(--codeBackground);border:1px solid var(--codeBorder);border-bottom:0;border-radius:2px}@media screen and (max-width: 768px){.content-inner>pre,.content-inner section>pre{margin-left:calc(-1 * var(--content-gutter));margin-right:calc(-1 * var(--content-gutter))}.content-inner>pre code,.content-inner section>pre code{padding-left:var(--content-gutter);padding-right:var(--content-gutter);border-radius:0;border-left-width:0;border-right-width:0}}@keyframes blink-background{0%{background-color:var(--textDetailBackground)}to{background-color:var(--blink)}}.content-inner .detail:target .detail-header{animation-duration:.55s;animation-name:blink-background;animation-iteration-count:1;animation-timing-function:ease-in-out}.content-inner .detail-header{margin:2 0 1em;padding:.5em 1em;background-color:var(--textDetailBackground);border-left:3px solid var(--textDetailAccent);font-size:1em;font-family:var(--monoFontFamily);position:relative}.content-inner .detail-header .note{float:right}.content-inner .detail-header .signature{display:inline-block;font-family:var(--monoFontFamily);font-size:1rem;font-weight:700}.content-inner .detail-header:hover a.detail-link,.content-inner .detail-header a.detail-link:focus{opacity:1;text-decoration:none}.content-inner .detail-header a.detail-link{transition:opacity .3s ease-in-out;position:absolute;top:0;left:0;display:block;opacity:0;padding:.6em;line-height:1.5em;margin-left:-2.5em;text-decoration:none;border:none}@media screen and (max-width: 768px){.content-inner .detail-header a.detail-link{margin-left:-30px}}.content-inner .specs pre{font-family:var(--monoFontFamily);font-size:.9em;font-style:normal;line-height:24px;white-space:pre-wrap;margin:0;padding:0}.content-inner .specs .attribute{color:var(--fnSpecAttr)}.content-inner .docstring{margin:1.2em 0 3em 1.2em}@media screen and (max-width: 768px){.content-inner .docstring{margin-left:0}}.content-inner .docstring:is(h2,h3,h4,h5){font-weight:700}.content-inner .docstring h2{font-size:1.1em}.content-inner .docstring h3{font-size:1em}.content-inner .docstring h4{font-size:.95em}.content-inner .docstring h5{font-size:.9em}.content-inner div.deprecated{display:block;padding:9px 15px;background-color:var(--fnDeprecated)}.content-inner .footer{margin:4em auto 1em;text-align:center;font-style:italic;font-size:14px}.content-inner .footer,.content-inner .footer :is(a,.footer-button){color:var(--textFooter)}.content-inner .footer .line{display:inline-block}.content-inner .footer .footer-button{background-color:transparent;border:0;cursor:pointer;font-style:italic;padding:0 4px}.content-inner .footer .footer-hex-package{margin-right:4px}.content-inner .bottom-actions{display:flex;justify-content:space-between;margin-top:4em}.content-inner .bottom-actions .bottom-actions-button{display:flex;text-decoration:none;flex-direction:column;border-radius:var(--borderRadius);border:1px solid var(--bottomActionsBtnBorder);padding:8px 16px;min-width:150px}.content-inner .bottom-actions .bottom-actions-button .subheader{font-size:.8em;color:var(--bottomActionsBtnSubheader);white-space:nowrap}.content-inner .bottom-actions .bottom-actions-button[rel=prev] .subheader{text-align:right}@media screen and (max-width: 768px){.content-inner .bottom-actions{flex-direction:column-reverse}.content-inner .bottom-actions .bottom-actions-item:not(:first-child){margin-bottom:16px}}.page-cheatmd .content-inner{--horizontal-space: 1.5em;--vertical-space: 1em}@media (max-width: 600px){.page-cheatmd .content-inner{--horizontal-space: 1em;--vertical-space: .75em}}.page-cheatmd .content-inner{max-width:1200px}.page-cheatmd .content-inner h1{margin-bottom:var(--vertical-space)}.page-cheatmd .content-inner h2{margin:var(--vertical-space) 0;column-span:all;color:var(--gray700);font-weight:500}.page-cheatmd.dark .content-inner h2{color:var(--gray200)}.page-cheatmd .content-inner h3{color:var(--main);text-decoration-color:var(--main);margin:0 0 1em;font-weight:400}.page-cheatmd .content-inner h3 :is(a,a:visited){color:var(--main);text-decoration-color:var(--main)}.page-cheatmd .content-inner section.h3{min-width:300px;margin:0;padding:0 0 calc(var(--vertical-space) * 2) 0;break-inside:avoid}.page-cheatmd .content-inner h3 .text{overflow:hidden}.page-cheatmd .content-inner h3 .text:after{content:"";margin-left:calc(var(--horizontal-space) / 2);vertical-align:baseline;display:inline-block;width:100%;height:1px;margin-right:-100%;margin-bottom:5px;background-color:var(--codeBorder)}.page-cheatmd .content-inner h4{display:block;margin:0;padding:.25em var(--horizontal-space);font-weight:400;background:var(--gray100);color:#567;border:solid 1px 1px 0 1px var(--gray100)}.page-cheatmd.dark .content-inner h4{background:#192f50;color:var(--textBody);border:1px solid #192f50;border-bottom:0}.page-cheatmd .content-inner .h2 p{margin:0;display:block;background:var(--gray50);padding:var(--vertical-space) var(--horizontal-space)}.page-cheatmd.dark .content-inner .h2 p{background:var(--gray700)}.page-cheatmd .content-inner .h2 p>code{color:#eb5757;border-radius:var(--borderRadius);padding:.2em .4em}.page-cheatmd .content-inner pre code{padding:var(--vertical-space) var(--horizontal-space)}.page-cheatmd .content-inner pre code::-webkit-scrollbar{width:.4rem;height:.6rem}.page-cheatmd .content-inner .h2 pre{margin:0}.page-cheatmd .content-inner .h2 pre+pre{margin-top:-1px}.page-cheatmd .content-inner pre.wrap{white-space:break-spaces}@media screen and (max-width: 768px){.page-cheatmd .content-inner pre code{border-left-width:1px!important;border-right-width:1px!important}}.page-cheatmd .content-inner .h2 table{display:table;box-sizing:border-box;width:100%;border-collapse:collapse;margin:0}.page-cheatmd .content-inner .h2 th{padding:var(--vertical-space) var(--horizontal-space);line-height:inherit;margin-bottom:-1px;vertical-align:middle;border-bottom:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 td{padding:var(--vertical-space) var(--horizontal-space);border:0;border-bottom:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 tr:first-child{border-top:1px solid var(--codeBorder)}.page-cheatmd .content-inner .h2 td code{color:#eb5757;border-radius:var(--borderRadius);padding:.2em .4em}.page-cheatmd .content-inner .h2 thead{background-color:var(--gray50)}.page-cheatmd.dark .content-inner .h2 thead{background-color:var(--gray700)}.page-cheatmd .content-inner .h2 tbody{background-color:var(--codeBackground)}.page-cheatmd .content-inner .h2 :is(ul,ol){margin:0;padding:0}.page-cheatmd .content-inner .h2 li{list-style-position:inside;padding:.5em var(--horizontal-space);line-height:2em;vertical-align:middle;background-color:var(--codeBackground);border-bottom:1px solid var(--codeBorder);margin-top:0}.page-cheatmd .content-inner .h2 :is(ul,ol)+pre code{border-top:0}.page-cheatmd .content-inner .h2 li>code{color:#eb5757;border-radius:var(--borderRadius);padding:.2em .4em}.page-cheatmd .content-inner section.width-50{display:block;width:50%;margin:0}.page-cheatmd .content-inner section.width-50>section>table{width:100%}.page-cheatmd .content-inner section:is(.col-2,.col-2-left,.col-3){column-gap:40px}.page-cheatmd .content-inner section.col-2{column-count:2;height:auto}.page-cheatmd .content-inner section.col-2-left{display:grid;grid-template-columns:calc(100% / 3) auto}.page-cheatmd .content-inner section.col-2-left>h2{grid-column-end:span 2}.page-cheatmd .content-inner section.col-3{column-count:3;height:auto}.page-cheatmd .content-inner section.list-4>ul{display:flex;flex-wrap:wrap}.page-cheatmd .content-inner section.list-4>ul>li{flex:0 0 25%}.page-cheatmd .content-inner section.list-6>ul{display:flex;flex-wrap:wrap}.page-cheatmd .content-inner section.list-6>ul>li{flex:0 0 calc(100% / 6)}@media screen and (max-width: 1400px){.page-cheatmd .content-inner section.col-3{column-count:2}.page-cheatmd .content-inner section.col-2-left{display:flex;flex-direction:column}}@media screen and (max-width: 1200px){.page-cheatmd .content-inner section:is(.col-2,.col-3){display:flex;flex-direction:column}.page-cheatmd .content-inner section.list-6>ul>li{flex:0 0 25%}}@media screen and (max-width: 1000px){.page-cheatmd .content-inner section:is(.list-4,.list-6)>ul>li{flex:0 0 calc(100% / 3)}}@media screen and (max-width: 600px){.page-cheatmd .content-inner section:is(.list-4,.list-6)>ul>li{flex:0 0 50%}.page-cheatmd .content-inner section.width-50{width:100%}}#search{min-height:200px;position:relative}#search .loading{height:64px;width:64px;position:absolute;top:50%;left:calc(50% - 32px)}#search .loading div{box-sizing:border-box;display:block;position:absolute;width:51px;height:51px;margin:6px;border:6px solid var(--coldGray);border-radius:50%;animation:loading 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:var(--coldGray) transparent transparent transparent}#search .loading div:nth-child(1){animation-delay:-.45s}#search .loading div:nth-child(2){animation-delay:-.3s}#search .loading div:nth-child(3){animation-delay:-.15s}@keyframes loading{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#search .result{margin:2em 0 2.5em}#search .result p{margin:0}#search .result-id{font-size:1.4em;margin:0}#search .result-id a{text-decoration:none;transition:color .1s ease-in-out;color:var(--links)}#search .result-id a:is(:visited,:active,:focus){color:var(--linksVisited)}#search .result-id a:hover{color:var(--main)}#search :is(.result-id,.result-elem) em{font-style:normal;color:var(--main)}#search .result-id small{font-weight:400}@keyframes keyboard-shortcuts-show{0%{opacity:0}to{opacity:1}}.modal{animation-duration:.15s;animation-name:keyboard-shortcuts-show;animation-iteration-count:1;animation-timing-function:ease-in-out;display:none;background-color:#000000bf;position:fixed;inset:0;z-index:300}.modal.shown{display:block}.modal .modal-contents{margin:75px auto 0;max-width:500px;background-color:var(--modalBackground);border-radius:var(--borderRadius);box-shadow:2px 2px 8px #0003;padding:25px 35px 35px}@media screen and (max-width: 768px){.modal .modal-contents{padding:20px}}.modal .modal-header{display:flex;align-items:start}.modal .modal-title{display:inline-block;flex-grow:1;font-size:1.2rem;font-weight:700;margin-bottom:20px}.modal .modal-title button{border:none;background-color:transparent;color:var(--textHeaders);font-weight:700;margin-right:30px;padding-left:0;text-align:left;transition:color .15s}.modal .modal-title button:hover{color:var(--main);cursor:pointer}.modal .modal-title button.active{color:var(--main)}.modal .modal-close{cursor:pointer;display:block;font-size:1.5rem;margin:-8px -8px 0 0;padding:8px;opacity:.7;background-color:transparent;color:var(--textHeaders);border:none;transition:opacity .15s}.modal .modal-close:hover{opacity:1}#keyboard-shortcuts-content dl.shortcut-row{display:flex;align-items:center;justify-content:space-between;margin:0;padding:6px 0 8px;border-bottom:1px solid var(--settingsSectionBorder)}#keyboard-shortcuts-content dl.shortcut-row:last-of-type{border-bottom-style:none}#keyboard-shortcuts-content dl.shortcut-row:first-child{padding-top:0}#keyboard-shortcuts-content :is(.shortcut-keys,.shortcut-description){display:inline-block}#keyboard-shortcuts-content kbd>kbd{background-color:var(--settingsInputBorder);color:var(--contrast);border-radius:var(--borderRadius);font-family:inherit;font-weight:700;display:inline-block;line-height:1;padding:4px 7px 6px;min-width:26px;text-align:center}#keyboard-shortcuts-content :is(.shortcut-keys,.shortcut-description){margin:0}#quick-switch-modal-body{width:100%;position:relative}#quick-switch-modal-body .ri-search-2-line{position:absolute;left:0;top:0;padding:4px 10px;color:var(--quickSwitchContour);font-weight:700}#quick-switch-modal-body #quick-switch-input{width:100%;padding:8px 6px 8px 38px;border:none;color:var(--quickSwitchInput);background-color:transparent;border-bottom:1px solid var(--quickSwitchContour);box-sizing:border-box;transition:all .12s ease-out}#quick-switch-modal-body #quick-switch-results{margin:0}#quick-switch-modal-body .quick-switch-result{padding:2px 5px;border-bottom:1px dotted var(--quickSwitchContour);transition:all .12s ease-out}#quick-switch-modal-body .quick-switch-result:last-child{border-bottom:none}#quick-switch-modal-body .quick-switch-result:hover{cursor:pointer}#quick-switch-modal-body .quick-switch-result:is(:hover,.selected){border-left:4px solid var(--main);background-color:var(--codeBackground)}.autocomplete{display:none;position:absolute;width:calc(100% - 32px);top:55px}.autocomplete .triangle{width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-bottom:12px solid var(--autocompleteBackground);position:absolute;top:8px;left:26px;transform:translate(-50%);z-index:100;background-color:transparent}.autocomplete-preview{width:100%;margin:0;height:100%;line-height:20px;background-color:var(--background);font-family:var(--sansFontFamily);border:4px solid var(--autocompleteBorder);padding:12px 16px}.autocomplete-preview div,.autocomplete-preview span{display:none}.autocomplete-preview.loading div{float:left;display:block;border:5px solid var(--autocompleteBorder);border-radius:50%;border-top:5px solid var(--textDetailAccent);width:20px;height:20px;animation:spinner 4s linear infinite}.autocomplete-preview.loading span{color:var(--autocompleteResults);display:inline;margin-left:6px}.autocomplete-preview.loading span:after{color:var(--autocompleteResults);content:"Loading"}@keyframes spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.autocomplete-preview.loading iframe{height:0}.autocomplete-preview iframe{width:100%;height:100%;border:0}.autocomplete-results{list-style:none;margin:0;padding:15px 20px;display:flex;justify-content:space-between;color:var(--autocompleteResults);font-family:var(--sansFontFamily);font-weight:300;font-size:.9rem}.autocomplete-results .bold{color:var(--autocompleteResultsBold);font-weight:400}.autocomplete.shown{display:block}.autocomplete-container{position:absolute;top:15px;width:100%;z-index:200}.autocomplete-suggestions{background-color:var(--autocompleteBackground);border-radius:8px;box-shadow:0 15px 99px 0 var(--autocompleteBorder);overflow-y:auto;max-height:450px;white-space:normal;overflow-x:hidden;overscroll-behavior-y:contain}.autocomplete-suggestions.previewing:has(.selected){max-height:80vh}.autocomplete-suggestions.previewing:has(.selected) .autocomplete-suggestion:not(.selected){display:none}.autocomplete-suggestions.previewing:not(:has(.selected)) .autocomplete-preview{display:none}.autocomplete-suggestions:not(.previewing) .autocomplete-preview{display:none}.autocomplete-suggestion{color:inherit;display:block;padding:12px 20px;text-decoration:none;transition:background-color .3s ease-in-out;border-top:1px solid var(--suggestionBorder);font-size:.9rem}.autocomplete-suggestion:hover,.autocomplete-suggestion.selected{background-color:var(--autocompleteHover)}.autocomplete-suggestion:not(.selected) .autocomplete-preview-indicator{display:none}.autocomplete-preview-indicator{float:right}.autocomplete-preview-indicator button{color:var(--iconAction);display:flex;align-items:center;text-decoration:none;border:1px solid var(--suggestionBorder);border-radius:8px;transition:color .3s ease-in-out;background-color:var(--autocompletePreview);cursor:pointer;padding:4px 8px;font-size:14px}.autocomplete-preview-indicator button:hover{color:var(--iconActionHover);background-color:var(--autocompleteHover)}.autocomplete-preview-indicator button i{margin-right:4px}.autocomplete-suggestions.previewing .autocomplete-preview-indicator-closed{display:none}.autocomplete-suggestions:not(.previewing) .autocomplete-preview-indicator-open{display:none}.autocomplete-suggestion:hover:not(.selected) .autocomplete-preview-indicator-closed{display:block}.autocomplete-suggestion em{font-style:normal;font-weight:700}.autocomplete-suggestion .description{opacity:.6;padding-top:3px}.autocomplete-suggestion .label{background-color:var(--autocompleteLabelBack);opacity:.6;color:var(--autocompleteLabelFont);padding:4px 8px;border-radius:4px;margin-left:5px;text-transform:uppercase;font-family:var(--sansFontFamily);font-size:.7rem}.autocomplete-suggestion .header{margin-right:5px}.autocomplete-suggestion .title,.autocomplete-suggestion .description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.autocomplete-suggestions a{text-decoration:none!important}.autocomplete-suggestions::-webkit-scrollbar{width:5px;border-radius:7px;flex-shrink:0}.autocomplete-suggestions::-webkit-scrollbar-thumb{background-color:var(--autocompleteSrollbarThumb);border-radius:7px}.autocomplete-suggestions::-webkit-scrollbar-track{background-color:var(--autocompleteSrollbarTrack)}@media screen and (max-width: 1023px){.autocomplete-results .press-return{display:none}}.tooltip{box-shadow:0 0 10px var(--black-opacity-10);max-height:300px;max-width:500px;padding:0;position:absolute;pointer-events:none;margin:0;z-index:99;top:0;left:0;visibility:hidden;transform:translateY(20px);opacity:0;transition:.2s visibility ease-out,.2s transform ease-out,.2s opacity ease-out}.tooltip.tooltip-shown{visibility:visible;transform:translateY(0);opacity:1}.tooltip .tooltip-body{border:1px solid var(--codeBorder)}.tooltip .tooltip-body .signature{min-width:320px;width:100%}.tooltip .tooltip-body .detail-header{border-left:0;margin-bottom:0;margin-top:0}.tooltip .tooltip-body .docstring{background-color:var(--background);padding:1.2em;margin:0;width:498px}.tooltip .tooltip-body .docstring-plain{max-width:498px;width:auto}.tooltip .tooltip-body .version-info{float:right;line-height:1.6rem;font-family:var(--monoFontFamily);font-size:.9rem;font-weight:400;margin-bottom:-6px;opacity:.3;padding-left:.3em}pre{position:relative}pre:hover .copy-button,pre .copy-button:focus{opacity:1}.copy-button{display:flex;opacity:0;position:absolute;top:5px;right:5px;padding:4px;background-color:var(--codeBackground);border:none;cursor:pointer;transition:all .15s;font-family:var(--defaultFontFamily);font-size:14px;line-height:24px;color:currentColor}.copy-button svg{opacity:.5;transition:all .15s}pre .copy-button:hover svg,pre .copy-button:focus-visible svg{opacity:1}.copy-button svg{width:20px}.copy-button.clicked{opacity:1;color:var(--success)}.copy-button.clicked svg{display:none;color:currentColor}#settings-modal-content{margin-top:10px}#settings-modal-content .hidden{display:none}#settings-modal-content .input{box-sizing:border-box;width:80%;padding:8px;font-size:14px;background-color:var(--settingsInputBackground);color:var(--settingsInput);border:1px solid var(--settingsInputBorder);border-radius:8px;transition:border-color .15s}#settings-modal-content .input:focus{border-color:var(--main)}#settings-modal-content .input::placeholder{color:var(--gray400)}#settings-modal-content .switch-button-container{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--settingsSectionBorder);padding:10px 0}#settings-modal-content .switch-button-container:first-of-type{border-top-style:none;padding-top:0}#settings-modal-content .switch-button-container>div>span{font-size:18px}#settings-modal-content .switch-button-container>div>p{font-size:14px;font-weight:300;line-height:1.4;margin:0;padding-bottom:6px;padding-right:10px}#settings-modal-content .switch-button{position:relative;display:inline-block;flex-shrink:0;width:40px;height:20px;user-select:none;transition:all .15s}#settings-modal-content .switch-button__checkbox{appearance:none;position:absolute;display:block;width:20px;height:20px;border-radius:1000px;background-color:#91a4b7;border:3px solid #e5edf5;cursor:pointer;transition:all .3s}#settings-modal-content .switch-button__bg{display:block;width:100%;height:100%;border-radius:1000px;background-color:#e5edf5;cursor:pointer;transition:all .3s}#settings-modal-content .switch-button__checkbox:checked{background-color:#fff;border-color:var(--main);transform:translate(100%)}#settings-modal-content .switch-button__checkbox:checked+.switch-button__bg{background-color:var(--main)}#settings-modal-content .switch-button__checkbox:focus{outline:0}#settings-modal-content .switch-button__checkbox:focus+.switch-button__bg{outline:2px solid var(--main);outline-offset:2px}#settings-modal-content .switch-button__checkbox:focus:not(:focus-visible)+.switch-button__bg{outline:0}#settings-modal-content .settings-select{cursor:pointer;position:relative;border:none;background-color:transparent;color:var(--textBody)}#settings-modal-content .settings-select option{color:initial}#toast{opacity:0;position:fixed;z-index:1;left:50%;bottom:1rem;min-width:3rem;margin:0 -1.2rem;padding:.7rem 1.2rem;text-align:center;font-weight:700;border-radius:10px;border:1px solid var(--codeBorder);background-color:var(--codeBackground);color:var(--textBody);transition:opacity .4s ease-in-out,transform .3s ease-out;cursor:default}#toast.show{opacity:1;transform:translateY(-.75rem)}@media (prefers-reduced-motion: reduce){#toast{transition:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0;user-select:none}@media print{.body-wrapper{display:block}.sidebar,.sidebar-button,.top-search{display:none}.content{padding-left:0;overflow:visible;left:0;width:100%}.summary-row{break-inside:avoid}#toast{display:none}.content-inner{padding:0}.content-inner .section-heading a.hover-link,.content-inner button.icon-action,.content-inner a.icon-action,.content-inner .bottom-actions{display:none}.footer p:first-of-type{display:none}.content-inner blockquote:is(.warning,.error,.info,.neutral,.tip){border:2px solid var(--gray400)}.content-inner blockquote :is(h3,h4):is(.warning,.error,.info,.neutral,.tip){color:var(--textHeaders);border-bottom:2px solid var(--gray400)}.content-inner pre code.makeup{border-color:var(--gray400);white-space:break-spaces;break-inside:avoid}.content-inner blockquote code.inline,.content-inner code.inline{border-color:var(--gray400)}}@media print{.page-cheatmd .content-inner *{background-color:transparent!important;border-color:var(--gray400)!important}.page-cheatmd .content-inner{max-width:100%;width:100%;padding:0;font-size:.7em}.page-cheatmd .content-inner section:is(.col-2,.col-2-left,.col-3){column-gap:30px}.page-cheatmd .content-inner section.col-2{column-count:2}.page-cheatmd .content-inner section.col-2-left{display:grid}.page-cheatmd .content-inner section.col-3{column-count:3}.page-cheatmd .content-inner h1{margin-top:0;margin-bottom:.5em}.page-cheatmd .content-inner h2.section-heading{font-weight:700;margin-top:1em;column-span:all}.page-cheatmd .content-inner section.h2{break-inside:avoid}.page-cheatmd .content-inner h3{font-weight:700;color:var(--mainDark)}.page-cheatmd .content-inner h3:after{height:2px;background-color:var(--gray400)}.page-cheatmd .content-inner section.h3{min-width:300px;break-inside:avoid}.page-cheatmd .content-inner h4{padding:.5em 0;border:none;font-weight:700;color:#000}.page-cheatmd .content-inner .h2 p{padding-left:0;padding-right:0;border:none!important}.page-cheatmd .content-inner code{line-height:1.5em}.page-cheatmd .content-inner .h2 table{font-variant-numeric:tabular-nums;break-inside:avoid}.page-cheatmd .content-inner .h2 :is(th,td){vertical-align:top;padding-left:0;padding-right:0}.page-cheatmd .content-inner .h2 thead{border-style:solid none;border-width:1px}.page-cheatmd .content-inner .h2 tr{border-bottom:none}.page-cheatmd .content-inner .h2 th{font-weight:700}.page-cheatmd .content-inner .h2 li{padding-left:0;padding-right:0;vertical-align:middle;border-bottom:none}.page-cheatmd .content-inner pre:hover button.copy-button,.page-cheatmd .content-inner div.tooltip{display:none}.page-cheatmd .content-inner footer p:not(.built-using){display:none}}code.makeup .unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.makeup .hll{background-color:#ffc}.makeup .bp{color:#3465a4}.makeup .c,.makeup .c1,.makeup .ch,.makeup .cm,.makeup .cp,.makeup .cpf,.makeup .cs{color:#4d4d4d}.makeup .dl{color:#408200}.makeup .err{color:#a40000;border:#ef2929}.makeup .fm,.makeup .g{color:#4d4d4c}.makeup .gd{color:#a40000}.makeup .ge{color:#4d4d4c;font-style:italic}.makeup .gh{color:navy;font-weight:700}.makeup .gi{color:#00a000}.makeup .go{color:#4d4d4c;font-style:italic}.makeup .gp{color:#4d4d4d}.makeup .gr{color:#ef2929}.makeup .gs{color:#4d4d4c;font-weight:700}.makeup .gt{color:#a40000;font-weight:700}.makeup .gu{color:purple;font-weight:700}.makeup .il{color:#0000cf;font-weight:700}.makeup .k,.makeup .kc,.makeup .kd,.makeup .kn,.makeup .kp,.makeup .kr,.makeup .kt{color:#204a87}.makeup .l{color:#4d4d4c}.makeup .ld{color:#c00}.makeup .m,.makeup .mb,.makeup .mf,.makeup .mh,.makeup .mi,.makeup .mo{color:#2937ab}.makeup .n{color:#4d4d4c}.makeup .na{color:#8a7000}.makeup .nb{color:#204a87}.makeup .nc{color:#0000cf}.makeup .nd{color:#5c35cc;font-weight:700}.makeup .ne{color:#c00;font-weight:700}.makeup .nf{color:#b65800}.makeup .ni{color:#bc5400}.makeup .nl{color:#b65800}.makeup .nn{color:#4d4d4c}.makeup .no{color:#a06600}.makeup .nt{color:#204a87;font-weight:700}.makeup .nv,.makeup .nx{color:#4d4d4c}.makeup .o{color:#bc5400}.makeup .ow{color:#204a87}.makeup .p,.makeup .py{color:#4d4d4c}.makeup .s,.makeup .s1,.makeup .s2,.makeup .sa,.makeup .sb,.makeup .sc{color:#408200}.makeup .sd{color:#8f5902;font-style:italic}.makeup .se{color:#204a87}.makeup .sh{color:#408200}.makeup .si{color:#204a87}.makeup .sr{color:#c00}.makeup .ss{color:#a06600}.makeup .sx{color:#408200}.makeup .vc,.makeup .vg,.makeup .vi,.makeup .vm,.makeup .x{color:#4d4d4c}.dark .makeup{color:#dce1e6}.dark .makeup .hll{background-color:#49483e}.dark .makeup .bp{color:#dce1e6}.dark .makeup .c,.dark .makeup .c1,.dark .makeup .ch,.dark .makeup .cm,.dark .makeup .cp,.dark .makeup .cpf,.dark .makeup .cs{color:#969386}.dark .makeup .dl{color:#e6db74}.dark .makeup .err{color:#960050;background-color:#1e0010}.dark .makeup .fm{color:#a6e22e}.dark .makeup .gd{color:#ff5385}.dark .makeup .ge{font-style:italic}.dark .makeup .gi{color:#a6e22e}.dark .makeup .gp{color:#969386}.dark .makeup .gs{font-weight:700}.dark .makeup .gu{color:#969386}.dark .makeup .gt{color:#ff5385;font-weight:700}.dark .makeup .il{color:#ae81ff}.dark .makeup .k,.dark .makeup .kc,.dark .makeup .kd{color:#66d9ef}.dark .makeup .kn{color:#ff5385}.dark .makeup .kp,.dark .makeup .kr,.dark .makeup .kt{color:#66d9ef}.dark .makeup .l,.dark .makeup .ld,.dark .makeup .m,.dark .makeup .mb,.dark .makeup .mf,.dark .makeup .mh,.dark .makeup .mi,.dark .makeup .mo{color:#ae81ff}.dark .makeup .n{color:#dce1e6}.dark .makeup .na{color:#a6e22e}.dark .makeup .nb{color:#dce1e6}.dark .makeup .nc,.dark .makeup .nd,.dark .makeup .ne,.dark .makeup .nf{color:#a6e22e}.dark .makeup .ni,.dark .makeup .nl,.dark .makeup .nn{color:#dce1e6}.dark .makeup .no{color:#66d9ef}.dark .makeup .nt{color:#ff5385}.dark .makeup .nv{color:#dce1e6}.dark .makeup .nx{color:#a6e22e}.dark .makeup .o,.dark .makeup .ow{color:#ff5385}.dark .makeup .p,.dark .makeup .py{color:#dce1e6}.dark .makeup .s,.dark .makeup .s1,.dark .makeup .s2,.dark .makeup .sa,.dark .makeup .sb,.dark .makeup .sc,.dark .makeup .sd{color:#e6db74}.dark .makeup .se{color:#ae81ff}.dark .makeup .sh,.dark .makeup .si,.dark .makeup .sr,.dark .makeup .ss,.dark .makeup .sx{color:#e6db74}.dark .makeup .vc,.dark .makeup .vg,.dark .makeup .vi,.dark .makeup .vm{color:#dce1e6}.tabset{--borderWidth: 1px;--tabsetPadding: var(--baseLineHeight);margin:var(--baseLineHeight) 0}.tabset-tablist{display:flex;overflow-x:auto}.tabset-tab{padding:.6rem var(--tabsetPadding);min-height:46px;font-family:var(--sansFontFamily);background-color:var(--tabBackground);color:var(--tab);border:var(--borderWidth) solid var(--tabBorder);margin-right:calc(-1 * var(--borderWidth));border-top-width:4px;border-top-color:var(--tabBorderTop);border-radius:0;border-top-left-radius:var(--borderRadius);border-top-right-radius:var(--borderRadius);box-shadow:0 -3px 4px var(--tabShadow) inset;cursor:pointer}.tabset-tab[aria-selected=true]{border-bottom-color:var(--tabBackground);border-top-color:var(--mainLight);box-shadow:none}.tabset-tab[aria-selected=true]:focus-visible{background-color:var(--mainLight);border-color:var(--mainLight);color:var(--white)}.tabset-panel{padding:0 var(--tabsetPadding);border:var(--borderWidth) solid var(--tabBorder);margin-top:calc(-1 * var(--borderWidth));border-bottom-left-radius:var(--borderRadius);border-bottom-right-radius:var(--borderRadius)}@media screen and (max-width: 768px){.tabset{--tabsetPadding: calc(var(--baseLineHeight) / 2)}.tabset-panel{padding-top:calc(var(--tabsetPadding) / 2);padding-bottom:calc(var(--tabsetPadding) / 2)}.tabset-panel pre,.tabset-panel blockquote{margin-left:calc(-1 * var(--tabsetPadding))!important;margin-right:calc(-1 * var(--tabsetPadding))!important}.tabset-panel>pre code{border-left-width:0;border-right-width:0}}body.preview{--sidebarWidth: 0px;overflow:hidden}body.preview .content{height:auto}body.preview .content-inner{padding:0}body.preview .sidebar,body.preview #sidebar-menu,body.preview .hover-link,body.preview .detail-link{display:none}body.preview :is(h1,h2,h3):first-of-type{margin-top:0}body:not(.dark) .content-inner img[src*="#gh-dark-mode-only"],body.dark .content-inner img[src*="#gh-light-mode-only"]{display:none} -/*! Bundled license information: - -normalize.css/normalize.css: - (*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css *) -*/ diff --git a/doc/dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 b/doc/dist/inconsolata-latin-400-normal-RGKDDNDD.woff2 deleted file mode 100644 index 6119e5971bfa1b7c5e50dc64d751d21f10038e8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16244 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 diff --git a/doc/dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 b/doc/dist/inconsolata-latin-ext-400-normal-K7HVGTP7.woff2 deleted file mode 100644 index 50cb547f74653d30dafe5455fb8323b72ae6af4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14772 zcmV;lIZMWOPew8T0RR9106DY(5&!@I0E4su069$n0RR9100000000000000000000 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 z zvc78g|1DE=6ksYv0CuvA9Dn9|FN7NQiT&l@L}WHjwP3q2Wovo}*2upp*!04`Q!8c& z89SH@T5+{B{U&y<$U5TMU%Z*NqttxWlukgassDHjCnU;p2K zy(mU@|09Z8r3Q$N(-sJ>@r(63e(|*efhMz5zW;JhcS6nK0*ueem^D@`M(k@ElaZCB zzc*0x1!^h;!4UKzQQ+kC!zwH`e(5k5Q@|5+-$I=LA2mQoN$%#$%7{z4H<-%Z!GGA2 zWEbkt@EAGw?Z^K`22Rl$8Gm0QJFtY&$>m~{?=9g9y{$wG=ARxBg_378>fxkCFS|32 z@`h7F1|uzZ8V}J8J({Y+`)7OTpL+t|K(cZ|3rzpP(FqnkdHs{dyf&G+ zyd^i0H1U2~nuDZzfU@j&v*=k~jZY@>%jF{9+@sNYckuasa_=n8rBy8U%1fMET*+pw zy0mUf%a!)^GoqGRpj)4RsYg(6!QZTeo^0ux#;MQ$g9B<`SBdrAL7`ZOd!m6@&ZSO!~AtLx9)Aq$(kn= zYNdGn4`zJuVleLvxz|dVtFNT_^-nBl$-Rdh!nb&9XLDL#k5{K=ZM`SFp2A0xqsbw? zK0E!0M118`)kbyPuT#UUGKH*S=O2XJWxu`k7qX%z&FTECfy7F=FznyVDrEGj4Z`K^~!el{y zke$KH+!X}J_j1SAHg=oOlC0nmvqxFSyHmdMMG{AW$j)@C&B;+;tZy1 z!u44TMq#B)2!evZ{WDABY*iY#EXr;uJ%VFCv(Lj14~mu>Y&2wkY^vp~cbZE0qh%cb4s-x8 zSAmfX617d93d@EYM#ojey2Zr~sXTc^8P5@;k71os^h{#-=ypqN-blkZL=o$kl$^z& zckFL-Bo2O$+`o>dUTu1FzA}G9!aGcie3|f#Two}X*XNiu^kH40g*MB$2>5%BbJDBp z(6#D{bj5_2v_QhBwG<9j!KeLaRrG*Jew^QsNJ_ph@&qL&ld#y6(UoOV-|wF8O6R?{ zma8?@p($O~L-phfDMChjueR ztu{+@pX-t+IKG1_#AG-FaZ@jHVur;T4fEpCYspAl%)sdMr+EAh)i10L8BAC|c3tdq zUWxZiX1>_5a_TS&sbqU%;@r;ORjn9OTZi)hmfR~Th_7v$91X!qP}1B>4}B0#JXRSu zidTy9P-Zzsx?o7UA$=nakz`Of-2R>$CMxmlaght&B9$aplhWy{57kYk=8aa4Xy9S< z#wf-JDHLlbYvm9t!}?|=${0@U;zhI%BNoWgOVEX)2JV)|K(w9?KYcg#ttEZI@({4^Htz~ps+Bj0#^o8WRP_)5Bb?; z*vjn3?g#vbXX%t134-f;XRxz)*Us+$8M%T>IFfW6`rl9k=D7$nehrv0lTj56sI5Wf z?zEmMFXE|4#q5jBc>DgUZap) zEZYz`u1gFxUdP7&srfCDz`^5Z7I^3rSae4?X)`gSpI@a^`BfDef3$FEKbvV}Y8vNY z78UnA^ooFjOy(*f?b42c2_M+%hr=Zr(ldS1Rm#J9n4DBqO{PCZ7y&-R-H4;_?x5lf z%G#6PbM3^SfdW6l4dWOHhJ^Jx_z8{n6sA4dPg)IMf#J5W3*qO7Y0ZRR-)E-uDp;8G zGqG%5pcf&S$SIlsp<~MK%}2gNsX@`-X2li(Z~g9r$SW7EBc>yr{9_o5B{KtEGNFFz z2=a`KIwK*E!0&_+(TJ?fU$dc)CvId_?r4|;6H-gX#T90D{<>JifPJSV$Y|PaQbWFlG0&%=vedL zgvHOC)$=oaMd=Hg|Mq$D{b5UH24jg~pi^fQ89L7(56@`B6Y}(&I^C~6c1K#*Ql15t zC*h+xchLN zgpw5y)#9AdDh%|Tzjk(0ihxuZ(2_EW(p_gDGZ}FYYRU*5BDZN6>*RGx-Dq*AZ6saA ziUE4lePXmCB{uqRW4UnX*-t#zDvcmO6ly~ofQSwvHA*$QaH^dfY z+o*bQqvmT`s;hI1L4J)JE{BO~VU-q5Oh{qx`8P!}_k#X_7*!w^P>(@)!`|D#J-CIr zPm;h$H86yvazv1puz@`9X}+G<=5?gCjSheH>AdzTJ$q=DJqY`LHt_As#OB3uMN0kB z*t}dg^z1ctcbSaqJ2lL8l=Ufl(~5MrW}OB1#vk()?|n4%-HW8a-c7qFuon~q_h4HQ z?4|U*t$qe2**D;>d%Xgo$6}C2;qnw5tG&jnlY_v+3XtxByDG_%{)QlVGBghv;&rJ> zB5)5jl8<>}tdD6|Z8*g%SRb=K#*Rr_<4Bo9q75!obsJ0@KiKAWMwiPUH6d_^nwxrm zWiA9j%~}aOVB2eb;erUn7SfoIz%}+u*TVpzJ4iR>F|rz*pFrz!CIP0a!uz3xzfKxf z`6Qdvpxpu!7VKz$!{6wmjI2be7E?BV>VneLX!m@2*k;+CI}ElXKg7OKM)Vs&a{^`p zc2|X73@(G3V-mx5JY-GBe5(#n7a>+QMr7q*q6^btex zOkkVHIOdl()Lw2byIa||mBCo3<;(_{8##Z@Au&>4{@Pm&Z1v6Wyo9^^Z)lw?eC2{} z*+`^;>vV7v^B0o58X1lOY&Q_0pt%DN(v)ZZu@Cm6{kV$(J!QL&Dd6MqkoPfErU#I- zk~b6B9LJY#;AmX+-JdIz%%kj0*-y#`;`~AC{JSyc$P!lZR&NjL}k!B9q z*8YFuf;bcTXf{8A_~$rN-Cwbam>8F9O1PINvdy4bx$-@WPaFHS!t z_vZc?NW8MBS-#o%JCgV}0f1E>x{Mv||2p#K96SEwS<&y&cC+EXzumrHex7RQs&@YW zz4_?!-|;7j0CCgDiTI~4;{X7B0V*GL?}jU65*;-(qUkim^EVA4op}d<0?&zJw)Ap;roklHVn3C zX>WAhTHv)HL0Jx55HVpha4_IsPI%ne2Hn*8R1j(!(fZjTKmt9il#7%{@-hhwYrm25k9U=ztxtJ96N{giVLt z717+DAr)AIw`LH!C}DHx$WyNWXmjW`x|5)WP{v#F@D_uE`eK31j*EbnN_M6h_t}7A z=3gztmk7cZrIE0vAhc9+Y#QM{3RJ&O0VtvOEPDGY2V!9DCwa%$Sn zO~QI_RgOxzolG{0d4|sGH38B>&(CLhn}L!>ES#DITgD7C4}dS(N$9qKfUvZX=IRqj zL&IRB*t?gvI^~*KNAfc(0;Q%SLmV73+0s7sP;=1Kh@|gP92|ML!)6kkn)>MoWxWWq z7p6%&cPB{m{%VBV+_B6pqpzaF0#3tHFG}a0Fg4IkFIn}Jf^G|Gpu?~if$`?wtq$=n z-Yr7ip>Jx-xO_;{9t|w-heD_B6RH+J=D?x14zuZqMcnLVBX4#?0(c+ZB&K-MITwt4iEHvnVXeQKr`P3bgy*1hKC%nWyji2Ks z+-0xghj<3Bc8yoOhBvaW;TL!pe$8ItF>m1g?DP0B?!(*I&(KT0c^;5th*EKrBSFpa0I5WYT9kLGL*xNgATHewCFpL4s?u&npGbR9h@BEGvCKk0~ zQ+VO^LXath%=y+rMPEFG$jyXP<^s;AK=w>?v?e!?@!DX(*rec+Fpeu4ugwIW#iI@nlW{Uwu zG--W0RmVF@XI=uCB5Sl2YDbHm!wG z+W;6tt zB@kTY*cbdr1U%^dCOzcbmC_c?TK9%f+osxFq|{Ayj2qg`^q}hALj;o%PpLoW9)ocu z;4LxY@EjFbdqUf};Yfi2t?FE82Gp;g|C^m2D($7YZBGp?jH&Cknl*GI*v?VY9?R5# zHO-+ZosjYor{YNLvQ1m3PRAs`UGSzSG!u3VC-KBNX_vXqsr``sbQCRnVl6N2f;^bz`pk7Gh0cJuz6Y=^ zc*x=K9Oz5NxC7?t&DQrk$cy0&wucvLxHEiA8xVksU2+(?I(%?%gD=hbUc-*>GGbT5 zZt4jeN@59#lHi)iC#hXPC|%&vlF)U&Al9u2?q6kj&FrXSkNVlbIDGH?kG<&DTxde= z?o~g-X>9EdBsZK0JY-IT7X)-g&FR3Z#IG69h{8Y;dXvvs1Uv zF!3%yw=Wz=n+Qa1#njbXm!b)CcPMGW(hLhyhMp5jl=Ba|uC?$voRuBUudoBdd{=eW z^MWLS$t>q?)D19g%UFiaXI>fd0AC%Ub|fo6^o?=Y?&Q% z&=+}=@L&#LfT#zX-miWU97NjNY&^|X+C|{PjSW=^qJ1n)O}gtf(@K3DQqzQBxl|RL zNk{54cx*dc_R-tgxsf=o+}peCSD~!50~up5YhD>5R)QFItOrvY?3yj#svpklXGh>x zxV!7#(2H($e~s+TAgYT|10QFp8oy1T#726yeT*H$!D%As__qLhjm z*OG|itM`WepC0fuMGONdWlBpG&iGu}Q;1t_rh%vqU&w{NY_U1+xo(d%ehtRw$ZK_v z2UgrXgC9dDKdIAlxtIJ>5rC+(oD){Zll=fZKNH^+20o@x#qdWm_Rei1!XHL$QqjB5Li4hzGF z(4i~;WB&*d0`ziHb~?Ip)L+QG*wirDuXE*Sqiq=sj?D7|4|=3$W)ryi{1mY*(+KEA z&umpS-*=2)Wr864*pZ_a&4lX%OFVo;+GVcuf_*7tK>hG>b^%&;%N}^>t?I+GN^7de zooZtOh@%l$w5z`5&~^{mL<2pH^*yt0LA-LSBA^oMRr;M#LEm~e!|kc{h@HrQfY~_3 z&aSj;DSowH7{&}-iB+@QZ5}#Sd*Vzj1nD?;FB-;5{7OJ)6Y?gWm4I$kl}Q8kvFOv> z(*-@cLAXrg_WHQYI0S^!rCuQ$>(oqJ*4kqmL36uhyz6Tq%MpBg<-qPJO{j0G9N zexk#+?yK4_f!$QoM$cb?IG;O;i*Kj{|5%mPtN+^S@C%XDBEdK>@?w7AyKOI|2T@fk z?^L08@yk-LZcy+57}ftPA%WUvFvyR`ly41JraZqq`XnGuM3^o71Hlv{p)>)I@jO8; zB$)=hI-plP=e6RRi9e43+rQDNAiU!w8P|78UkJ0;Ck{*|Bt8L(o(Mk+^u4YRIqyqG z0zYB^Az#vCUJK3`3TX)z$=jVCA%OB$h7cAjm{KMy_2X4wZEGJ%M>izPl%5b{oqtezLtF>rKwEy4`fJ9f}QHr1%t?>7V;cWd@0RjMr%fTH26N*sS%*+)#SR z0M@!<$y!jXk9KY3^<}S33yO8sxVUx61O*6^6&p$e8BnpVA_#;4mUjGRfoec-ZPl(i z*}0~W@xZ1ExT1CO8#f-`VytQC_6EivxU>uaFId*an`{Tk`q~=Q9so1wokOxMGui}moHf>B2Mss7&W*Ml9=qwH{h4Fih5bbx zT(;bOWAw1eNZalY0Mos+F;~}PhykWJUL(G?SzmAgltR+p{VP0+&`rV|IU445DbOVqs=fagtlO zl7PMuTOa^D^@>#paC%oJ+z(CaytytBb%qrZeT$xORD}0c2V`x&L85HtwfJ4QYF;YUgsKgP3O9zxoWmKv`$I9$ytCM z_4;INh~AG4)>mVL^xv_8`VMS>ehXHo>%bzqxJ9kjkJV^te{IxHGts_k+D8@jR>=ju zl%uhp$|dTdgsKiLs+2aYyCUi)pIUU4S7TjLqt2-s?Ubr2m#9L@Fhg2*pm3!k76 z^ClN~FdpXSGjd@vbz;ha$j;Lu8;_BdXOApA3pI0Fm^js#krNp>j50atlnnNF`!g(^ zJ4T@>6t~ z?(-F{dS*gvMnkLiON$2VqkdnARLeT*jLK8e$;;SvKz;WLS;qTU#Uu4#+S^byr zJ7JI7M5AxLLMy|>dKi*h##B2 z|L_406a##&albOSEAWXZ9X&ufi;7RKj!`F+We!hpK<5c!uE?&DCOgIlFz`Rs%3krm O=l0uVfJ`3CtKbGC-+{#d diff --git a/doc/dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 b/doc/dist/inconsolata-latin-ext-700-normal-4MPBLFZC.woff2 deleted file mode 100644 index 8a20d54f18d011a61c005912388b1f72fcd237ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14908 zcmV-CI>W_xPew8T0RR9106IJX5&!@I0E3VK06EeC0RR9100000000000000000000 z0000Qf>IkG9DxJ|U_Vn-K~z8hhhzwWa0#Cj5eN!_xg>#~OACeu00A}vBm;~H1Rw>3 zP6r?ig*zL2auws4l_2f_+>v65WhBC8O;S&m{eQxNk}>uh-W~zStdvp}iA8Y7Se=r& zF)-$G9B7YFW}mLZzUGtL`E%`ew!eW$@(Y!`nxT@@xZ*$f{)nf?S~`YNVY`+_X%1)J zByRbJ5zdJZjX#k=!u5~tlx9dFfaa>Ki>%b&3f2foW)EnacMlj5?~8zipl@Vjp;$p# zi*#8mn?<=wSw*=_ad_J1yUl_J2Ym;3a8w$AVp9?ZA`0q(iiN0CQCHzI-2Nik<&X8R zDAxu5&##&1{-2%6l!z4)D3k!8P_3%10#?gVrsPp23s&_i1PKBXoFqX=g83Kvjj(@n zsVjHaB*SGKKnHZANC6;k0D%LfqDoWh0@OFxARZz95eGN110O_^L<0&UQSR@q ztq58SA_m)FnhefaiB0VA=oJ7Pb=+rrLO$C+JL~|+TC6S5bTqT@Q!PuDyLePw8I?ce0U zBv&_*Q&T_+2-4=@?cI9=Iw40_+u9M3W&PoQb^d!LU0bpwL+p_4Fh8KYPsr6de{P1k z(@Z#Zm~mM<_5VyY+nJpmY6y$(h|7`Z6ncni_^v5kI+weDW;r`MJK%B&m{>s6fyw|c z03>AtBo!#qHZDWXy2|e=S22^g%+rOGN{0}dHdW3=(Vks~RFsup@6LX?`ey%3@7bH| zCtT5ROAs#d$t|3MPG(zV!g+Bm`ktn7=dxX|MzRFduDh@>HN}V zr6$BKcnKS^P|SO#1oro;RbrW@ZZKrp!AM|1U%&45-+pO*U^VA9y(Zhb8c`7u5jl)t zwEf?yfDo8)`6nI+BcKuJf*4{7V!;Ap#TsIZf^c|3ya^z_f+3+oA<^O?i4q|xQXpw^ zAbG@)3RRFAO^_BHkO2lj1{n?+X%b|L>5!S`Ll#;BS#Awvz0HtqwnKJ04AD3VIqe+e zf*X)qZbR<64|(Vz!m=MgbTB-AqRNt?DE@JVcfKuc||y znX++9jTAgS69EE!9&)zM#H1-16nOn)XHq~jL$dq3A-TeNNQtoOW5uM^(2URu!bD+6 z255@m0Z50=xEMMn0ANKBF<60}kb$^-nZ^IfON14H>pLTCaRB2zr~ZIv zUZw%~R0RMO1_+`D0e}?(01jf$n#K+Uz&$HF8W912iJ63(l|!u>Rlxb~P|O)LgB3Wz zHO=%_zO$ubu;7=GN4XlI8B%G1R;pY3b(Yt>)A96YJo9;7Neg}9oA8r#CS6G`=}ijB zU^1LcCG*KLvWZlXL&%1=G>Cw>>z6w7`Cz2vLq!%e5gUB#4j?5rS$qG_R4kEjnp6ZEwJ!CaC-hS|Y zhs5O-*H+rW!;C^}Je>X|HXg?T$&>VoegC~pT& zRh|kYQmMqM&_n)vB_r!T1$rEW_$nZ+Km$JQ8;u}@oEAoX_eMI%M zl9sXQfHFf+WB{`CU`Un*XJJt0CdM{4(#Y&h$kphajE^!ko|$=>Wnr|%1z40nkU7Xc{)kp9KJJXm&AK0(PJr|$@E&5H*)ln_(PMw zg#94oJFyU&VnAEQ(4GlM(*=3@(2*$&%f|3*P0G!v^6_jSrj?B6MG(a$s2*BE=OZFim14h%4#xL~s*HQe`AbG;cvV zSSXId@kyF6p-Q>yaQ-ST*D#)Oo!r+dno+z)r}hyiSwBZ`PcY;NdMtK0k@}&r)*H6aaAp0z zB`&or^u16O12O#Omp7d9aNG#hx(sg7GRw%Sp{r!?s{qPff==glPe_-HaQ8gGJsg&0 z0t~CUn81>7EGJ_%K84bslWhHA$43hdRJUDeF%ayzf$|fGahXjvJrV9)7_AFS-sjfQiXSGn?N%aa zO9H=)BwctZDv<=CuUYU

    DD?!_feV3n2bp7iu_eL|n68f6Ld z>Z@MzKLSvM9|_iwLKT^m|6G)K7NzDX{$S?dqVeJ!dJ47!Ky)^MEkQ#X1p1;XP=O*>V0R9wV(yNA}W)#CRQ z?GHV*U#rM!i3&|td)}5}Vp|7CTC&Y!xRL;4yv9vKe{W`uXmXL4Je8#HYC(%=XyJ{{ zEVNyI*lv{(6)n4g$%_J-?}=QjFVi!JM&Nl4X67DW&Ub^tz$( z{b=Sm`9v%&y}QIP95NPJBNKh1v}}33re`t~UG4fyQF|p?bv5X`pAg{6D?Ex7wYrPN zb%UGUm3NA$8l*hs>-@nR;x6hc?@_GE=$Qh4+POPCXe5~%>*1=-tWGvZySWsy4{p2m zz@JXWaj_sdlp0jS6ns>HK_ihhckC5u9UTjNZa7khH7>dZ|9Pr+CH8|-J?bsSgV%c6V^z~&waRWrb8o2l7) z(zT#R7_|+Vpz(3@OBDrSAvkz)UsoA^N~e!tp(+kUi$iKETdJr-W{#rCU<86bME(Yd zS}c^DmA}nVxaHEqF?k~)cgNLCG4+N77!?ec>i{9ozgHx*{%QpVUck|2(yozWIAu{k zj36Cb!?=+^kpzW^MYkO|JziN53}uiXq|jqQ zkDTyc?*T(MhKQDD!aqea1?Z{Stmfv+tnJwVBvVd zY#e|n->g{o`#-NpM@R?q0vS{hdY3z?xl(Rvv?gM)2jZ9`KhH>S&Y?@_YPe)Dd%-&) zTKEzz#v6^M=VC3}V;O;IdL)cFE!7G?Ycw1L2KTuWm7QF4!i#3WIFZ&J)#CXA)C#%!TD5T|W}Q$?PT#BN2oc>>51wOH;;WH`|$U z7pDlHm{Y4yD3y`Jx}DiTivfc!uO<%t z5KSBbK(VsCRG87+X9BNWyQPNJi06BppwB#e7B;o3DDduuYLp|+w=VEl3PR&=cLkpO z^grC}?Mk(I-tql7>kq&}UJwQ3K{l$;WqNhbI6ae3prz!$^^UQ)D*LX?k4*@I>7Bph zR=L3^%c^%@1)nd>=}m;2mm*#cX~GK*RGux) z{tz2=Dt`uVCH4j|Qt+zE)0gh$&y>6zQSNrrV<*R@NK8~$-)O>q36MRMCKHblp zF*G3gjMHTLrf}7-G5@4dCyo4Z^>%;TQx*{GOrXecmET%D)MZ%Ycb2MSaQ;G$ECcup z0~fp+z69czRPIndp#&j12rH7dszHmkoR@Pb`2o~okz1QEVMVTbi=V((R*#Nd`xS7v z80S9u8&_jWhLaXVFWkK+wqECTmMvETW4|v#7M?{rG=$z*vzrlt*c^m3IRw2d22DRQ zx~K>|bJsF)l@*WQ9jF0h_Cg}7=9A{14LM61LBC*}$9pJ+q(XTzOZq{ypg=(_V1DI- zAPI0ydaYtdwhr7U~WnqjbZu@}Q4Qfdq#8Q+4Z{m0nhom&gDE$^17Uli7LrZIb~gN z{c@m45GZzdT?mX_$B(z~gwtGdh0IXXg(I3!|!uES5X+X2 zmz8wYY1-OOab)ZO)I0yb-c{BKIRt97Mzsctar=(-{~ACkDRn#pCVh4EJ?Fm8(hMi| zyvRc@iqLEJ0~kP|^}Tt(2%>rkHPxZspzMAEM^1{h1#y{t35`M0Y|t@o!<{L&ebDuQ zT%cDtCkPneoU4X2N`+j~a#icZuXWJzzk<;dg2LpEUP?L~gRI-3twA6b_AVaB?atq* zV1+*_>!Tgr_Ca+X=fs<^dRC#Dl9Xc;`kac$4uu~qu+p>f^H`Tc(9^W2-uT~|m;&}~ zh*nDT0U#I@l;_{(MgmCdk4@&G{Ew3bi7Jy^QsnrbQ&D|nT!R7U)csVy(9mp&&}kC0sl@-|(`_a)x{HM7<6iE$@AZ@O}1=Mzvm9FC17jl+s8%*!o;Utf1v_01)8JLPf>h$+t41%�#c@2U3#`>rMwF?6%z&ALOS3$_4zPHjx!@ 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 diff --git a/doc/dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 b/doc/dist/inconsolata-vietnamese-400-normal-IGQPHHJH.woff2 deleted file mode 100644 index ab70f18a843f16dfb1d3b54a2ea0442adadb29b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6836 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%0AweD$$Gt)CQ;s3M4>7q3!HjNDP zo7QDC720gpLfc>la-ft$+m|2G=nx>p2u4f=jBvVzbdxBy{nId`N0V4+>%Usruko={P*&C&lPaL&*y$; z{{MI6NN@EP>VHj^Ycc5OOJfBCag17i#_wAVa(&wW$$h|eg+2S)sKI?@pp5+ z=(k7JzZgIVYpDWUvj7oGgY#dbBQZ;K7bVpWY+u;6B&$#4vM#lk;2f;vgk-gE>jC6i zNdTwVTZPxG#64JzYgPaVInmF2iLXAXy8P|`|LOPCAAet{H~#xpiBC69>q`8I7(ic( zlpt0-ver@aHsp2d&`Y_Sn9@nUJSY!kN9D~t{{#0xRw}j}g%@C7OcA1eQ}9zH`(W=S zaR}K_x0z$j9?GSt;;WlEiYmAeD$Nxl>4@w1bwM27!W4r%C=X>v<;^_m^lav1lCMbV zBIHsyUH&*ngZLeJuylXo=TH&+(RFDA*^^0a2ra2|MHCVsg6zqqaJcSWUXO~fjIK)~ zNWZP@eJ->*dDixx|D;f7ZrP((5VwASfz=hi@=kQ4Kicgsf_@pnE_l`Mig4@GXb0#d zClQD^%^m>dPVf42eV~Kq$nkTCf>dX287TxJ3X-T#(QrDf%TFVq{1!bG#Ba!RADsUV zOX1Y$x-^8+Wv6XOH!i59beo<+M34_Y*lE1P26A!|SI|GCk@oR?bG-=!I)V zfQlm$0hT0fwR+Q1VKp5|aUqOW!C@yvfBq~YNS+PZ0Cr6lB+n_LD{^bLx_pvP#^^La_)g?1+*A=pTk%L?*HA$B;Bb6k z)!E+NI8$K7bFm0T#6yeZXPf0Y4d)4^^V&96Nn7(sHfSIqC%Olt69k=|vxTH%19T!W zZa^#s;JJPo_?tyGKhxyID5G3}G@(%y1hjQ?y!iYA90xh>5{WccHc+n!@!?`Ipp<*m zd=pbMe~q&GJ1C%r`JXN3WR6uaUoGxj&l#Tb7olq{O?C<5?g+HV+^ZB9xjg)bqLNw(T0A z36Qc>0G-S@4FR z?AbtoSCDZ4woo5;Fu-c~ILIz*SBJkRO9HG3`h0-I#Qqd-GZzTYnLF7$VGe#QJZD|N zEWFdkh+vxZtb*Xjj@wqt2n>#X#HOJbNMLu|V95qc^!E_i@q7Y4UP`C8jIi6;2Km`8 zV_xUKht6PgA#=i3ClrLR)s@Hgu|4jQE`sqwkBMR>`BHq`m1H>)uBh(0iegKQ<5LU< z^b?vl9H5HqK!krqfSKZUd%f2DXO~eT)l5RTz`qqeJIv;E+FY)MjrU!V@CX)%g8(oX zENRv|f82Efz%VBrEU>9W)jy5`0kC4J3@VjNH!jxRd9MF*3_n>2Y)X2(NW)G7se$`0 zQb$uuN69A)vh6xHbLonJh+v2*H((O2G4SOKX!_YrvzqV&F;cvez00AHn zJaob*o3pZhHz}Ae0pPuoc3&-)EBy&=u` z?n3}vjoZ-AC>#(l+3W)NqpYP6zyZL;HV8mT0ss#H@l_B!SFS=p$J19~kmb#*u+RqQ zDjY=NVLUHuuB0P1<{tt9aOoVbf`Cl7xDxVFU0>^qohB+~p16L!`izltva?GkSHnPe zvB-!n(E&#DAsssI=<`bPlm|4r%cyg@*%8s0V!F)_C$vtfMPOpB&zHyzbOY$(Q zyH>#6lneo5h@FY8>X{gLo@MFu8c+AdxmaH!`u}`2Y?izSa6XO2`ao2*g6EW9JBI-)7wcc5X4m;f;rx|p3cfjuU z+f1KL>RVx5g!Wj2S!M-C;%jwT{b;AfbeR3M+RYKP&170lvfF6l=3wfLWa^C67d9SG zG#IF_Uh72b^fptgCsU(^sn)_>sxwu((6?CYMk_SbSFWi+%hVdTRLv!1id9y(NM#CD zbgfyc8Z=+omxs#HTm_jBD!D$w%6&usB?x%U zGJz45@@Enf-tmOkB~&*FJiLk~QDpJ|t8s;SypF~cC%cyAWY)67%rMRB)@qAnts9o% zEG#PhvO*^0e))qWFd~_?j^C~|oO&(QpmrSIK!@b89?ru1^$NXBPw4w~JP1!fg*N-~ zBQ(ou)`~@3Ylb=eBf}RNG7yygT)_$6&v+&d3lN^THlmd?9Cs;s{NS4BOm z2l^khxqv@@(x^N&HC%*neeLpfr%$ iM=oZgp$zXxO}O)6lJ)N%2~4+;*6v3jY^c(>O9cQYtuz(@ diff --git a/doc/dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 b/doc/dist/inconsolata-vietnamese-700-normal-LHEGSN35.woff2 deleted file mode 100644 index a8140081e44d7ef2b1cd92a2dda930874c57fa73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6944 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 diff --git a/doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 b/doc/dist/lato-latin-300-normal-YUMVEFOL.woff2 deleted file mode 100644 index aad98a339043040c3bcb72f319e55a8f028562f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23236 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 diff --git a/doc/dist/lato-latin-400-normal-W7754I4D.woff2 b/doc/dist/lato-latin-400-normal-W7754I4D.woff2 deleted file mode 100644 index ff60934dd0ea9cdd93f961d2dfd1e158357f2a77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23580 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 QOFh<%JiLFgmWQ+r07g396aWAK diff --git a/doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 b/doc/dist/lato-latin-700-normal-2XVSBPG4.woff2 deleted file mode 100644 index 11de83feaf0fb872c91fce89534fd4e2d8bbda28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23040 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 diff --git a/doc/dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 b/doc/dist/lato-latin-ext-300-normal-VPGGJKJL.woff2 deleted file mode 100644 index 486d3ecf0a97553e0ad751a183466d10bcb98167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5624 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 S&~TTeYt5jdfCpaS$|L}V4$a&E diff --git a/doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 b/doc/dist/lato-latin-ext-400-normal-N27NCBWW.woff2 deleted file mode 100644 index edb9fa6f492362a9ab1f1d674b8f6e6f4e2085d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5472 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 WhF)K4IGNT+hd8;|K8&%*Sz!P*WW1>W diff --git a/doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 b/doc/dist/lato-latin-ext-700-normal-Q2L5DVMW.woff2 deleted file mode 100644 index 2c8aaa866eee8bee09ee05a9809c2fda7cd87bd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5368 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 q3kxY4?d;kys!X?dVp*I diff --git a/doc/dist/search_data-EF5B6961.js b/doc/dist/search_data-EF5B6961.js deleted file mode 100644 index 93a0a33..0000000 --- a/doc/dist/search_data-EF5B6961.js +++ /dev/null @@ -1 +0,0 @@ -searchData={"items":[{"type":"module","title":"elli","doc":"Elli acceptor manager This gen_server owns the listen socket and manages the processes accepting on that socket. When a process waiting for accept gets a request, it notifies this gen_server so we can start up another acceptor.","ref":"elli.html"},{"type":"function","title":"elli.get_acceptors/1","doc":null,"ref":"elli.html#get_acceptors/1"},{"type":"function","title":"elli.get_open_reqs/1","doc":null,"ref":"elli.html#get_open_reqs/1"},{"type":"function","title":"elli.get_open_reqs/2","doc":null,"ref":"elli.html#get_open_reqs/2"},{"type":"function","title":"elli.set_callback/3","doc":null,"ref":"elli.html#set_callback/3"},{"type":"function","title":"elli.start_link/0","doc":"Create an Elli server process as part of a supervision tree, using the default configuration. The same as start_link({callback, elli_example_callback}, {callback_args, []}) .","ref":"elli.html#start_link/0"},{"type":"function","title":"elli.start_link/1","doc":null,"ref":"elli.html#start_link/1"},{"type":"function","title":"elli.stop/1","doc":"Stop Server .","ref":"elli.html#stop/1"},{"type":"type","title":"elli.body/0","doc":"A binary or iolist.","ref":"elli.html#t:body/0"},{"type":"type","title":"elli.header/0","doc":null,"ref":"elli.html#t:header/0"},{"type":"type","title":"elli.headers/0","doc":null,"ref":"elli.html#t:headers/0"},{"type":"type","title":"elli.http_method/0","doc":"An uppercase atom representing a known HTTP verb or a binary for other verbs.","ref":"elli.html#t:http_method/0"},{"type":"type","title":"elli.req/0","doc":null,"ref":"elli.html#t:req/0"},{"type":"type","title":"elli.response_code/0","doc":null,"ref":"elli.html#t:response_code/0"},{"type":"opaque","title":"elli.state/0","doc":"Internal state.","ref":"elli.html#t:state/0"},{"type":"module","title":"elli_example_callback","doc":"Elli example callback Your callback needs to implement two functions, handle/2 and handle_event/3 . For every request, Elli will call your handle function with the request. When an event happens, like Elli completed a request, there was a parsing error or your handler threw an error, handle_event/3 is called.","ref":"elli_example_callback.html"},{"type":"function","title":"elli_example_callback.chunk_loop/1","doc":"Send 10 separate chunks to the client. The same as chunk_loop(Ref, 10)","ref":"elli_example_callback.html#chunk_loop/1"},{"type":"function","title":"elli_example_callback.handle/2","doc":"Handle a Req uest. Delegate to our handler function. See handle/3","ref":"elli_example_callback.html#handle/2"},{"type":"function","title":"elli_example_callback.handle_event/3","doc":"Handle Elli events, fired throughout processing a request. elli_startup is sent when Elli is starting up. If you are implementing a middleware, you can use it to spawn processes, create ETS tables or start supervised processes in a supervisor tree. request_complete fires *after* Elli has sent the response to the client. Timings contains timestamps (native units) of events like when the connection was accepted, when headers/body parsing finished, when the user callback returns, response sent, etc. Sizes contains response sizes like response headers size, response body or file size. This allows you to collect performance statistics for monitoring your app. request_throw , request_error and request_exit events are sent if the user callback code throws an exception, has an error or exits. After triggering this event, a generated response is sent to the user. invalid_return is sent if the user callback code returns a term not understood by elli, see elli_http:execute_callback/1 . After triggering this event, a generated response is sent to the user. chunk_complete fires when a chunked response is completely sent. It's identical to the request_complete event, except instead of the response body you get the atom client or server depending on who closed the connection. Sizes will have the key chunks , which is the total size of all chunks plus encoding overhead. request_closed is sent if the client closes the connection when Elli is waiting for the next request on a keep alive connection. request_timeout is sent if the client times out when Elli is waiting for the request. request_parse_error fires if the request is invalid and cannot be parsed by [ erlang:decode_packet/3 ][decode_packet/3] or it contains a path Elli cannot parse or does not support. [decode_packet/3]: http://erlang.org/doc/man/erlang.html#decode_packet-3 client_closed can be sent from multiple parts of the request handling. It's sent when the client closes the connection or if for any reason the socket is closed unexpectedly. The Where atom tells you in which part of the request processing the closed socket was detected: receiving_headers , receiving_body or before_response . client_timeout can as with client_closed be sent from multiple parts of the request handling. If Elli tries to receive data from the client socket and does not receive anything within a timeout, this event fires and the socket is closed. bad_request is sent when Elli detects a request is not well formatted or does not conform to the configured limits. Currently the Reason variable can be {too_many_headers, Headers} or {body_size, ContentLength} . file_error is sent when the user wants to return a file as a response, but for some reason it cannot be opened.","ref":"elli_example_callback.html#handle_event/3"},{"type":"module","title":"elli_example_callback_handover","doc":null,"ref":"elli_example_callback_handover.html"},{"type":"function","title":"elli_example_callback_handover.handle/2","doc":null,"ref":"elli_example_callback_handover.html#handle/2"},{"type":"function","title":"elli_example_callback_handover.init/2","doc":"Return {ok, handover} if Req 's path is /hello/world , otherwise ignore .","ref":"elli_example_callback_handover.html#init/2"},{"type":"behaviour","title":"elli_handler","doc":null,"ref":"elli_handler.html"},{"type":"callback","title":"elli_handler.handle/2","doc":null,"ref":"elli_handler.html#c:handle/2"},{"type":"callback","title":"elli_handler.handle_event/3","doc":null,"ref":"elli_handler.html#c:handle_event/3"},{"type":"callback","title":"elli_handler.init/2","doc":null,"ref":"elli_handler.html#c:init/2"},{"type":"callback","title":"elli_handler.postprocess/3","doc":null,"ref":"elli_handler.html#c:postprocess/3"},{"type":"callback","title":"elli_handler.preprocess/2","doc":null,"ref":"elli_handler.html#c:preprocess/2"},{"type":"type","title":"elli_handler.callback/0","doc":"A tuple of a t:callback_mod() and t:callback_args() .","ref":"elli_handler.html#t:callback/0"},{"type":"type","title":"elli_handler.callback_args/0","doc":"Arguments to pass to a t:callback_mod()","ref":"elli_handler.html#t:callback_args/0"},{"type":"type","title":"elli_handler.callback_mod/0","doc":"A callback module.","ref":"elli_handler.html#t:callback_mod/0"},{"type":"type","title":"elli_handler.event/0","doc":"Fired throughout processing a request. See elli_example_callback:handle_event/3 for descriptions.","ref":"elli_handler.html#t:event/0"},{"type":"type","title":"elli_handler.result/0","doc":null,"ref":"elli_handler.html#t:result/0"},{"type":"module","title":"elli_http","doc":"Elli HTTP request implementation An elli_http process blocks in elli_tcp:accept/3 until a client connects. It then handles requests on that connection until it's closed either by the client timing out or explicitly by the user.","ref":"elli_http.html"},{"type":"function","title":"elli_http.accept/4","doc":"Accept on the socket until a client connects. Handle the request, then loop if we're using keep alive or chunked transfer. If elli_tcp:accept/3 doesn't return a socket within a configurable timeout, loop to allow code upgrades of this module.","ref":"elli_http.html#accept/4"},{"type":"function","title":"elli_http.chunk_loop/1","doc":null,"ref":"elli_http.html#chunk_loop/1"},{"type":"function","title":"elli_http.close_or_keepalive/2","doc":"Return the preferred session handling setting to close or keep the current session alive based on the presence of a header or the standard default based on the version of HTTP of the request.","ref":"elli_http.html#close_or_keepalive/2"},{"type":"function","title":"elli_http.handle_request/4","doc":"Handle a HTTP request that will possibly come on the socket. Returns the appropriate connection token and any buffer containing (parts of) the next request.","ref":"elli_http.html#handle_request/4"},{"type":"function","title":"elli_http.keepalive_loop/3","doc":"Handle multiple requests on the same connection, i.e. "keep alive" .","ref":"elli_http.html#keepalive_loop/3"},{"type":"function","title":"elli_http.keepalive_loop/5","doc":null,"ref":"elli_http.html#keepalive_loop/5"},{"type":"function","title":"elli_http.mk_req/8","doc":null,"ref":"elli_http.html#mk_req/8"},{"type":"function","title":"elli_http.mk_req/11","doc":null,"ref":"elli_http.html#mk_req/11"},{"type":"function","title":"elli_http.parse_path/1","doc":null,"ref":"elli_http.html#parse_path/1"},{"type":"function","title":"elli_http.send_file/5","doc":"Send a HTTP response to the client where the body is the contents of the given file. Assumes correctly set response code and headers.","ref":"elli_http.html#send_file/5"},{"type":"function","title":"elli_http.send_response/4","doc":"Generate a HTTP response and send it to the client.","ref":"elli_http.html#send_response/4"},{"type":"function","title":"elli_http.split_args/1","doc":"Split the URL arguments into a proplist. Lifted from cowboy_http:x_www_form_urlencoded/2.","ref":"elli_http.html#split_args/1"},{"type":"function","title":"elli_http.start_link/4","doc":null,"ref":"elli_http.html#start_link/4"},{"type":"type","title":"elli_http.version/0","doc":"HTTP version as a tuple, i.e. {0, 9} | {1, 0} | {1, 1} .","ref":"elli_http.html#t:version/0"},{"type":"module","title":"elli_middleware","doc":"HTTP request processing middleware. This module offers both pre-processing of requests and post-processing of responses. It can also be used to allow multiple handlers, where the first handler to return a response short-circuits the request. It is implemented as a plain elli handler. Usage: Config = [ { mods , [ { elli_example_middleware , [ ] } , { elli_middleware_compress , [ ] } , { elli_example_callback , [ ] } ] } ] , elli : start_link ( [ %% ..., { callback , elli_middleware } , { callback_args , Config } ] ) . The configured modules may implement the elli behaviour, in which case all the callbacks will be used as normal. If link handle/2 returns ignore , elli will continue on to the next callback in the list. Pre-processing and post-processing is implemented in preprocess/2 and postprocess/3 . preprocess/2 is called for each middleware in the order specified, while postprocess/3 is called in the reverse order.","ref":"elli_middleware.html"},{"type":"module","title":"elli_middleware_compress","doc":"Response compression as Elli middleware.","ref":"elli_middleware_compress.html"},{"type":"function","title":"elli_middleware_compress.postprocess/3","doc":"Postprocess all requests and compress bodies larger than compress_byte_size ( 1024 by default).","ref":"elli_middleware_compress.html#postprocess/3"},{"type":"module","title":"elli_request","doc":null,"ref":"elli_request.html"},{"type":"function","title":"elli_request.async_send_chunk/2","doc":"Send a chunk asynchronously.","ref":"elli_request.html#async_send_chunk/2"},{"type":"function","title":"elli_request.body/1","doc":"Return the body .","ref":"elli_request.html#body/1"},{"type":"function","title":"elli_request.body_qs/1","doc":"Parse application/x-www-form-urlencoded body into a proplist.","ref":"elli_request.html#body_qs/1"},{"type":"function","title":"elli_request.chunk_ref/1","doc":"Return a reference that can be used to send chunks to the client. If the protocol does not support it, return {error, not_supported} .","ref":"elli_request.html#chunk_ref/1"},{"type":"function","title":"elli_request.close_chunk/1","doc":"Explicitly close the chunked connection. Return {error, closed} if the client already closed the connection. The same as send_chunk(Ref, close)","ref":"elli_request.html#close_chunk/1"},{"type":"function","title":"elli_request.get_arg/2","doc":null,"ref":"elli_request.html#get_arg/2"},{"type":"function","title":"elli_request.get_arg/3","doc":null,"ref":"elli_request.html#get_arg/3"},{"type":"function","title":"elli_request.get_arg_decoded/2","doc":null,"ref":"elli_request.html#get_arg_decoded/2"},{"type":"function","title":"elli_request.get_arg_decoded/3","doc":null,"ref":"elli_request.html#get_arg_decoded/3"},{"type":"function","title":"elli_request.get_args/1","doc":"Return a proplist of keys and values of the original query string. Both keys and values in the returned proplists will be binaries or the atom true in case no value was supplied for the query value.","ref":"elli_request.html#get_args/1"},{"type":"function","title":"elli_request.get_args_decoded/1","doc":null,"ref":"elli_request.html#get_args_decoded/1"},{"type":"function","title":"elli_request.get_header/2","doc":null,"ref":"elli_request.html#get_header/2"},{"type":"function","title":"elli_request.get_header/3","doc":null,"ref":"elli_request.html#get_header/3"},{"type":"function","title":"elli_request.get_range/1","doc":"Parse the Range header from the request. The result is either a [http_range()] or the atom parse_error . Use elli_util:normalize_range/2 to get a validated, normalized range.","ref":"elli_request.html#get_range/1"},{"type":"function","title":"elli_request.headers/1","doc":"Return the headers that have had string:casefold/1 run on each key.","ref":"elli_request.html#headers/1"},{"type":"function","title":"elli_request.host/1","doc":"Return the host .","ref":"elli_request.html#host/1"},{"type":"function","title":"elli_request.is_request/1","doc":null,"ref":"elli_request.html#is_request/1"},{"type":"function","title":"elli_request.method/1","doc":"Return the method .","ref":"elli_request.html#method/1"},{"type":"function","title":"elli_request.original_headers/1","doc":"Return the original headers .","ref":"elli_request.html#original_headers/1"},{"type":"function","title":"elli_request.path/1","doc":"Return path split into binary parts.","ref":"elli_request.html#path/1"},{"type":"function","title":"elli_request.peer/1","doc":null,"ref":"elli_request.html#peer/1"},{"type":"function","title":"elli_request.port/1","doc":"Return the port .","ref":"elli_request.html#port/1"},{"type":"function","title":"elli_request.post_arg/2","doc":null,"ref":"elli_request.html#post_arg/2"},{"type":"function","title":"elli_request.post_arg/3","doc":null,"ref":"elli_request.html#post_arg/3"},{"type":"function","title":"elli_request.post_arg_decoded/2","doc":null,"ref":"elli_request.html#post_arg_decoded/2"},{"type":"function","title":"elli_request.post_arg_decoded/3","doc":null,"ref":"elli_request.html#post_arg_decoded/3"},{"type":"function","title":"elli_request.post_args/1","doc":null,"ref":"elli_request.html#post_args/1"},{"type":"function","title":"elli_request.post_args_decoded/1","doc":null,"ref":"elli_request.html#post_args_decoded/1"},{"type":"function","title":"elli_request.query_str/1","doc":"Calculate the query string associated with a given Request as a binary.","ref":"elli_request.html#query_str/1"},{"type":"function","title":"elli_request.raw_path/1","doc":"Return the raw_path , i.e. not split or parsed for query params.","ref":"elli_request.html#raw_path/1"},{"type":"function","title":"elli_request.scheme/1","doc":"Return the scheme .","ref":"elli_request.html#scheme/1"},{"type":"function","title":"elli_request.send_chunk/2","doc":"Send a chunk synchronously. If the referenced process is dead, return early with {error, closed} , instead of timing out.","ref":"elli_request.html#send_chunk/2"},{"type":"function","title":"elli_request.to_proplist/1","doc":"Serialize the Req uest record to a proplist. Useful for logging.","ref":"elli_request.html#to_proplist/1"},{"type":"function","title":"elli_request.uri_decode/1","doc":null,"ref":"elli_request.html#uri_decode/1"},{"type":"type","title":"elli_request.http_range/0","doc":null,"ref":"elli_request.html#t:http_range/0"},{"type":"module","title":"elli_sendfile","doc":null,"ref":"elli_sendfile.html"},{"type":"function","title":"elli_sendfile.sendfile/5","doc":"Send part of a file on a socket. Basically, see file:sendfile/5 but for ssl (i.e. not raw OS sockets). Originally from https://github.com/ninenines/ranch/pull/41/files","ref":"elli_sendfile.html#sendfile/5"},{"type":"type","title":"elli_sendfile.sendfile_opts/0","doc":null,"ref":"elli_sendfile.html#t:sendfile_opts/0"},{"type":"module","title":"elli_tcp","doc":"Wrapper for plain and SSL sockets. Based on mochiweb_socket.erl .","ref":"elli_tcp.html"},{"type":"function","title":"elli_tcp.accept/3","doc":null,"ref":"elli_tcp.html#accept/3"},{"type":"function","title":"elli_tcp.close/1","doc":null,"ref":"elli_tcp.html#close/1"},{"type":"function","title":"elli_tcp.listen/3","doc":null,"ref":"elli_tcp.html#listen/3"},{"type":"function","title":"elli_tcp.peername/1","doc":null,"ref":"elli_tcp.html#peername/1"},{"type":"function","title":"elli_tcp.recv/3","doc":null,"ref":"elli_tcp.html#recv/3"},{"type":"function","title":"elli_tcp.send/2","doc":null,"ref":"elli_tcp.html#send/2"},{"type":"function","title":"elli_tcp.sendfile/5","doc":null,"ref":"elli_tcp.html#sendfile/5"},{"type":"function","title":"elli_tcp.setopts/2","doc":null,"ref":"elli_tcp.html#setopts/2"},{"type":"type","title":"elli_tcp.socket/0","doc":null,"ref":"elli_tcp.html#t:socket/0"},{"type":"module","title":"elli_test","doc":"Helper for calling your Elli callback in unit tests. Only the callback specified is actually run. Elli's response handling is not used, so the headers will for example not include a content length and the return format is not standardized. The unit tests below test elli_example_callback .","ref":"elli_test.html"},{"type":"function","title":"elli_test.call/5","doc":null,"ref":"elli_test.html#call/5"},{"type":"module","title":"elli_util","doc":null,"ref":"elli_util.html"},{"type":"function","title":"elli_util.encode_range/2","doc":"Encode Range to a Content-Range value.","ref":"elli_util.html#encode_range/2"},{"type":"function","title":"elli_util.file_size/1","doc":"Get the size, in bytes, of the file.","ref":"elli_util.html#file_size/1"},{"type":"function","title":"elli_util.normalize_range/2","doc":"If a valid byte-range, or byte-range-set of size 1, is supplied, returns a normalized range in the format {Offset, Length} . Returns undefined when an empty byte-range-set is supplied and the atom invalid_range in all other cases.","ref":"elli_util.html#normalize_range/2"},{"type":"type","title":"elli_util.range/0","doc":null,"ref":"elli_util.html#t:range/0"},{"type":"extras","title":"Elli - Erlang web server for HTTP APIs","doc":"# Elli - Erlang web server for HTTP APIs\n\n[![Hex.pm](https://img.shields.io/hexpm/v/elli.svg)](https://hex.pm/packages/elli)\n[![Documentation](https://img.shields.io/badge/docs-edown-green.svg)](doc/README.md)\n[![Erlang](https://img.shields.io/badge/erlang-%E2%89%A520.0-red.svg)](http://www.erlang.org/downloads)\n![Common Test](https://github.com/elli-lib/elli/workflows/Common%20Test/badge.svg)\n[![Coverage Status](https://coveralls.io/repos/github/elli-lib/elli/badge.svg?branch=develop)](https://coveralls.io/github/elli-lib/elli?branch=develop)\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nElli is a webserver you can run inside your Erlang application to\nexpose an HTTP API. It is aimed exclusively at building\nhigh-throughput, low-latency HTTP APIs. If robustness and performance\nis more important to you than general purpose features, then Elli might be\nfor you. If you find yourself digging into the implementation of a\nwebserver, then Elli might be for you. If you're building web services,\nnot web sites, then Elli might be for you.\n\nElli requires OTP 20.0 or newer.","ref":"readme.html"},{"type":"extras","title":"Installation - Elli - Erlang web server for HTTP APIs","doc":"Add `elli` to your application as a dependency to your\n[`rebar.config`](https://www.rebar3.org/docs/configuration):\n\n```erlang\n{deps, [\n {elli, \"3.3.0\"}\n]}.\n```\n\nAfterwards, to compile it, you can run:\n\n```console\nrebar3 compile\n```","ref":"readme.html#installation"},{"type":"extras","title":"Usage - Elli - Erlang web server for HTTP APIs","doc":"To boot Elli inside an Erlang shell, run:\n\n```console\nrebar3 shell\n```\n\n```erlang\n%% starting elli\n1> {ok, Pid} = elli:start_link([{callback, elli_example_callback}, {port, 3000}]).\n```","ref":"readme.html#usage"},{"type":"extras","title":"Examples - Elli - Erlang web server for HTTP APIs","doc":"","ref":"readme.html#examples"},{"type":"extras","title":"Callback Module - Elli - Erlang web server for HTTP APIs","doc":"The best source to learn how to write a callback module\nis [`elli_example_callback`](elli_example_callback.html).\nThere are also a bunch\nof examples used in the tests as well as descriptions of all the events.\n\nA minimal callback module looks something like this:\n\n```erlang\n-module(elli_minimal_callback).\n-behaviour(elli_handler).\n\n-include_lib(\"elli/include/elli.hrl\").\n\n-export([handle/2, handle_event/3]).\n\nhandle(Req, _Args) ->\n %% Delegate to our handler function\n Method = Req#req.method,\n Path = elli_request:path(Req),\n handle(Method, Path, Req).\n\nhandle('GET' = _Method, [<<\"hello\">>, <<\"world\">>] = _Path, _Req) ->\n %% Reply with a normal response. `ok' can be used instead of `200'\n %% to signal success.\n StatusCode = ok,\n Headers = [],\n Body = <<\"Hello World!\">>,\n {StatusCode, Headers, Body};\n\nhandle(_Method, _Path, _Req) ->\n {404, [], <<\"Not Found\">>}.\n\n%% @doc Handle request events: request completed, exception\n%% thrown, client timeout, etc. Must return `ok'.\nhandle_event(_Event, _Data, _Args) ->\n ok.\n```","ref":"readme.html#callback-module"},{"type":"extras","title":"Supervisor ChildSpec - Elli - Erlang web server for HTTP APIs","doc":"To add `elli` to a supervisor you can use the following example and adapt it to\nyour needs.\n\n```erlang\n-module(elli_minimal_sup).\n-behaviour(supervisor).\n\n-export([start_link/0, init/1]).\n\nstart_link() ->\n SupName = {local, ?MODULE},\n Module = ?MODULE,\n Args = [],\n supervisor:start_link(SupName, Module, Args).\n\ninit([] = _Args) ->\n ElliOpts = [\n {callback, elli_minimal_callback},\n {port, 3000}\n ],\n ElliSpec = {\n _Id = elli_minimal_http,\n _Start = {elli, start_link, [ElliOpts]},\n _Restart = permanent,\n _Shutdown = 5000,\n _Worker = worker,\n _Modules = [elli]},\n\n {ok, {{_Strategy = one_for_one, _Intensity = 5, _Period = 10}, [ElliSpec]} }.\n```","ref":"readme.html#supervisor-childspec"},{"type":"extras","title":"Further reading - Elli - Erlang web server for HTTP APIs","doc":"For more information about the features and design philosophy of Elli check\nout the [`overview`](overview.html).","ref":"readme.html#further-reading"},{"type":"extras","title":"License - Elli - Erlang web server for HTTP APIs","doc":"Elli is licensed under [The MIT License](LICENSE).","ref":"readme.html#license"},{"type":"extras","title":"Elli - Overview","doc":"# Elli - Overview\n\nCopyright (c) 2012-2016 Knut Nesheim, 2016-2018 elli-lib team\n\n__Version:__ 3.3.0\n\n__Authors:__ Knut Nesheim, elli-lib team.\n\nErlang web server for HTTP APIs","ref":"overview.html"},{"type":"extras","title":"Features - Elli - Overview","doc":"Here's the features Elli _does_ have:\n\n* [Rack][]-style request-response. Your handler function gets a\n complete request and returns a complete response. There's no\n messaging, no receiving data directly from the socket, no writing\n responses directly to the socket. It's a very simple and\n straightforward API. Have a look at [`elli_example_callback`](elli_example_callback.html)\nfor examples.\n\n* Middlewares allow you to add useful features like compression,\nencoding, stats, but only have it used when needed. No features you\ndon't use on the critical path.\n\n* Short-circuiting of responses using exceptions, allows you to use\n \"assertions\" that return for example 403 permission\n denied. `is_allowed(Req) orelse throw({403, [], <<\"Permission\n denied\">>})`.\n\n* Every client connection gets its own process, isolating the failure\nof a request from another. For the duration of the connection, only\none process is involved, resulting in very robust and efficient\ncode.\n\n* Binaries everywhere for strings.\n\n* Instrumentation inside the core of the webserver, triggering user\n callbacks. For example when a request completes, the user callback\n gets the `request_complete` event which contains timings of all the\ndifferent parts of handling a request. There's also events for\nclients unexpectedly closing a connection, crashes in the user\ncallback, etc.\n\n* Keep alive, using one Erlang process per connection only active\nwhen there is a request from the client. Number of connections is\nonly limited by RAM and CPU.\n\n* Chunked transfer in responses for real-time push to clients\n\n* Basic pipelining. HTTP verbs that does not have side-effects(`GET`\n and `HEAD`) can be pipelined, ie. a client supporting pipelining\ncan send multiple requests down the line and expect the responses\nto appear in the same order as requests. Elli processes the\nrequests one at a time in order, future work could make it possible\nto process them in parallel.\n\n* SSL using built-in Erlang/OTP ssl, nice for low volume admin\ninterfaces, etc. For high volume, you should probably go with\nnginx, stunnel or ELB if you're on AWS.\n\n* Implement your own connection handling, for WebSockets, streaming\n uploads, etc. See [`elli_example_callback_handover`](elli_example_callback_handover.html).","ref":"overview.html#features"},{"type":"extras","title":"Extensions - Elli - Overview","doc":"Here's some ready-to-use extensions for Elli.\n\n* [elli_access_log](https://github.com/elli-lib/elli_access_log):\nAccess log\n* [elli_basicauth](https://github.com/elli-lib/elli_basicauth):\nBasic auth\n* [elli_chatterbox](https://github.com/elli-lib/elli_chatterbox):\nHTTP/2 support\n* [elli_cloudfront](https://github.com/elli-lib/elli_cloudfront):\nCloudFront signed URLs\n* [elli_cookie](https://github.com/elli-lib/elli_cookie):\nCookies\n* [elli_date](https://github.com/elli-lib/elli_date):\n\"Date\" header\n* [elli_fileserve](https://github.com/elli-lib/elli_fileserve):\nStatic content\n* [elli_prometheus](https://github.com/elli-lib/elli_prometheus):\nPrometheus\n* [elli_stats](https://github.com/elli-lib/elli_stats):\nReal-time statistics dashboard\n* [elli_websockets](https://github.com/elli-lib/elli_websocket):\nWebSockets\n* [elli_xpblfe](https://github.com/elli-lib/elli_xpblfe):\nX-Powered-By LFE\n\nYou can also find a more complete list at .","ref":"overview.html#extensions"},{"type":"extras","title":"About - Elli - Overview","doc":"From operating and debugging high-volume, low-latency apps we have\ngained some valuable insight into what we want from a webserver. We\nwant simplicity, robustness, performance, ease of debugging,\nvisibility into strange client behaviour, really good instrumentation\nand good tests. We are willing to sacrifice almost everything, even\nbasic features to achieve this.\n\nWith this in mind we looked at the big names in the Erlang\ncommunity: [Yaws][], [Mochiweb][], [Misultin][] and [Cowboy][]. We\nfound [Mochiweb][] to be the best match. However, we also wanted to\nsee if we could take the architecture of [Mochiweb][] and improve on\nit. Elli takes the acceptor-turns-into-request-handler idea found\nin [Mochiweb][], the binaries-only idea from [Cowboy][] and the\nrequest-response idea from [WSGI][]/[Rack][] (with chunked transfer\nbeing an exception).\n\nOn top of this we built a handler that allows us to write HTTP\nmiddleware modules to add practical features, like compression of\nresponses, HTTP access log with timings, a real-time statistics\ndashboard and chaining multiple request handlers.","ref":"overview.html#about"},{"type":"extras","title":"Aren't there enough webservers in the Erlang community already? - Elli - Overview","doc":"There are a few very mature and robust projects with steady\ndevelopment, one recently ceased development and one new kid on the\nblock with lots of interest. As Elli is not a general purpose\nwebserver, but more of a specialized tool, we believe it has a very\ndifferent target audience and would not attract effort or users away\nfrom the big names.","ref":"overview.html#aren-t-there-enough-webservers-in-the-erlang-community-already"},{"type":"extras","title":"Why another webserver? Isn't this just the NIH syndrome? - Elli - Overview","doc":"[Yaws][], [Mochiweb][], [Misultin][], and [Cowboy][] are great\nprojects, hardened over time and full of very useful features for web\ndevelopment. If you value developer productivity, [Yaws][] is an\nexcellent choice. If you want a fast and lightweight\nserver, [Mochiweb][] and [Cowboy][] are excellent choices.\n\nHaving used and studied all of these projects, we believed that if we\nmerged some of the existing ideas and added some ideas from other\ncommunities, we could create a core that was better for our use cases.\n\nIt started out as an experiment to see if it is at all possible to\nsignificantly improve and it turns out that for our particular use\ncases, there is enough improvement to warrant a new project.","ref":"overview.html#why-another-webserver-isn-t-this-just-the-nih-syndrome"},{"type":"extras","title":"What makes Elli different? - Elli - Overview","doc":"Elli has a very simple architecture. It avoids using more processes\nand messages than absolutely necessary. It uses binaries for\nstrings. The request-response programming model allows middlewares to\ndo much heavy lifting, so the core can stay very simple. It has been\ninstrumented so as a user you can understand where time is spent. When\nthings go wrong, like the client closed the connection before you\ncould send a response, you are notified about these things so you can\nbetter understand your client behaviour.","ref":"overview.html#what-makes-elli-different"},{"type":"extras","title":"Performance - Elli - Overview","doc":"\"Hello World!\" micro-benchmarks are really useful when measuring the\nperformance of the webserver itself, but the numbers usually do more\nharm than good when released. I encourage you to run your own\nbenchmarks, on your own hardware. Mark Nottingham has some\n[very good pointers](http://www.mnot.net/blog/2011/05/18/http_benchmark_rules)\nabout benchmarking HTTP servers.\n\n[Yaws]: https://github.com/klacke/yaws\n[Mochiweb]: https://github.com/mochi/mochiweb\n[Misultin]: https://github.com/ostinelli/misultin\n[Cowboy]: https://github.com/ninenines/cowboy\n[WSGI]: https://www.python.org/dev/peps/pep-3333/\n[Rack]: https://github.com/rack/rack","ref":"overview.html#performance"},{"type":"extras","title":"CHANGELOG","doc":"# CHANGELOG","ref":"changelog.html"},{"type":"extras","title":"pre-v4.0.0 - CHANGELOG","doc":"* Headers are now properly treated as case-insensitive\n* Original headers that have not had `string:casefold/1` run on each header\nname are still available in the request through `elli_request:original_headers`","ref":"changelog.html#pre-v4-0-0"},{"type":"extras","title":"v3.3.0 - CHANGELOG","doc":"* Do not use x-forwarded-for for peer #75\n* Handle arguments with no value in (post|get)_arg_decoded #82\n* Fix compile-time warnings on missing record info. from aleppo #81","ref":"changelog.html#v3-3-0"},{"type":"extras","title":"v3.2.0 - CHANGELOG","doc":"* Quell warnings on OTP-21: \n\n* Generate HTML docs: \n\n* Add OTP-21 to Travis build matrix: \n\n* Remove unnecessary `stacktrace_compat` dependency: \n\n* Export `elli_request:uri_decode/1` and improve performance: \n\n* Update Travis config: \n\n* Drop support for OTP-16: \n\n* Prefer `OTP_RELEASE` over `rebar_erl_vsn` plugin: \n\n* Remove old `maintainers` metadata:","ref":"changelog.html#v3-2-0"},{"type":"extras","title":"v3.1.0 - CHANGELOG","doc":"* Update docs: \n\n* Logging and stacktrace OTP-21 support: \n\n* Include req_body size in sizes list: \n\n* Update CHANGELOG.md for 3.0.0:","ref":"changelog.html#v3-1-0"},{"type":"extras","title":"v3.0.0 - CHANGELOG","doc":"* `scheme`, `host`, and `port` added to the `#req{}` record. Corresponding\n helper functions added to the `elli_request` module.","ref":"changelog.html#v3-0-0"},{"type":"extras","title":"v2.1.2 - CHANGELOG","doc":"* Update dependencies and re-enable linting\n\n* Increase test coverage\n\n* Declare optional callbacks to elli_handler\n\n* Add TLS sendfile implementation by James Fish (from Andrew Thompson)\n\n* Use hackney instead of httpc in tests, due to httpc bug","ref":"changelog.html#v2-1-2"},{"type":"extras","title":"v2.0.2 - CHANGELOG","doc":"* Adapt [knutin/elli#108](https://github.com/knutin/elli/pull/108) by Michael Zazaian\n\n* Incomplete request regression fix by Evan Vigil-McClanahan\n\n* Handle binary URIs on OTP >=20\n\n* Bespoke uri_decode/1 to obviate inets dependency by Christoffer Vikström","ref":"changelog.html#v2-0-2"},{"type":"extras","title":"v2.0.1 - CHANGELOG","doc":"* Miscellaneous tooling, test, and type spec tweaks\n\n* Helper functions to reduce redundancy\n\n* Request start timing fix","ref":"changelog.html#v2-0-1"},{"type":"extras","title":"v2.0.0 - CHANGELOG","doc":"* Code and documentation cleanup\n\n* Instrumentation facilities\n\n* RFC 2616 section 8.2.3 implementation by Martin Karlsson\n\n* Send 500 and close connection if file operations fail","ref":"changelog.html#v2-0-0"},{"type":"extras","title":"v1.0.5 - CHANGELOG","doc":"* Optimization of SSL accept by Tristan Sloughter\n\n* Dependency cleanup by Adam Lindberg","ref":"changelog.html#v1-0-5"},{"type":"extras","title":"v1.0.4 - CHANGELOG","doc":"* OTP 18.0 compatibility, contributed by Florian Odronitz.","ref":"changelog.html#v1-0-4"},{"type":"extras","title":"v1.0.3 - CHANGELOG","doc":"* Various internal cleanup fixes from Andreas Stenius (github.com/kaos)","ref":"changelog.html#v1-0-3"},{"type":"extras","title":"v1.0.2 - CHANGELOG","doc":"* Added `elli_request:get_args_decoded/1` which returns the list of\n query args decoded each time it's called.","ref":"changelog.html#v1-0-2"},{"type":"extras","title":"v1.0.1 - CHANGELOG","doc":"* Fix bug in SSL acceptor pool where due to failed handshakes, Elli\n runs out of acceptors. Thanks to Stefan Grundmann.\n\n* In case a handler (or middleware) returns a response Elli does not\n understand, Elli will now respond with a 500 error. Thanks to\n Johannes Huning.\n\n* Added `elli_request:get_arg_decoded/2,3` which HTTP URI decodes the\n value passed in the request. Thanks to Mariano Valles.","ref":"changelog.html#v1-0-1"},{"type":"extras","title":"v1.0 - CHANGELOG","doc":"* SSL using built-in ssl from Erlang/OTP. Thanks to Maas-Maarten Zeeman.\n\n* \"Handover\" a socket to user code, making it possible to implement\n WebSockets( ).\n\n* Type fixes from Ingo Struck and Andreas Hasselberg.","ref":"changelog.html#v1-0"},{"type":"extras","title":"v0.4.1 - CHANGELOG","doc":"* Fix from Christian Lundgren for browsers that include spaces in the\n value of the Content-Length header.","ref":"changelog.html#v0-4-1"},{"type":"extras","title":"v0.4 - CHANGELOG","doc":"* Added support for sending ranges of a file with sendfile by\n returning `{Code, Headers, {file, Filename, {Offset, Length}}}`. If\n no offset and length is specified, the entire file is sent. The\n user must provide an appropriate \"Content-Length\" and\n \"Content-Range\" header, see the example in\n `elli_example_callback.erl`\n ( ).\n Thanks Vincent Siliakus (zambal).","ref":"changelog.html#v0-4"},{"type":"extras","title":"v0.3 - CHANGELOG","doc":"* Breaking change: Timeouts used in the HTTP protocol are now\n configurable. To implement this, changing a record and some\n callbacks was necessary. To upgrade, a restart of Elli is needed.\n\n* Elli now supports pipelining of any type of request. Some proxies\n or special clients (like ibrowse) will pipeline requests to reduce\n latency.\n\n* If there are no more file descriptors, Elli will shut down. This\n mimics the behaviour found in Yaws.\n\n* Chunked transfer responses will now exit the Elli process when the\n client closes the connection. Sending a synchronous chunk will\n return `{error, closed}` if client has closed the connection and\n the `chunk_complete` event is sent to your callback including which\n end closed the connection.","ref":"changelog.html#v0-3"},{"type":"extras","title":"v0.2.0 - CHANGELOG","doc":"* Breaking change: moved elli_access_log into a separate repository\n at github.com/wooga/elli_access_log. Thanks martinrehfeld.","ref":"changelog.html#v0-2-0"},{"type":"extras","title":"v0.1.3 - CHANGELOG","doc":"* Added elli_test which makes it easy to write unit tests for your\n callbacks. Thanks anha0825.\n\n* Added sendfile support. Thanks chrisavl.","ref":"changelog.html#v0-1-3"},{"type":"extras","title":"v0.1.2 - CHANGELOG","doc":"* Added option to specify listen IP address. Thanks hukl.","ref":"changelog.html#v0-1-2"},{"type":"extras","title":"v0.1.1 - CHANGELOG","doc":"* Don't look up the peer ip address on every request anymore, do it\n on demand using elli_request:peer/1.","ref":"changelog.html#v0-1-1"},{"type":"extras","title":"v0.1 - CHANGELOG","doc":"* Initial release.","ref":"changelog.html#v0-1"},{"type":"extras","title":"LICENSE","doc":"The MIT License\n\nCopyright (c) 2012-2016 Knut Nesheim\nCopyright (c) 2016-2018 elli-lib team\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\nall copies 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\nTHE SOFTWARE.","ref":"license.html"}],"content_type":"text/plain","producer":{"name":"ex_doc","version":[48,46,51,50,46,50]}} \ No newline at end of file diff --git a/doc/dist/sidebar_items-FF1D4582.js b/doc/dist/sidebar_items-FF1D4582.js deleted file mode 100644 index 1163f4b..0000000 --- a/doc/dist/sidebar_items-FF1D4582.js +++ /dev/null @@ -1 +0,0 @@ -sidebarNodes={"modules":[{"id":"elli","deprecated":false,"group":"","title":"elli","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"body/0","deprecated":false,"title":"body/0","anchor":"t:body/0"},{"id":"header/0","deprecated":false,"title":"header/0","anchor":"t:header/0"},{"id":"headers/0","deprecated":false,"title":"headers/0","anchor":"t:headers/0"},{"id":"http_method/0","deprecated":false,"title":"http_method/0","anchor":"t:http_method/0"},{"id":"req/0","deprecated":false,"title":"req/0","anchor":"t:req/0"},{"id":"response_code/0","deprecated":false,"title":"response_code/0","anchor":"t:response_code/0"},{"id":"state/0","deprecated":false,"title":"state/0","anchor":"t:state/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_acceptors/1","deprecated":false,"title":"get_acceptors(S)","anchor":"get_acceptors/1"},{"id":"get_open_reqs/1","deprecated":false,"title":"get_open_reqs(S)","anchor":"get_open_reqs/1"},{"id":"get_open_reqs/2","deprecated":false,"title":"get_open_reqs(S, Timeout)","anchor":"get_open_reqs/2"},{"id":"set_callback/3","deprecated":false,"title":"set_callback(S, Callback, CallbackArgs)","anchor":"set_callback/3"},{"id":"start_link/0","deprecated":false,"title":"start_link()","anchor":"start_link/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(Opts)","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(Server)","anchor":"stop/1"}],"key":"functions"}]},{"id":"elli_example_callback","deprecated":false,"group":"","title":"elli_example_callback","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"chunk_loop/1","deprecated":false,"title":"chunk_loop(Ref)","anchor":"chunk_loop/1"},{"id":"handle/2","deprecated":false,"title":"handle(Req, _Args)","anchor":"handle/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(Event, Args, Config)","anchor":"handle_event/3"}],"key":"functions"}]},{"id":"elli_example_callback_handover","deprecated":false,"group":"","title":"elli_example_callback_handover","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle/2","deprecated":false,"title":"handle(Req, Args)","anchor":"handle/2"},{"id":"init/2","deprecated":false,"title":"init(Req, Args)","anchor":"init/2"}],"key":"functions"}]},{"id":"elli_handler","deprecated":false,"group":"","title":"elli_handler","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"callback/0","deprecated":false,"title":"callback/0","anchor":"t:callback/0"},{"id":"callback_args/0","deprecated":false,"title":"callback_args/0","anchor":"t:callback_args/0"},{"id":"callback_mod/0","deprecated":false,"title":"callback_mod/0","anchor":"t:callback_mod/0"},{"id":"event/0","deprecated":false,"title":"event/0","anchor":"t:event/0"},{"id":"result/0","deprecated":false,"title":"result/0","anchor":"t:result/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"handle/2","deprecated":false,"title":"handle/2","anchor":"c:handle/2"},{"id":"handle_event/3","deprecated":false,"title":"handle_event/3","anchor":"c:handle_event/3"},{"id":"init/2","deprecated":false,"title":"init/2","anchor":"c:init/2"},{"id":"postprocess/3","deprecated":false,"title":"postprocess/3","anchor":"c:postprocess/3"},{"id":"preprocess/2","deprecated":false,"title":"preprocess/2","anchor":"c:preprocess/2"}],"key":"callbacks"}]},{"id":"elli_http","deprecated":false,"group":"","title":"elli_http","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"version/0","deprecated":false,"title":"version/0","anchor":"t:version/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"accept/4","deprecated":false,"title":"accept(Server, ListenSocket, Options, Callback)","anchor":"accept/4"},{"id":"chunk_loop/1","deprecated":false,"title":"chunk_loop(Socket)","anchor":"chunk_loop/1"},{"id":"close_or_keepalive/2","deprecated":false,"title":"close_or_keepalive(Req, Headers)","anchor":"close_or_keepalive/2"},{"id":"handle_request/4","deprecated":false,"title":"handle_request(Socket, PrevBin, Options, Callback)","anchor":"handle_request/4"},{"id":"keepalive_loop/3","deprecated":false,"title":"keepalive_loop(Socket, Options, Callback)","anchor":"keepalive_loop/3"},{"id":"keepalive_loop/5","deprecated":false,"title":"keepalive_loop(Socket, NumRequests, Buffer, Options, Callback)","anchor":"keepalive_loop/5"},{"id":"mk_req/8","deprecated":false,"title":"mk_req(Method, PathTuple, Headers, Headers, Body, V, Socket, Callback)","anchor":"mk_req/8"},{"id":"mk_req/11","deprecated":false,"title":"mk_req(Method, Scheme, Host, Port, PathTuple, Headers, ParsedHeaders, Body, V, Socket, Callback)","anchor":"mk_req/11"},{"id":"parse_path/1","deprecated":false,"title":"parse_path(_)","anchor":"parse_path/1"},{"id":"send_file/5","deprecated":false,"title":"send_file(Req, Code, Headers, Filename, Range)","anchor":"send_file/5"},{"id":"send_response/4","deprecated":false,"title":"send_response(Req, Code, Headers, UserBody)","anchor":"send_response/4"},{"id":"split_args/1","deprecated":false,"title":"split_args(Qs)","anchor":"split_args/1"},{"id":"start_link/4","deprecated":false,"title":"start_link(Server, ListenSocket, Options, Callback)","anchor":"start_link/4"}],"key":"functions"}]},{"id":"elli_middleware","deprecated":false,"group":"","title":"elli_middleware","sections":[]},{"id":"elli_middleware_compress","deprecated":false,"group":"","title":"elli_middleware_compress","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"postprocess/3","deprecated":false,"title":"postprocess(Req, Result, Config)","anchor":"postprocess/3"}],"key":"functions"}]},{"id":"elli_request","deprecated":false,"group":"","title":"elli_request","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"http_range/0","deprecated":false,"title":"http_range/0","anchor":"t:http_range/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"async_send_chunk/2","deprecated":false,"title":"async_send_chunk(Ref, Data)","anchor":"async_send_chunk/2"},{"id":"body/1","deprecated":false,"title":"body(Req)","anchor":"body/1"},{"id":"body_qs/1","deprecated":false,"title":"body_qs(Req)","anchor":"body_qs/1"},{"id":"chunk_ref/1","deprecated":false,"title":"chunk_ref(Req)","anchor":"chunk_ref/1"},{"id":"close_chunk/1","deprecated":false,"title":"close_chunk(Ref)","anchor":"close_chunk/1"},{"id":"get_arg/2","deprecated":false,"title":"get_arg(Key, Req)","anchor":"get_arg/2"},{"id":"get_arg/3","deprecated":false,"title":"get_arg(Key, Req, Default)","anchor":"get_arg/3"},{"id":"get_arg_decoded/2","deprecated":false,"title":"get_arg_decoded(Key, Req)","anchor":"get_arg_decoded/2"},{"id":"get_arg_decoded/3","deprecated":false,"title":"get_arg_decoded(Key, Req, Default)","anchor":"get_arg_decoded/3"},{"id":"get_args/1","deprecated":false,"title":"get_args(Req)","anchor":"get_args/1"},{"id":"get_args_decoded/1","deprecated":false,"title":"get_args_decoded(Req)","anchor":"get_args_decoded/1"},{"id":"get_header/2","deprecated":false,"title":"get_header(Key, Req)","anchor":"get_header/2"},{"id":"get_header/3","deprecated":false,"title":"get_header(Key, Req, Default)","anchor":"get_header/3"},{"id":"get_range/1","deprecated":false,"title":"get_range(Req)","anchor":"get_range/1"},{"id":"headers/1","deprecated":false,"title":"headers(Req)","anchor":"headers/1"},{"id":"host/1","deprecated":false,"title":"host(Req)","anchor":"host/1"},{"id":"is_request/1","deprecated":false,"title":"is_request(Req)","anchor":"is_request/1"},{"id":"method/1","deprecated":false,"title":"method(Req)","anchor":"method/1"},{"id":"original_headers/1","deprecated":false,"title":"original_headers(Req)","anchor":"original_headers/1"},{"id":"path/1","deprecated":false,"title":"path(Req)","anchor":"path/1"},{"id":"peer/1","deprecated":false,"title":"peer(Req)","anchor":"peer/1"},{"id":"port/1","deprecated":false,"title":"port(Req)","anchor":"port/1"},{"id":"post_arg/2","deprecated":false,"title":"post_arg(Key, Req)","anchor":"post_arg/2"},{"id":"post_arg/3","deprecated":false,"title":"post_arg(Key, Req, Default)","anchor":"post_arg/3"},{"id":"post_arg_decoded/2","deprecated":false,"title":"post_arg_decoded(Key, Req)","anchor":"post_arg_decoded/2"},{"id":"post_arg_decoded/3","deprecated":false,"title":"post_arg_decoded(Key, Req, Default)","anchor":"post_arg_decoded/3"},{"id":"post_args/1","deprecated":false,"title":"post_args(Req)","anchor":"post_args/1"},{"id":"post_args_decoded/1","deprecated":false,"title":"post_args_decoded(Req)","anchor":"post_args_decoded/1"},{"id":"query_str/1","deprecated":false,"title":"query_str(Req)","anchor":"query_str/1"},{"id":"raw_path/1","deprecated":false,"title":"raw_path(Req)","anchor":"raw_path/1"},{"id":"scheme/1","deprecated":false,"title":"scheme(Req)","anchor":"scheme/1"},{"id":"send_chunk/2","deprecated":false,"title":"send_chunk(Ref, Data)","anchor":"send_chunk/2"},{"id":"to_proplist/1","deprecated":false,"title":"to_proplist(Req)","anchor":"to_proplist/1"},{"id":"uri_decode/1","deprecated":false,"title":"uri_decode(Bin)","anchor":"uri_decode/1"}],"key":"functions"}]},{"id":"elli_sendfile","deprecated":false,"group":"","title":"elli_sendfile","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"sendfile_opts/0","deprecated":false,"title":"sendfile_opts/0","anchor":"t:sendfile_opts/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"sendfile/5","deprecated":false,"title":"sendfile(RawFile, Socket, Offset, Bytes, Opts)","anchor":"sendfile/5"}],"key":"functions"}]},{"id":"elli_tcp","deprecated":false,"group":"","title":"elli_tcp","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"socket/0","deprecated":false,"title":"socket/0","anchor":"t:socket/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"accept/3","deprecated":false,"title":"accept(_, Server, Timeout)","anchor":"accept/3"},{"id":"close/1","deprecated":false,"title":"close(_)","anchor":"close/1"},{"id":"listen/3","deprecated":false,"title":"listen(_, Port, Opts)","anchor":"listen/3"},{"id":"peername/1","deprecated":false,"title":"peername(_)","anchor":"peername/1"},{"id":"recv/3","deprecated":false,"title":"recv(_, Size, Timeout)","anchor":"recv/3"},{"id":"send/2","deprecated":false,"title":"send(_, Data)","anchor":"send/2"},{"id":"sendfile/5","deprecated":false,"title":"sendfile(Fd, _, Offset, Length, Opts)","anchor":"sendfile/5"},{"id":"setopts/2","deprecated":false,"title":"setopts(_, Opts)","anchor":"setopts/2"}],"key":"functions"}]},{"id":"elli_test","deprecated":false,"group":"","title":"elli_test","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/5","deprecated":false,"title":"call(Method, Path, Headers, Body, Opts)","anchor":"call/5"}],"key":"functions"}]},{"id":"elli_util","deprecated":false,"group":"","title":"elli_util","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"range/0","deprecated":false,"title":"range/0","anchor":"t:range/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"encode_range/2","deprecated":false,"title":"encode_range(Range, Size)","anchor":"encode_range/2"},{"id":"file_size/1","deprecated":false,"title":"file_size(Filename)","anchor":"file_size/1"},{"id":"normalize_range/2","deprecated":false,"title":"normalize_range(RangeOrSet, Size)","anchor":"normalize_range/2"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"}]},{"id":"readme","group":"","title":"Elli - Erlang web server for HTTP APIs","headers":[{"id":"Installation","anchor":"installation"},{"id":"Usage","anchor":"usage"},{"id":"Examples","anchor":"examples"},{"id":"Further reading","anchor":"further-reading"},{"id":"License","anchor":"license"}]},{"id":"overview","group":"","title":"Elli - Overview","headers":[{"id":"Features","anchor":"features"},{"id":"Extensions","anchor":"extensions"},{"id":"About","anchor":"about"},{"id":"Aren't there enough webservers in the Erlang community already?","anchor":"aren-t-there-enough-webservers-in-the-erlang-community-already"},{"id":"Why another webserver? Isn't this just the NIH syndrome?","anchor":"why-another-webserver-isn-t-this-just-the-nih-syndrome"},{"id":"What makes Elli different?","anchor":"what-makes-elli-different"},{"id":"Performance","anchor":"performance"}]},{"id":"changelog","group":"","title":"CHANGELOG","headers":[{"id":"pre-v4.0.0","anchor":"pre-v4-0-0"},{"id":"v3.3.0","anchor":"v3-3-0"},{"id":"v3.2.0","anchor":"v3-2-0"},{"id":"v3.1.0","anchor":"v3-1-0"},{"id":"v3.0.0","anchor":"v3-0-0"},{"id":"v2.1.2","anchor":"v2-1-2"},{"id":"v2.0.2","anchor":"v2-0-2"},{"id":"v2.0.1","anchor":"v2-0-1"},{"id":"v2.0.0","anchor":"v2-0-0"},{"id":"v1.0.5","anchor":"v1-0-5"},{"id":"v1.0.4","anchor":"v1-0-4"},{"id":"v1.0.3","anchor":"v1-0-3"},{"id":"v1.0.2","anchor":"v1-0-2"},{"id":"v1.0.1","anchor":"v1-0-1"},{"id":"v1.0","anchor":"v1-0"},{"id":"v0.4.1","anchor":"v0-4-1"},{"id":"v0.4","anchor":"v0-4"},{"id":"v0.3","anchor":"v0-3"},{"id":"v0.2.0","anchor":"v0-2-0"},{"id":"v0.1.3","anchor":"v0-1-3"},{"id":"v0.1.2","anchor":"v0-1-2"},{"id":"v0.1.1","anchor":"v0-1-1"},{"id":"v0.1","anchor":"v0-1"}]},{"id":"license","group":"","title":"LICENSE","headers":[]}],"tasks":[]} \ No newline at end of file diff --git a/doc/elli.epub b/doc/elli.epub deleted file mode 100644 index 0767cde738a98ac89ce0f3b043a03d9a49250197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48002 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 - - - - - - - - - - elli — elli v3.3.0 - - - - - - - - - - - - - - -

    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli - (elli v3.3.0) - -

    - - -
    -

    Elli acceptor manager

    This gen_server owns the listen socket and manages the processes accepting on that socket. When a process waiting for accept gets a request, it notifies this gen_server so we can start up another acceptor.

    -
    - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - body/0 - -
    - -

    A binary or iolist.

    - -
    - -
    -
    - header/0 - -
    - -
    - -
    -
    - headers/0 - -
    - -
    - -
    - - -

    An uppercase atom representing a known HTTP verb or a binary for other verbs.

    - -
    - -
    -
    - req/0 - -
    - -
    - -
    - - -
    - -
    -
    - state/0 - -
    - -

    Internal state.

    - -
    - -
    -
    -

    - Functions -

    - -
    - - -
    - -
    - - -
    - - - - - -
    -
    - start_link() - -
    - -

    Create an Elli server process as part of a supervision tree, using the default configuration. The same as start_link({callback, elli_example_callback}, {callback_args, []}).

    - -
    - -
    - - -
    - -
    -
    - stop(Server) - -
    - -

    Stop Server.

    - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    -type body() :: binary() | iolist().
    - -
    - -

    A binary or iolist.

    -
    -
    -
    - - - -
    - -
    - -
    -type header() :: {Key :: binary(), Value :: binary() | string()}.
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -type headers() :: [header()].
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -type http_method() :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | binary().
    - -
    - -

    An uppercase atom representing a known HTTP verb or a binary for other verbs.

    -
    -
    -
    - - - -
    - -
    - -
    -type req() ::
    -          #req{method :: elli:http_method(),
    -               scheme :: undefined | binary(),
    -               host :: undefined | binary(),
    -               port :: undefined | 1..65535,
    -               path :: [binary()],
    -               args :: [{binary(), any()}],
    -               raw_path :: binary(),
    -               version :: elli_http:version(),
    -               headers :: elli:headers(),
    -               original_headers :: elli:headers(),
    -               body :: elli:body(),
    -               pid :: pid(),
    -               socket :: undefined | elli_tcp:socket(),
    -               callback :: elli_handler:callback()}.
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -type response_code() :: 100..999.
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -opaque state()
    - -
    - -

    Internal state.

    -
    -
    - -
    -
    - -
    -

    - - - - Functions -

    -
    -
    - - - -
    - -
    - -
    -spec get_acceptors(atom()) -> {reply, {ok, [ets:tid()]}, state()}.
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -spec get_open_reqs(S :: atom()) -> {reply, {ok, non_neg_integer()}, state()}.
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_open_reqs(S, Timeout)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec get_open_reqs(S :: atom(), Timeout :: non_neg_integer()) -> Reply
    -                       when Reply :: {reply, {ok, non_neg_integer()}, state()}.
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    set_callback(S, Callback, CallbackArgs)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec set_callback(S, Callback, CallbackArgs) -> Reply
    -                      when
    -                          S :: atom(),
    -                          Callback :: elli_handler:callback_mod(),
    -                          CallbackArgs :: elli_handler:callback_args(),
    -                          Reply :: {reply, ok, state()}.
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -spec start_link() -> Result
    -                    when
    -                        Result :: {ok, Pid} | ignore | {error, Error},
    -                        Pid :: pid(),
    -                        Error :: {already_started, Pid} | term().
    - -
    - -

    Create an Elli server process as part of a supervision tree, using the default configuration. The same as start_link({callback, elli_example_callback}, {callback_args, []}).

    -
    -
    -
    - - - -
    - -
    - -
    -spec start_link(Opts) -> Result
    -                    when
    -                        Opts :: [{_, _}],
    -                        Result :: {ok, Pid} | ignore | {error, Error},
    -                        Pid :: pid(),
    -                        Error :: {already_started, Pid} | term().
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -spec stop(Server :: atom()) -> ok.
    - -
    - -

    Stop Server.

    -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_example_callback.html b/doc/elli_example_callback.html deleted file mode 100644 index 82c4faf..0000000 --- a/doc/elli_example_callback.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - - - - - - - elli_example_callback — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_example_callback - (elli v3.3.0) - -

    - - -
    -

    Elli example callback

    Your callback needs to implement two functions, handle/2 and handle_event/3. For every request, Elli will call your handle function with the request. When an event happens, like Elli completed a request, there was a parsing error or your handler threw an error, handle_event/3 is called.

    -
    - -
    - -
    -

    - - - - Summary -

    -
    -

    - Functions -

    - -
    - - -

    Send 10 separate chunks to the client. The same as chunk_loop(Ref, 10)

    - -
    - -
    - - -

    Handle a Request. Delegate to our handler function. See handle/3

    - -
    - -
    - - -

    Handle Elli events, fired throughout processing a request.

    - -
    - -
    - -
    - - -
    -

    - - - - Functions -

    -
    -
    - - - -
    - -

    Send 10 separate chunks to the client. The same as chunk_loop(Ref, 10)

    -
    -
    -
    - -
    - - - Link to this function - -

    handle(Req, _Args)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec handle(Req, _Args) -> Result
    -                when
    -                    Req :: elli:req(),
    -                    _Args :: elli_handler:callback_args(),
    -                    Result :: elli_handler:result().
    - -
    - -

    Handle a Request. Delegate to our handler function. See handle/3

    -
    -
    -
    - -
    - - - Link to this function - -

    handle_event(Event, Args, Config)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec handle_event(Event, Args, Config) -> ok
    -                      when
    -                          Event :: elli_handler:event(),
    -                          Args :: elli_handler:callback_args(),
    -                          Config :: [tuple()].
    - -
    - -

    Handle Elli events, fired throughout processing a request.

    elli_startup is sent when Elli is starting up. If you are implementing a middleware, you can use it to spawn processes, create ETS tables or start supervised processes in a supervisor tree.

    request_complete fires *after* Elli has sent the response to the client. Timings contains timestamps (native units) of events like when the connection was accepted, when headers/body parsing finished, when the user callback returns, response sent, etc. Sizes contains response sizes like response headers size, response body or file size. This allows you to collect performance statistics for monitoring your app.

    request_throw, request_error and request_exit events are sent if the user callback code throws an exception, has an error or exits. After triggering this event, a generated response is sent to the user.

    invalid_return is sent if the user callback code returns a term not understood by elli, see elli_http:execute_callback/1. After triggering this event, a generated response is sent to the user.

    chunk_complete fires when a chunked response is completely sent. It's identical to the request_complete event, except instead of the response body you get the atom client or server depending on who closed the connection. Sizes will have the key chunks, which is the total size of all chunks plus encoding overhead.

    request_closed is sent if the client closes the connection when Elli is waiting for the next request on a keep alive connection.

    request_timeout is sent if the client times out when Elli is waiting for the request.

    request_parse_error fires if the request is invalid and cannot be parsed by [erlang:decode_packet/3][decode_packet/3] or it contains a path Elli cannot parse or does not support.

    [decode_packet/3]: http://erlang.org/doc/man/erlang.html#decode_packet-3

    client_closed can be sent from multiple parts of the request handling. It's sent when the client closes the connection or if for any reason the socket is closed unexpectedly. The Where atom tells you in which part of the request processing the closed socket was detected: receiving_headers, receiving_body or before_response.

    client_timeout can as with client_closed be sent from multiple parts of the request handling. If Elli tries to receive data from the client socket and does not receive anything within a timeout, this event fires and the socket is closed.

    bad_request is sent when Elli detects a request is not well formatted or does not conform to the configured limits. Currently the Reason variable can be {too_many_headers, Headers} or {body_size, ContentLength}.

    file_error is sent when the user wants to return a file as a response, but for some reason it cannot be opened.

    -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_example_callback_handover.html b/doc/elli_example_callback_handover.html deleted file mode 100644 index 1764d19..0000000 --- a/doc/elli_example_callback_handover.html +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - - - - - - elli_example_callback_handover — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_example_callback_handover - (elli v3.3.0) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Functions -

    - -
    - - -
    - -
    - - -

    Return {ok, handover} if Req's path is /hello/world, otherwise ignore.

    - -
    - -
    - -
    - - -
    -

    - - - - Functions -

    -
    -
    - - - -
    - -
    - -
    -spec handle(Req, Args) -> Result
    -                when
    -                    Req :: elli:req(),
    -                    Args :: elli_handler:callback_args(),
    -                    Result :: elli_handler:result().
    - -
    - - -
    -
    -
    - - - -
    - -

    Return {ok, handover} if Req's path is /hello/world, otherwise ignore.

    -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_handler.html b/doc/elli_handler.html deleted file mode 100644 index 00ba47a..0000000 --- a/doc/elli_handler.html +++ /dev/null @@ -1,601 +0,0 @@ - - - - - - - - - - - elli_handler — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_handler behaviour - (elli v3.3.0) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - callback/0 - -
    - -

    A tuple of a t:callback_mod() and t:callback_args().

    - -
    - -
    - - -

    Arguments to pass to a t:callback_mod()

    - -
    - -
    - - -

    A callback module.

    - -
    - -
    -
    - event/0 - -
    - -

    Fired throughout processing a request. See elli_example_callback:handle_event/3 for descriptions.

    - -
    - -
    -
    - result/0 - -
    - -
    - -
    -
    -

    - Callbacks -

    - -
    -
    - handle/2 - -
    - -
    - -
    - - -
    - -
    -
    - init/2 - -
    - -
    - -
    - - -
    - -
    -
    - preprocess/2 - -
    - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    -type callback() :: {callback_mod(), callback_args()}.
    - -
    - -

    A tuple of a t:callback_mod() and t:callback_args().

    -
    -
    -
    - - - -
    - -
    - -
    -type callback_args() :: list().
    - -
    - -

    Arguments to pass to a t:callback_mod()

    -
    -
    -
    - - - -
    - -
    - -
    -type callback_mod() :: module().
    - -
    - -

    A callback module.

    -
    -
    -
    - - - -
    - -
    - -
    -type event() ::
    -          elli_startup | bad_request | file_error | chunk_complete | request_complete | request_throw |
    -          request_error | request_exit | request_closed | request_parse_error | client_closed |
    -          client_timeout | invalid_return.
    - -
    - -

    Fired throughout processing a request. See elli_example_callback:handle_event/3 for descriptions.

    -
    -
    -
    - - - -
    - -
    - -
    -type result() ::
    -          {elli:response_code() | ok,
    -           elli:headers(),
    -           {file, file:name_all()} | {file, file:name_all(), elli_util:range()}} |
    -          {elli:response_code() | ok, elli:headers(), elli:body()} |
    -          {elli:response_code() | ok, elli:body()} |
    -          {chunk, elli:headers()} |
    -          {chunk, elli:headers(), elli:body()} |
    -          ignore.
    - -
    - - -
    -
    - -
    -
    - -
    -

    - - - - Callbacks -

    -
    -
    - - - -
    - -
    - -
    -callback handle(Req :: elli:req(), callback_args()) -> result().
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -callback handle_event(Event, Args, Config) -> ok
    -                          when Event :: event(), Args :: callback_args(), Config :: [tuple()].
    - -
    - - -
    -
    -
    - -
    - - - Link to this callback - -

    init/2

    - - - - View Source - - - - (optional) - -
    - -
    - -
    - -
    -callback init(Req, Args) -> {ok, standard | handover} when Req :: elli:req(), Args :: callback_args().
    - -
    - - -
    -
    -
    - -
    - - - Link to this callback - -

    postprocess/3

    - - - - View Source - - - - (optional) - -
    - -
    - -
    - -
    -callback postprocess(Req, Res1, Args) -> Res2
    -                         when Req :: elli:req(), Res1 :: result(), Args :: callback_args(), Res2 :: result().
    - -
    - - -
    -
    -
    - -
    - - - Link to this callback - -

    preprocess/2

    - - - - View Source - - - - (optional) - -
    - -
    - -
    - -
    -callback preprocess(Req1, Args) -> Req2
    -                        when Req1 :: elli:req(), Args :: callback_args(), Req2 :: elli:req().
    - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_http.html b/doc/elli_http.html deleted file mode 100644 index 105bb96..0000000 --- a/doc/elli_http.html +++ /dev/null @@ -1,736 +0,0 @@ - - - - - - - - - - - elli_http — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_http - (elli v3.3.0) - -

    - - -
    -

    Elli HTTP request implementation

    An elli_http process blocks in elli_tcp:accept/3 until a client connects. It then handles requests on that connection until it's closed either by the client timing out or explicitly by the user.

    -
    - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - version/0 - -
    - -

    HTTP version as a tuple, i.e. {0, 9} | {1, 0} | {1, 1}.

    - -
    - -
    -
    -

    - Functions -

    - -
    - - -

    Accept on the socket until a client connects. Handle the request, then loop if we're using keep alive or chunked transfer. If elli_tcp:accept/3 doesn't return a socket within a configurable timeout, loop to allow code upgrades of this module.

    - -
    - -
    - - -
    - -
    - - -

    Return the preferred session handling setting to close or keep the current session alive based on the presence of a header or the standard default based on the version of HTTP of the request.

    - -
    - -
    - - -

    Handle a HTTP request that will possibly come on the socket. Returns the appropriate connection token and any buffer containing (parts of) the next request.

    - -
    - -
    - - -

    Handle multiple requests on the same connection, i.e. "keep alive".

    - -
    - - - - - - - -
    - - -
    - -
    - - -

    Send a HTTP response to the client where the body is the contents of the given file. Assumes correctly set response code and headers.

    - -
    - -
    - - -

    Generate a HTTP response and send it to the client.

    - -
    - -
    - - -

    Split the URL arguments into a proplist. Lifted from cowboy_http:x_www_form_urlencoded/2.

    - -
    - - - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    -type version() :: {0, 9} | {1, 0} | {1, 1}.
    - -
    - -

    HTTP version as a tuple, i.e. {0, 9} | {1, 0} | {1, 1}.

    -
    -
    - -
    -
    - -
    -

    - - - - Functions -

    -
    -
    - -
    - - - Link to this function - -

    accept(Server, ListenSocket, Options, Callback)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec accept(Server, ListenSocket, Options, Callback) -> ok
    -                when
    -                    Server :: pid(),
    -                    ListenSocket :: elli_tcp:socket(),
    -                    Options :: proplists:proplist(),
    -                    Callback :: elli_handler:callback().
    - -
    - -

    Accept on the socket until a client connects. Handle the request, then loop if we're using keep alive or chunked transfer. If elli_tcp:accept/3 doesn't return a socket within a configurable timeout, loop to allow code upgrades of this module.

    -
    -
    -
    - -
    - - - Link to this function - -

    chunk_loop(Socket)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    close_or_keepalive(Req, Headers)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec close_or_keepalive(Req, Headers) -> KeepaliveOpt
    -                            when
    -                                Req :: elli:req(),
    -                                Headers :: elli:headers(),
    -                                KeepaliveOpt :: close | keep_alive.
    - -
    - -

    Return the preferred session handling setting to close or keep the current session alive based on the presence of a header or the standard default based on the version of HTTP of the request.

    -
    -
    -
    - -
    - - - Link to this function - -

    handle_request(Socket, PrevBin, Options, Callback)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec handle_request(Socket, PrevBin, Options, Callback) -> ConnToken
    -                        when
    -                            Socket :: elli_tcp:socket(),
    -                            PrevBin :: binary(),
    -                            Options :: proplists:proplist(),
    -                            Callback :: elli_handler:callback(),
    -                            ConnToken :: {keep_alive | close, binary()}.
    - -
    - -

    Handle a HTTP request that will possibly come on the socket. Returns the appropriate connection token and any buffer containing (parts of) the next request.

    -
    -
    -
    - -
    - - - Link to this function - -

    keepalive_loop(Socket, Options, Callback)

    - - - - View Source - - - -
    - -
    - -

    Handle multiple requests on the same connection, i.e. "keep alive".

    -
    -
    -
    - -
    - - - Link to this function - -

    keepalive_loop(Socket, NumRequests, Buffer, Options, Callback)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    mk_req(Method, PathTuple, Headers, Headers, Body, V, Socket, Callback)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec mk_req(Method, PathTuple, Headers, Headers, Body, V, Socket, Callback) -> Req
    -                when
    -                    Method :: elli:http_method(),
    -                    PathTuple :: {PathType :: atom(), RawPath :: binary()},
    -                    Headers :: elli:headers(),
    -                    Body :: elli:body(),
    -                    V :: version(),
    -                    Socket :: elli_tcp:socket() | undefined,
    -                    Callback :: elli_handler:callback(),
    -                    Req :: elli:req().
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    mk_req(Method, Scheme, Host, Port, PathTuple, Headers, ParsedHeaders, Body, V, Socket, Callback)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    send_file(Req, Code, Headers, Filename, Range)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec send_file(Req, Code, Headers, Filename, Range) -> ok
    -                   when
    -                       Req :: elli:req(),
    -                       Code :: elli:response_code(),
    -                       Headers :: elli:headers(),
    -                       Filename :: file:filename(),
    -                       Range :: elli_util:range().
    - -
    - -

    Send a HTTP response to the client where the body is the contents of the given file. Assumes correctly set response code and headers.

    -
    -
    -
    - -
    - - - Link to this function - -

    send_response(Req, Code, Headers, UserBody)

    - - - - View Source - - - -
    - -
    - -

    Generate a HTTP response and send it to the client.

    -
    -
    -
    - - - -
    - -
    - -
    -spec split_args(binary()) -> [{binary(), binary() | true}].
    - -
    - -

    Split the URL arguments into a proplist. Lifted from cowboy_http:x_www_form_urlencoded/2.

    -
    -
    -
    - -
    - - - Link to this function - -

    start_link(Server, ListenSocket, Options, Callback)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec start_link(Server, ListenSocket, Options, Callback) -> pid()
    -                    when
    -                        Server :: pid(),
    -                        ListenSocket :: elli_tcp:socket(),
    -                        Options :: proplists:proplist(),
    -                        Callback :: elli_handler:callback().
    - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_middleware.html b/doc/elli_middleware.html deleted file mode 100644 index 2f545dd..0000000 --- a/doc/elli_middleware.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - elli_middleware — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_middleware - (elli v3.3.0) - -

    - - -
    -

    HTTP request processing middleware.

    This module offers both pre-processing of requests and post-processing of responses. It can also be used to allow multiple handlers, where the first handler to return a response short-circuits the request. It is implemented as a plain elli handler.

    Usage:

       Config = [
    -             {mods, [
    -                     {elli_example_middleware, []},
    -                     {elli_middleware_compress, []},
    -                     {elli_example_callback, []}
    -                    ]}
    -            ],
    -   elli:start_link([
    -                    %% ...,
    -                    {callback, elli_middleware},
    -                    {callback_args, Config}
    -                   ]).

    The configured modules may implement the elli behaviour, in which case all the callbacks will be used as normal. If link handle/2 returns ignore, elli will continue on to the next callback in the list.

    Pre-processing and post-processing is implemented in preprocess/2 and postprocess/3. preprocess/2 is called for each middleware in the order specified, while postprocess/3 is called in the reverse order.

    -
    - -
    - - - -
    -
    -
    - - - - diff --git a/doc/elli_middleware_compress.html b/doc/elli_middleware_compress.html deleted file mode 100644 index cbd4d7a..0000000 --- a/doc/elli_middleware_compress.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - - - - - elli_middleware_compress — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_middleware_compress - (elli v3.3.0) - -

    - - -
    -

    Response compression as Elli middleware.

    -
    - -
    - -
    -

    - - - - Summary -

    -
    -

    - Functions -

    - -
    - - -

    Postprocess all requests and compress bodies larger than compress_byte_size (1024 by default).

    - -
    - -
    - -
    - - -
    -

    - - - - Functions -

    -
    -
    - -
    - - - Link to this function - -

    postprocess(Req, Result, Config)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec postprocess(Req, Result, Config) -> Result
    -                     when
    -                         Req :: elli:req(),
    -                         Result :: elli_handler:result(),
    -                         Config :: [{compress_byte_size, non_neg_integer()} | tuple()].
    - -
    - -

    Postprocess all requests and compress bodies larger than compress_byte_size (1024 by default).

    -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_request.html b/doc/elli_request.html deleted file mode 100644 index 8d3729e..0000000 --- a/doc/elli_request.html +++ /dev/null @@ -1,1326 +0,0 @@ - - - - - - - - - - - elli_request — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_request - (elli v3.3.0) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - http_range/0 - -
    - -
    - -
    -
    -

    - Functions -

    - -
    - - -

    Send a chunk asynchronously.

    - -
    - -
    -
    - body(Req) - -
    - -

    Return the body.

    - -
    - -
    -
    - body_qs(Req) - -
    - -

    Parse application/x-www-form-urlencoded body into a proplist.

    - -
    - -
    - - -

    Return a reference that can be used to send chunks to the client. If the protocol does not support it, return {error, not_supported}.

    - -
    - -
    - - -

    Explicitly close the chunked connection. Return {error, closed} if the client already closed the connection. The same as send_chunk(Ref, close)

    - -
    - -
    - - -
    - - - - - - - -
    - - -

    Return a proplist of keys and values of the original query string. Both keys and values in the returned proplists will be binaries or the atom true in case no value was supplied for the query value.

    - -
    - -
    - - -
    - -
    - - -
    - - - -
    - - -

    Parse the Range header from the request. The result is either a [http_range()] or the atom parse_error. Use elli_util:normalize_range/2 to get a validated, normalized range.

    - -
    - -
    -
    - headers(Req) - -
    - -

    Return the headers that have had string:casefold/1 run on each key.

    - -
    - -
    -
    - host(Req) - -
    - -

    Return the host.

    - -
    - -
    - - -
    - -
    -
    - method(Req) - -
    - -

    Return the method.

    - -
    - -
    - - -

    Return the original headers.

    - -
    - -
    -
    - path(Req) - -
    - -

    Return path split into binary parts.

    - -
    - -
    -
    - peer(Req) - -
    - -
    - -
    -
    - port(Req) - -
    - -

    Return the port.

    - -
    - -
    - - -
    - - - - - - - -
    - - -
    - - - -
    - - -

    Calculate the query string associated with a given Request as a binary.

    - -
    - -
    - - -

    Return the raw_path, i.e. not split or parsed for query params.

    - -
    - -
    -
    - scheme(Req) - -
    - -

    Return the scheme.

    - -
    - -
    - - -

    Send a chunk synchronously. If the referenced process is dead, return early with {error, closed}, instead of timing out.

    - -
    - -
    - - -

    Serialize the Request record to a proplist. Useful for logging.

    - -
    - -
    - - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    -type http_range() ::
    -          {First :: non_neg_integer(), Last :: non_neg_integer()} |
    -          {offset, Offset :: non_neg_integer()} |
    -          {suffix, Length :: pos_integer()}.
    - -
    - - -
    -
    - -
    -
    - -
    -

    - - - - Functions -

    -
    -
    - -
    - - - Link to this function - -

    async_send_chunk(Ref, Data)

    - - - - View Source - - - -
    - -
    - -

    Send a chunk asynchronously.

    -
    -
    -
    - - - -
    - -

    Return the body.

    -
    -
    -
    - - - -
    - -

    Parse application/x-www-form-urlencoded body into a proplist.

    -
    -
    -
    - - - -
    - -

    Return a reference that can be used to send chunks to the client. If the protocol does not support it, return {error, not_supported}.

    -
    -
    -
    - - - -
    - -

    Explicitly close the chunked connection. Return {error, closed} if the client already closed the connection. The same as send_chunk(Ref, close)

    -
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_arg(Key, Req, Default)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_arg_decoded(Key, Req)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_arg_decoded(Key, Req, Default)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -spec get_args(elli:req()) -> QueryArgs :: proplists:proplist().
    - -
    - -

    Return a proplist of keys and values of the original query string. Both keys and values in the returned proplists will be binaries or the atom true in case no value was supplied for the query value.

    -
    -
    -
    - -
    - - - Link to this function - -

    get_args_decoded(Req)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_header(Key, Req)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    get_header(Key, Req, Default)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -spec get_range(elli:req()) -> [http_range()] | parse_error.
    - -
    - -

    Parse the Range header from the request. The result is either a [http_range()] or the atom parse_error. Use elli_util:normalize_range/2 to get a validated, normalized range.

    -
    -
    -
    - - - -
    - -

    Return the headers that have had string:casefold/1 run on each key.

    -
    -
    -
    - - - -
    - -

    Return the host.

    -
    -
    -
    - - - -
    - - -
    -
    -
    - - - -
    - -

    Return the method.

    -
    -
    -
    - -
    - - - Link to this function - -

    original_headers(Req)

    - - - - View Source - - - -
    - -
    - -

    Return the original headers.

    -
    -
    -
    - - - -
    - -

    Return path split into binary parts.

    -
    -
    -
    - - - -
    - - -
    -
    -
    - - - -
    - -

    Return the port.

    -
    -
    -
    - -
    - - - Link to this function - -

    post_arg(Key, Req)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    post_arg(Key, Req, Default)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    post_arg_decoded(Key, Req)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    post_arg_decoded(Key, Req, Default)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    post_args_decoded(Req)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - -
    - -
    -spec query_str(elli:req()) -> QueryStr :: binary().
    - -
    - -

    Calculate the query string associated with a given Request as a binary.

    -
    -
    -
    - - - -
    - -

    Return the raw_path, i.e. not split or parsed for query params.

    -
    -
    -
    - - - -
    - -

    Return the scheme.

    -
    -
    -
    - -
    - - - Link to this function - -

    send_chunk(Ref, Data)

    - - - - View Source - - - -
    - -
    - -

    Send a chunk synchronously. If the referenced process is dead, return early with {error, closed}, instead of timing out.

    -
    -
    -
    - - - -
    - -

    Serialize the Request record to a proplist. Useful for logging.

    -
    -
    -
    - - - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_sendfile.html b/doc/elli_sendfile.html deleted file mode 100644 index f4a094c..0000000 --- a/doc/elli_sendfile.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - elli_sendfile — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_sendfile - (elli v3.3.0) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    - - -
    - -
    -
    -

    - Functions -

    - -
    - - -

    Send part of a file on a socket.

    - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    -type sendfile_opts() :: [{chunk_size, non_neg_integer()}].
    - -
    - - -
    -
    - -
    -
    - -
    -

    - - - - Functions -

    -
    -
    - -
    - - - Link to this function - -

    sendfile(RawFile, Socket, Offset, Bytes, Opts)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec sendfile(file:fd(),
    -               inet:socket() | ssl:sslsocket(),
    -               non_neg_integer(),
    -               non_neg_integer(),
    -               sendfile_opts()) ->
    -                  {ok, non_neg_integer()} | {error, atom()}.
    - -
    - -

    Send part of a file on a socket.

    Basically, see file:sendfile/5 but for ssl (i.e. not raw OS sockets). Originally from https://github.com/ninenines/ranch/pull/41/files

    -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_tcp.html b/doc/elli_tcp.html deleted file mode 100644 index e60cda7..0000000 --- a/doc/elli_tcp.html +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - - - - - - elli_tcp — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_tcp - (elli v3.3.0) - -

    - - -
    -

    Wrapper for plain and SSL sockets. Based on mochiweb_socket.erl.

    -
    - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - socket/0 - -
    - -
    - -
    -
    -

    - Functions -

    - - - -
    -
    - close(_) - -
    - -
    - -
    - - -
    - -
    -
    - peername(_) - -
    - -
    - - - -
    - - -
    - - - -
    - - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    -type socket() :: {plain, inet:socket()} | {ssl, ssl:sslsocket()}.
    - -
    - - -
    -
    - -
    -
    - -
    -

    - - - - Functions -

    -
    -
    - -
    - - - Link to this function - -

    accept(_, Server, Timeout)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    listen(_, Port, Opts)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    recv(_, Size, Timeout)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - - -
    -
    -
    - -
    - - - Link to this function - -

    sendfile(Fd, _, Offset, Length, Opts)

    - - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_test.html b/doc/elli_test.html deleted file mode 100644 index d4ee004..0000000 --- a/doc/elli_test.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - - - - - elli_test — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_test - (elli v3.3.0) - -

    - - -
    -

    Helper for calling your Elli callback in unit tests. Only the callback specified is actually run. Elli's response handling is not used, so the headers will for example not include a content length and the return format is not standardized. The unit tests below test elli_example_callback.

    -
    - -
    - -
    -

    - - - - Summary -

    - - -
    - - -
    -

    - - - - Functions -

    -
    -
    - -
    - - - Link to this function - -

    call(Method, Path, Headers, Body, Opts)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec call(Method, Path, Headers, Body, Opts) -> elli_handler:result()
    -              when
    -                  Method :: elli:http_method(),
    -                  Path :: binary(),
    -                  Headers :: elli:headers(),
    -                  Body :: elli:body(),
    -                  Opts :: proplists:proplist().
    - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/elli_util.html b/doc/elli_util.html deleted file mode 100644 index c329d84..0000000 --- a/doc/elli_util.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - - - - - elli_util — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - elli_util - (elli v3.3.0) - -

    - - -
    - -
    -

    - - - - Summary -

    -
    -

    - Types -

    - -
    -
    - range/0 - -
    - -
    - -
    -
    -

    - Functions -

    - -
    - - -

    Encode Range to a Content-Range value.

    - -
    - -
    - - -

    Get the size, in bytes, of the file.

    - -
    - -
    - - -

    If a valid byte-range, or byte-range-set of size 1, is supplied, returns a normalized range in the format {Offset, Length}. Returns undefined when an empty byte-range-set is supplied and the atom invalid_range in all other cases.

    - -
    - -
    - -
    - - -
    -

    - - - - Types -

    -
    -
    - - - -
    - -
    - -
    -type range() :: {Offset :: non_neg_integer(), Length :: non_neg_integer()}.
    - -
    - - -
    -
    - -
    -
    - -
    -

    - - - - Functions -

    -
    -
    - -
    - - - Link to this function - -

    encode_range(Range, Size)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec encode_range(Range :: range() | invalid_range, Size :: non_neg_integer()) -> ByteRange :: iolist().
    - -
    - -

    Encode Range to a Content-Range value.

    -
    -
    -
    - -
    - - - Link to this function - -

    file_size(Filename)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec file_size(Filename) -> Size | {error, Reason}
    -                   when
    -                       Filename :: file:name_all(),
    -                       Size :: non_neg_integer(),
    -                       Reason :: file:posix() | badarg | invalid_file.
    - -
    - -

    Get the size, in bytes, of the file.

    -
    -
    -
    - -
    - - - Link to this function - -

    normalize_range(RangeOrSet, Size)

    - - - - View Source - - - -
    - -
    - -
    - -
    -spec normalize_range(RangeOrSet, Size) -> Normalized
    -                         when
    -                             RangeOrSet :: any(),
    -                             Size :: integer(),
    -                             Normalized :: range() | undefined | invalid_range.
    - -
    - -

    If a valid byte-range, or byte-range-set of size 1, is supplied, returns a normalized range in the format {Offset, Length}. Returns undefined when an empty byte-range-set is supplied and the atom invalid_range in all other cases.

    -
    -
    - -
    -
    - - -
    -
    -
    - - - - diff --git a/doc/index.html b/doc/index.html deleted file mode 100644 index e009ec8..0000000 --- a/doc/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - elli v3.3.0 — Documentation - - - - - diff --git a/doc/license.html b/doc/license.html deleted file mode 100644 index 2f10025..0000000 --- a/doc/license.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - LICENSE — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - - LICENSE -

    - -
    -The MIT License
    -
    -Copyright (c) 2012-2016 Knut Nesheim
    -Copyright (c) 2016-2018 elli-lib team
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in
    -all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    -THE SOFTWARE.
    -
    -
    - - - -
    -
    -
    - - - - diff --git a/doc/overview.html b/doc/overview.html deleted file mode 100644 index dfe387b..0000000 --- a/doc/overview.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - - - - - Elli - Overview — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - - Elli - Overview -

    - -

    Copyright (c) 2012-2016 Knut Nesheim, 2016-2018 elli-lib team

    Version: 3.3.0

    Authors: Knut Nesheim, elli-lib team.

    Erlang web server for HTTP APIs

    - - - - Features -

    -

    Here's the features Elli does have:

    • Rack-style request-response. Your handler function gets a - complete request and returns a complete response. There's no - messaging, no receiving data directly from the socket, no writing - responses directly to the socket. It's a very simple and - straightforward API. Have a look at elli_example_callback -for examples.

    • Middlewares allow you to add useful features like compression, -encoding, stats, but only have it used when needed. No features you -don't use on the critical path.

    • Short-circuiting of responses using exceptions, allows you to use - "assertions" that return for example 403 permission - denied. is_allowed(Req) orelse throw({403, [], <<"Permission denied">>}).

    • Every client connection gets its own process, isolating the failure -of a request from another. For the duration of the connection, only -one process is involved, resulting in very robust and efficient -code.

    • Binaries everywhere for strings.

    • Instrumentation inside the core of the webserver, triggering user - callbacks. For example when a request completes, the user callback - gets the request_complete event which contains timings of all the -different parts of handling a request. There's also events for -clients unexpectedly closing a connection, crashes in the user -callback, etc.

    • Keep alive, using one Erlang process per connection only active -when there is a request from the client. Number of connections is -only limited by RAM and CPU.

    • Chunked transfer in responses for real-time push to clients

    • Basic pipelining. HTTP verbs that does not have side-effects(GET - and HEAD) can be pipelined, ie. a client supporting pipelining -can send multiple requests down the line and expect the responses -to appear in the same order as requests. Elli processes the -requests one at a time in order, future work could make it possible -to process them in parallel.

    • SSL using built-in Erlang/OTP ssl, nice for low volume admin -interfaces, etc. For high volume, you should probably go with -nginx, stunnel or ELB if you're on AWS.

    • Implement your own connection handling, for WebSockets, streaming - uploads, etc. See elli_example_callback_handover.

    - - - - Extensions -

    -

    Here's some ready-to-use extensions for Elli.

    You can also find a more complete list at https://github.com/elli-lib.

    - - - - About -

    -

    From operating and debugging high-volume, low-latency apps we have -gained some valuable insight into what we want from a webserver. We -want simplicity, robustness, performance, ease of debugging, -visibility into strange client behaviour, really good instrumentation -and good tests. We are willing to sacrifice almost everything, even -basic features to achieve this.

    With this in mind we looked at the big names in the Erlang -community: Yaws, Mochiweb, Misultin and Cowboy. We -found Mochiweb to be the best match. However, we also wanted to -see if we could take the architecture of Mochiweb and improve on -it. Elli takes the acceptor-turns-into-request-handler idea found -in Mochiweb, the binaries-only idea from Cowboy and the -request-response idea from WSGI/Rack (with chunked transfer -being an exception).

    On top of this we built a handler that allows us to write HTTP -middleware modules to add practical features, like compression of -responses, HTTP access log with timings, a real-time statistics -dashboard and chaining multiple request handlers.

    - - - - Aren't there enough webservers in the Erlang community already? -

    -

    There are a few very mature and robust projects with steady -development, one recently ceased development and one new kid on the -block with lots of interest. As Elli is not a general purpose -webserver, but more of a specialized tool, we believe it has a very -different target audience and would not attract effort or users away -from the big names.

    - - - - Why another webserver? Isn't this just the NIH syndrome? -

    -

    Yaws, Mochiweb, Misultin, and Cowboy are great -projects, hardened over time and full of very useful features for web -development. If you value developer productivity, Yaws is an -excellent choice. If you want a fast and lightweight -server, Mochiweb and Cowboy are excellent choices.

    Having used and studied all of these projects, we believed that if we -merged some of the existing ideas and added some ideas from other -communities, we could create a core that was better for our use cases.

    It started out as an experiment to see if it is at all possible to -significantly improve and it turns out that for our particular use -cases, there is enough improvement to warrant a new project.

    - - - - What makes Elli different? -

    -

    Elli has a very simple architecture. It avoids using more processes -and messages than absolutely necessary. It uses binaries for -strings. The request-response programming model allows middlewares to -do much heavy lifting, so the core can stay very simple. It has been -instrumented so as a user you can understand where time is spent. When -things go wrong, like the client closed the connection before you -could send a response, you are notified about these things so you can -better understand your client behaviour.

    - - - - Performance -

    -

    "Hello World!" micro-benchmarks are really useful when measuring the -performance of the webserver itself, but the numbers usually do more -harm than good when released. I encourage you to run your own -benchmarks, on your own hardware. Mark Nottingham has some -very good pointers -about benchmarking HTTP servers.

    -
    - - - -
    -
    -
    - - - - diff --git a/doc/readme.html b/doc/readme.html deleted file mode 100644 index 14c8054..0000000 --- a/doc/readme.html +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - - - - Elli - Erlang web server for HTTP APIs — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - -
    -

    - - - - View Source - - - - Elli - Erlang web server for HTTP APIs -

    - -

    Hex.pm -Documentation -Erlang -Common Test -Coverage Status -MIT License

    Elli is a webserver you can run inside your Erlang application to -expose an HTTP API. It is aimed exclusively at building -high-throughput, low-latency HTTP APIs. If robustness and performance -is more important to you than general purpose features, then Elli might be -for you. If you find yourself digging into the implementation of a -webserver, then Elli might be for you. If you're building web services, -not web sites, then Elli might be for you.

    Elli requires OTP 20.0 or newer.

    - - - - Installation -

    -

    Add elli to your application as a dependency to your -rebar.config:

    {deps, [
    -  {elli, "3.3.0"}
    -]}.

    Afterwards, to compile it, you can run:

    rebar3 compile
    -

    - - - - Usage -

    -

    To boot Elli inside an Erlang shell, run:

    rebar3 shell
    -
    %% starting elli
    -1> {ok, Pid} = elli:start_link([{callback, elli_example_callback}, {port, 3000}]).

    - - - - Examples -

    -

    - - - - Callback Module -

    -

    The best source to learn how to write a callback module -is elli_example_callback. -There are also a bunch -of examples used in the tests as well as descriptions of all the events.

    A minimal callback module looks something like this:

    -module(elli_minimal_callback).
    --behaviour(elli_handler).
    -
    --include_lib("elli/include/elli.hrl").
    -
    --export([handle/2, handle_event/3]).
    -
    -handle(Req, _Args) ->
    -    %% Delegate to our handler function
    -    Method = Req#req.method,
    -    Path = elli_request:path(Req),
    -    handle(Method, Path, Req).
    -
    -handle('GET' = _Method, [<<"hello">>, <<"world">>] = _Path, _Req) ->
    -    %% Reply with a normal response. `ok' can be used instead of `200'
    -    %% to signal success.
    -    StatusCode = ok,
    -    Headers = [],
    -    Body = <<"Hello World!">>,
    -    {StatusCode, Headers, Body};
    -
    -handle(_Method, _Path, _Req) ->
    -    {404, [], <<"Not Found">>}.
    -
    -%% @doc Handle request events: request completed, exception
    -%% thrown, client timeout, etc. Must return `ok'.
    -handle_event(_Event, _Data, _Args) ->
    -    ok.

    - - - - Supervisor ChildSpec -

    -

    To add elli to a supervisor you can use the following example and adapt it to -your needs.

    -module(elli_minimal_sup).
    --behaviour(supervisor).
    -
    --export([start_link/0, init/1]).
    -
    -start_link() ->
    -    SupName = {local, ?MODULE},
    -    Module = ?MODULE,
    -    Args = [],
    -    supervisor:start_link(SupName, Module, Args).
    -
    -init([] = _Args) ->
    -    ElliOpts = [
    -        {callback, elli_minimal_callback},
    -        {port, 3000}
    -    ],
    -    ElliSpec = {
    -        _Id = elli_minimal_http,
    -        _Start = {elli, start_link, [ElliOpts]},
    -        _Restart = permanent,
    -        _Shutdown = 5000,
    -        _Worker = worker,
    -        _Modules = [elli]},
    -
    -    {ok, {{_Strategy = one_for_one, _Intensity = 5, _Period = 10}, [ElliSpec]} }.

    - - - - Further reading -

    -

    For more information about the features and design philosophy of Elli check -out the overview.

    - - - - License -

    -

    Elli is licensed under The MIT License.

    -
    - - - -
    -
    -
    - - - - diff --git a/doc/search.html b/doc/search.html deleted file mode 100644 index 05b9abb..0000000 --- a/doc/search.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - Search — elli v3.3.0 - - - - - - - - - - - - - - -
    - - - - - -
    - - -
    - - - - - -
    -
    -
    - - - - From 8539c10001d264248f952a0008e7c187a2963583 Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Mon, 1 Jul 2024 22:45:48 +0100 Subject: [PATCH 11/13] CI: make sure doc generation isn't broken --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 836c9e6..dd03bc5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -70,3 +70,6 @@ jobs: with: files: _build/test/covertool/elli.covertool.xml env_vars: OTP_VERSION + + - name: Generate doc + run: rebar3 ex_doc From f3646a20899b65fa6e561964575f88ed208d88ce Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 2 Oct 2024 19:39:00 +0100 Subject: [PATCH 12/13] Revert back to what it was --- src/elli_http.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elli_http.erl b/src/elli_http.erl index bcc4a33..8b086a7 100644 --- a/src/elli_http.erl +++ b/src/elli_http.erl @@ -745,7 +745,7 @@ split_path(Path) -> P =/= <<>>]. %% @doc Split the URL arguments into a proplist. -%% Lifted from cowboy_http:x_www_form_urlencoded/2. +%% Lifted from `cowboy_http:x_www_form_urlencoded/2'. -spec split_args(binary()) -> list({binary(), binary() | true}). split_args(<<>>) -> []; From 828b981168dd3c89e49bccc527d3624dbac0544b Mon Sep 17 00:00:00 2001 From: "Paulo F. Oliveira" Date: Wed, 2 Oct 2024 19:39:33 +0100 Subject: [PATCH 13/13] Fix strange output on documentation ex_doc is already smart enough to turn the call into a link to the Erlang docs --- src/elli_example_callback.erl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/elli_example_callback.erl b/src/elli_example_callback.erl index cf726f5..8d1b1e3 100644 --- a/src/elli_example_callback.erl +++ b/src/elli_example_callback.erl @@ -273,11 +273,9 @@ chunk_loop(Ref, N) -> %% Elli is waiting for the request. %% %% `request_parse_error' fires if the request is invalid and cannot be parsed by -%% [`erlang:decode_packet/3'][decode_packet/3] or it contains a path Elli cannot +%% `erlang:decode_packet/3' or it contains a path Elli cannot %% parse or does not support. %% -%% [decode_packet/3]: http://erlang.org/doc/man/erlang.html#decode_packet-3 -%% %% `client_closed' can be sent from multiple parts of the request %% handling. It's sent when the client closes the connection or if for %% any reason the socket is closed unexpectedly. The `Where' atom