diff --git a/sites/build_home_samples.py b/sites/build_home_samples.py index ca30043..1d2d1ac 100755 --- a/sites/build_home_samples.py +++ b/sites/build_home_samples.py @@ -286,7 +286,7 @@ def make_home_samples(): [Asserts] jsonpath "$.status" == "RUNNING" # Check the status code jsonpath "$.tests" count == 25 # Check the number of items -jsonpath "$.id" matches /\d{4}/ # Check the format of the id +jsonpath "$.id" matches /\\d{4}/ # Check the format of the id """, ), Sample( @@ -329,7 +329,7 @@ def make_home_samples(): certificate "Subject" == "CN=example.org" certificate "Issuer" == "C=US, O=Let's Encrypt, CN=R3" certificate "Expire-Date" daysAfterNow > 15 -certificate "Serial-Number" matches /[\da-f]+/ +certificate "Serial-Number" matches /[\\da-f]+/ """, ), Sample( @@ -339,6 +339,7 @@ def make_home_samples(): GET https://api.example.org/jobs/{{job_id}} [Options] retry: 10 # maximum number of retry, -1 for unlimited +retry-interval: 300ms HTTP 200 [Asserts] jsonpath "$.state" == "COMPLETED" diff --git a/sites/generate/build_jekyll_md.py b/sites/generate/build_jekyll_md.py index 1d223ca..d244aff 100755 --- a/sites/generate/build_jekyll_md.py +++ b/sites/generate/build_jekyll_md.py @@ -70,13 +70,6 @@ def convert_to_jekyll( ) -> str: text = path.read_text() - # Add asciinema div to index.md - if path == Path("../hurl/docs/home.md"): - text = text.replace( - 'Hurl Demo', - '
', - ) - md_raw = parse_markdown(text) md_escaped = MarkdownDoc() diff --git a/sites/hurl.dev/_data/docs.yml b/sites/hurl.dev/_data/docs.yml index ab9d9e5..3a7e1d9 100644 --- a/sites/hurl.dev/_data/docs.yml +++ b/sites/hurl.dev/_data/docs.yml @@ -81,6 +81,7 @@ - title: Reports items: - title: HTML Report + - title: JSON Report - title: JUnit Report - title: TAP Report - title: JSON Output @@ -99,9 +100,16 @@ path: /docs/running-tests.html items: - title: Use --test Option + items: + - title: Selecting Tests + - title: Debugging + items: + - title: Debug Logs + - title: HTTP Responses - title: Generating Report items: - title: HTML Report + - title: JSON Report - title: JUnit Report - title: TAP Report - title: Use Variables in Tests @@ -140,6 +148,7 @@ - title: Cookie storage - title: Redirects - title: Retry + - title: Control flow - title: Request path: /docs/request.html items: @@ -308,6 +317,7 @@ - title: Using --verbose and --very-verbose for all entries - title: Debugging a specific entry - title: Use Error Format + - title: Get Response Body - title: Interactive Mode - title: Include Headers Like curl - title: Using a Proxy diff --git a/sites/hurl.dev/_docs/capturing-response.md b/sites/hurl.dev/_docs/capturing-response.md index 8524dcb..c2ed12f 100644 --- a/sites/hurl.dev/_docs/capturing-response.md +++ b/sites/hurl.dev/_docs/capturing-response.md @@ -100,7 +100,7 @@ next_url: header "Location" ### URL capture -Capture the last fetched URL. This is most meaningful if you have told Hurl to follow redirection (see [`[Options]`section][options] or +Capture the last fetched URL. This is most meaningful if you have told Hurl to follow redirection (see [`[Options]` section][options] or [`--location` option]). URL capture consists of a variable name, followed by a `:`, and the keyword `url`. ```hurl diff --git a/sites/hurl.dev/_docs/entry.md b/sites/hurl.dev/_docs/entry.md index 5610d61..7ec567e 100644 --- a/sites/hurl.dev/_docs/entry.md +++ b/sites/hurl.dev/_docs/entry.md @@ -46,7 +46,8 @@ every entry of a given file will follow redirection: $ hurl --location foo.hurl ``` -You can use an [`[Options]` section][options] to use option only for a specified option. For instance, in this Hurl file: +You can use an [`[Options]` section][options] to set option only for a specified request. For instance, in this Hurl file, +the second entry will follow location (so we can test the status code to be 200 instead of 301). ```hurl GET https://google.fr @@ -61,9 +62,7 @@ GET https://google.fr HTTP 301 ``` -The second entry will follow location (so we can test the status code to be 200 instead of 301). - -You can use it to log a specific entry: +You can use the `[Options]` section to log a specific entry: ```hurl # ... previous entries @@ -124,7 +123,7 @@ under flaky conditions. Asserts can be explicit (with an [`[Asserts]` section][a Retries can be set globally for every request (see [`--retry`] and [`--retry-interval`]), or activated on a particular request with an [`[Options]` section][options]. -For example, in this Hurl file, first we create a new job, then we poll the new job until it's completed: +For example, in this Hurl file, first we create a new job then we poll the new job until it's completed: {% raw %} ```hurl @@ -141,6 +140,7 @@ jsonpath "$.state" == "RUNNING" GET http://api.example.org/jobs/{{job_id}} [Options] retry: 10 # maximum number of retry, -1 for unlimited +retry-interval: 300ms HTTP 200 [Asserts] jsonpath "$.state" == "COMPLETED" @@ -148,6 +148,52 @@ jsonpath "$.state" == "COMPLETED" {% endraw %} +### Control flow + +In `[Options]` section, `skip` and `repeat` can be used to control flow of execution: + +- `skip: true/false` skip this request and execute the next one unconditionally, +- `repeat: N` loop the request N times. If there are assert or runtime errors, the requests execution is stopped. + +```hurl +# This request will be played exactly 3 times +GET https://example.org/foo +[Options] +repeat: 3 +HTTP 200 + +# This request is skipped +GET https://example.org/foo +[Options] +skip: true +HTTP 200 +``` + +Additionally, a `delay` can be inserted between requests, to add a delay before execution of a request. + +```hurl +# A 5 seconds delayed request +GET https://example.org/foo +[Options] +delay: 5s +HTTP 200 +``` + +[`delay`] and [`repeat`] can also be used globally as command line options: + +```shell +$ hurl --delay 500ms --repeat 3 foo.hurl +``` + + + +For complete reference, below is a diagram for the executed entries. + +
+ Run cycle explanation + Run cycle explanation +
+ [request]: {% link _docs/request.md %} @@ -155,6 +201,7 @@ jsonpath "$.state" == "COMPLETED" [capture values]: {% link _docs/capturing-response.md %} [add asserts to HTTP responses]: {% link _docs/asserting-response.md %} [`--location`]: {% link _docs/manual.md %}#location +[`--location` option]: {% link _docs/manual.md %}#location [`--location-trusted`]: {% link _docs/manual.md %}#location-trusted [`--max-redirs`]: {% link _docs/manual.md %}#max-redirs [Options]: {% link _docs/manual.md %}#options @@ -165,3 +212,5 @@ jsonpath "$.state" == "COMPLETED" [Asserts]: {% link _docs/response.md %}#asserts [`--retry`]: {% link _docs/manual.md %}#retry [`--retry-interval`]: {% link _docs/manual.md %}#retry-interval +[`delay`]: {% link _docs/manual.md %}#retry +[`repeat`]: {% link _docs/manual.md %}#repeat diff --git a/sites/hurl.dev/_docs/filters.md b/sites/hurl.dev/_docs/filters.md index 21c0859..95648a2 100644 --- a/sites/hurl.dev/_docs/filters.md +++ b/sites/hurl.dev/_docs/filters.md @@ -232,6 +232,16 @@ jsonpath "$.published" toDate "%Y-%m-%dT%H:%M:%S%.fZ" format "%A" == "Monday" jsonpath "$.published" toDate "%+" format "%A" == "Monday" # %+ can be used to parse ISO 8601 / RFC 3339 ``` +### toFloat + +Converts to float number. + +```hurl +GET https://example.org/foo +HTTP 200 +[Asserts] +jsonpath "$.pi" toFloat == 3.14 +``` ### toInt diff --git a/sites/hurl.dev/_docs/grammar.md b/sites/hurl.dev/_docs/grammar.md index 1a5ee19..55edd44 100644 --- a/sites/hurl.dev/_docs/grammar.md +++ b/sites/hurl.dev/_docs/grammar.md @@ -84,7 +84,7 @@ Short description:
assert(used by asserts-section)
lt*
query (sp filter)* sp predicate lt
option(used by options-section)
lt*
-(aws-sigv4-option|ca-certificate-option|client-certificate-option|client-key-option|compressed-option|connect-to-option|delay-option|follow-redirect-option|follow-redirect-trusted-option|http10-option|http11-option|http2-option|http3-option|insecure-option|ipv4-option|ipv6-option|max-redirs-option|netrc-option|netrc-file-option|netrc-optional-option|output-option|path-as-is-option|proxy-option|resolve-option|retry-option|retry-interval-option|skip-option|unix-socket-option|user-option|variable-option|verbose-option|very-verbose-option)
+(aws-sigv4-option|ca-certificate-option|client-certificate-option|client-key-option|compressed-option|connect-to-option|delay-option|follow-redirect-option|follow-redirect-trusted-option|http10-option|http11-option|http2-option|http3-option|insecure-option|ipv4-option|ipv6-option|max-redirs-option|netrc-option|netrc-file-option|netrc-optional-option|output-option|path-as-is-option|proxy-option|repeat-option|resolve-option|retry-option|retry-interval-option|skip-option|unix-socket-option|user-option|variable-option|verbose-option|very-verbose-option)
aws-sigv4-option(used by option)
aws-sigv4 : value-string lt
ca-certificate-option(used by option)
cacert : filename lt
client-certificate-option(used by option)
cert : filename-password lt
@@ -109,6 +109,7 @@ Short description:
path-as-is-option(used by option)
path-as-is : boolean-option lt
proxy-option(used by option)
proxy : value-string lt
resolve-option(used by option)
resolve : value-string lt
+
repeat-option(used by option)
repeat : integer-option lt
retry-option(used by option)
retry : integer-option lt
retry-interval-option(used by option)
retry-interval : integer-option lt
skip-option(used by option)
skip : boolean-option lt
@@ -119,7 +120,7 @@ Short description:
very-verbose-option(used by option)
very-verbose : boolean-option lt
variable-definition(used by variable-option)
variable-name = variable-value
boolean-option(used by compressed-optionfollow-redirect-optionfollow-redirect-trusted-optionhttp10-optionhttp11-optionhttp2-optionhttp3-optioninsecure-optionipv4-optionipv6-optionnetrc-optionnetrc-optional-optionpath-as-is-optionskip-optionverbose-optionvery-verbose-option)
boolean|template
-
integer-option(used by delay-optionmax-redirs-optionretry-optionretry-interval-option)
integer|template
+
integer-option(used by delay-optionmax-redirs-optionrepeat-optionretry-optionretry-interval-option)
integer|template
variable-value(used by variable-definition)
 null
|boolean
|integer
@@ -231,7 +232,7 @@ Short description:
oneline-string-text(used by oneline-string-content)
~[#\n\\] ~`
oneline-string-escaped-char(used by oneline-string-content)
\ (`|#|\|b|f|u unicode-char)
-
multiline-string(used by predicate-valuebytes)
``` multiline-string-type? lt
+
multiline-string-type(used by multiline-string)
 base64
@@ -239,6 +240,8 @@ Short description: |json
|xml
|graphql
+
multiline-string-attribute(used by multiline-string)
 escape
+|variable
multiline-string-text(used by multiline-string-content)
~[\\]+ ~```
multiline-string-escaped-char(used by multiline-string-content)
\ (\|b|f|n|r|t|`|u unicode-char)
@@ -282,6 +285,7 @@ Short description: |replace-filter
|split-filter
|to-date-filter
+|to-float-filter
|to-int-filter
|url-decode-filter
|url-encode-filter
@@ -299,6 +303,7 @@ Short description:
replace-filter(used by filter)
split-filter(used by filter)
to-date-filter(used by filter)
toDate
+
to-float-filter(used by filter)
toFloat
to-int-filter(used by filter)
toInt
url-decode-filter(used by filter)
urlDecode
url-encode-filter(used by filter)
urlEncode
@@ -314,7 +319,7 @@ Short description:
fraction(used by json-numberfloat)
. digit+
exponent(used by json-number)
(e|E) (+|-)? digit+
- +
comment(used by lt)
# ~[\n]*
regex-content(used by regex)
diff --git a/sites/hurl.dev/_docs/manual.md b/sites/hurl.dev/_docs/manual.md index fd82ea5..7ccf597 100644 --- a/sites/hurl.dev/_docs/manual.md +++ b/sites/hurl.dev/_docs/manual.md @@ -46,6 +46,7 @@ $ echo GET http://httpbin.org/get | hurl } ``` +Hurl can take files as input, or directories. In the latter case, Hurl will search files with `.hurl` extension recursively. Output goes to stdout by default. To have output go to a file, use the [`-o, --output`](#output) option: @@ -163,12 +164,12 @@ will follow a redirection only for the second entry. | -E, --cert <CERTIFICATE[:PASSWORD]> | Client certificate file and password.

See also [`--key`](#key).
| | --color | Colorize debug output (the HTTP response output is not colorized).

This is a cli-only option.
| | --compressed | Request a compressed response using one of the algorithms br, gzip, deflate and automatically decompress the content.
| -| --connect-timeout <SECONDS> | Maximum time in seconds that you allow Hurl's connection to take.

See also [`-m, --max-time`](#max-time).
| +| --connect-timeout <SECONDS> | Maximum time in seconds that you allow Hurl's connection to take.

You can specify time units in the connect timeout expression. Set Hurl to use a connect timeout of 20 seconds with `--connect-timeout 20s` or set it to 35,000 milliseconds with `--connect-timeout 35000ms`. No spaces allowed.

See also [`-m, --max-time`](#max-time).

This is a cli-only option.
| | --connect-to <HOST1:PORT1:HOST2:PORT2> | For a request to the given HOST1:PORT1 pair, connect to HOST2:PORT2 instead. This option can be used several times in a command line.

See also [`--resolve`](#resolve).
| | --continue-on-error | Continue executing requests to the end of the Hurl file even when an assert error occurs.
By default, Hurl exits after an assert error in the HTTP response.

Note that this option does not affect the behavior with multiple input Hurl files.

All the input files are executed independently. The result of one file does not affect the execution of the other Hurl files.

This is a cli-only option.
| | -b, --cookie <FILE> | Read cookies from FILE (using the Netscape cookie file format).

Combined with [`-c, --cookie-jar`](#cookie-jar), you can simulate a cookie storage between successive Hurl runs.

This is a cli-only option.
| | -c, --cookie-jar <FILE> | Write cookies to FILE after running the session (only for one session).
The file will be written using the Netscape cookie file format.

Combined with [`-b, --cookie`](#cookie), you can simulate a cookie storage between successive Hurl runs.

This is a cli-only option.
| -| --delay <MILLISECONDS> | Sets delay before each request.
| +| --delay <MILLISECONDS> | Sets delay before each request. The delay is not applied to requests that have been retried because of [`--retry`](#retry). See [`--retry-interval`](#retry-interval) to space retried requests.

You can specify time units in the delay expression. Set Hurl to use a delay of 2 seconds with `--delay 2s` or set it to 500 milliseconds with `--delay 500ms`. No spaces allowed.
| | --error-format <FORMAT> | Control the format of error message (short by default or long)

This is a cli-only option.
| | --file-root <DIR> | Set root directory to import files in Hurl. This is used for files in multipart form data, request body and response output.
When it is not explicitly defined, files are relative to the Hurl file's directory.

This is a cli-only option.
| | --from-entry <ENTRY_NUMBER> | Execute Hurl file from ENTRY_NUMBER (starting at 1).

This is a cli-only option.
| @@ -183,14 +184,14 @@ will follow a redirection only for the second entry. | --interactive | Stop between requests.

This is similar to a break point, You can then continue (Press C) or quit (Press Q).

This is a cli-only option.
| | -4, --ipv4 | This option tells Hurl to use IPv4 addresses only when resolving host names, and not for example try IPv6.
| | -6, --ipv6 | This option tells Hurl to use IPv6 addresses only when resolving host names, and not for example try IPv4.
| -| --jobs <NUM> | (Experimental) Maximum number of parallel jobs in parallel mode. Default value corresponds (in most cases) to the
current amount of CPUs.

See also [`--parallel`](#parallel).

This is a cli-only option.
| +| --jobs <NUM> | Maximum number of parallel jobs in parallel mode. Default value corresponds (in most cases) to the
current amount of CPUs.

See also [`--parallel`](#parallel).

This is a cli-only option.
| | --json | Output each Hurl file result to JSON. The format is very closed to HAR format.

This is a cli-only option.
| | --key <KEY> | Private key file name.
| | -L, --location | Follow redirect. To limit the amount of redirects to follow use the [`--max-redirs`](#max-redirs) option
| | --location-trusted | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.
This may or may not introduce a security breach if the site redirects you to a site to which you send your authentication info (which is plaintext in the case of HTTP Basic authentication).
| | --max-filesize <BYTES> | Specify the maximum size (in bytes) of a file to download. If the file requested is larger than this value, the transfer does not start.

This is a cli-only option.
| | --max-redirs <NUM> | Set maximum number of redirection-followings allowed

By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.
| -| -m, --max-time <SECONDS> | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.

See also [`--connect-timeout`](#connect-timeout).

This is a cli-only option.
| +| -m, --max-time <SECONDS> | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.

You can specify time units in the maximum time expression. Set Hurl to use a maximum time of 20 seconds with `--max-time 20s` or set it to 35,000 milliseconds with `--max-time 35000ms`. No spaces allowed.

See also [`--connect-timeout`](#connect-timeout).

This is a cli-only option.
| | -n, --netrc | Scan the .netrc file in the user's home directory for the username and password.

See also [`--netrc-file`](#netrc-file) and [`--netrc-optional`](#netrc-optional).
| | --netrc-file <FILE> | Like [`--netrc`](#netrc), but provide the path to the netrc file.

See also [`--netrc-optional`](#netrc-optional).
| | --netrc-optional | Similar to [`--netrc`](#netrc), but make the .netrc usage optional.

See also [`--netrc-file`](#netrc-file).
| @@ -198,17 +199,19 @@ will follow a redirection only for the second entry. | --no-output | Suppress output. By default, Hurl outputs the body of the last response.

This is a cli-only option.
| | --noproxy <HOST(S)> | Comma-separated list of hosts which do not use a proxy.

Override value from Environment variable no_proxy.
| | -o, --output <FILE> | Write output to FILE instead of stdout.
| -| --parallel | (Experimental) Run files in parallel.

Each Hurl file is executed in its own worker thread, without sharing anything with the other workers. The default run mode is sequential.

See also [`--jobs`](#jobs).

This is a cli-only option.
| +| --parallel | Run files in parallel.

Each Hurl file is executed in its own worker thread, without sharing anything with the other workers. The default run mode is sequential. Parallel execution is by default in [`--test`](#test) mode.

See also [`--jobs`](#jobs).

This is a cli-only option.
| | --path-as-is | Tell Hurl to not handle sequences of /../ or /./ in the given URL path. Normally Hurl will squash or merge them according to standards but with this option set you tell it not to do that.
| | -x, --proxy <[PROTOCOL://]HOST[:PORT]> | Use the specified proxy.
| +| --repeat <NUM> | Repeat the input files sequence NUM times, -1 for infinite loop. Given a.hurl, b.hurl, c.hurl as input, repeat two
times will run a.hurl, b.hurl, c.hurl, a.hurl, b.hurl, c.hurl.

This is a cli-only option.
| | --report-html <DIR> | Generate HTML report in DIR.

If the HTML report already exists, it will be updated with the new test results.

This is a cli-only option.
| +| --report-json <DIR> | Generate JSON report in DIR.

If the JSON report already exists, it will be updated with the new test results.

This is a cli-only option.
| | --report-junit <FILE> | Generate JUnit File.

If the FILE report already exists, it will be updated with the new test results.

This is a cli-only option.
| | --report-tap <FILE> | Generate TAP report.

If the FILE report already exists, it will be updated with the new test results.

This is a cli-only option.
| | --resolve <HOST:PORT:ADDR> | Provide a custom address for a specific host and port pair. Using this, you can make the Hurl requests(s) use a specified address and prevent the otherwise normally resolved address to be used. Consider it a sort of /etc/hosts alternative provided on the command line.
| | --retry <NUM> | Maximum number of retries, 0 for no retries, -1 for unlimited retries. Retry happens if any error occurs (asserts, captures, runtimes etc...).
| -| --retry-interval <MILLISECONDS> | Duration in milliseconds between each retry. Default is 1000 ms.
| +| --retry-interval <MILLISECONDS> | Duration in milliseconds between each retry. Default is 1000 ms.

You can specify time units in the retry interval expression. Set Hurl to use a retry interval of 2 seconds with `--retry-interval 2s` or set it to 500 milliseconds with `--retry-interval 500ms`. No spaces allowed.
| | --ssl-no-revoke | (Windows) This option tells Hurl to disable certificate revocation checks. WARNING: this option loosens the SSL security, and by using this flag you ask for exactly that.

This is a cli-only option.
| -| --test | Activate test mode: with this, the HTTP response is not outputted anymore, progress is reported for each Hurl file tested, and a text summary is displayed when all files have been run.

This is a cli-only option.
| +| --test | Activate test mode: with this, the HTTP response is not outputted anymore, progress is reported for each Hurl file tested, and a text summary is displayed when all files have been run.

In test mode, files are executed in parallel. To run test in a sequential way use `--job 1`.

See also [`--jobs`](#jobs).

This is a cli-only option.
| | --to-entry <ENTRY_NUMBER> | Execute Hurl file to ENTRY_NUMBER (starting at 1).
Ignore the remaining of the file. It is useful for debugging a session.

This is a cli-only option.
| | --unix-socket <PATH> | (HTTP) Connect through this Unix domain socket, instead of using the network.
| | -u, --user <USER:PASSWORD> | Add basic Authentication header to each request.
| diff --git a/sites/hurl.dev/_docs/request.md b/sites/hurl.dev/_docs/request.md index 8bbd914..c7782ab 100644 --- a/sites/hurl.dev/_docs/request.md +++ b/sites/hurl.dev/_docs/request.md @@ -658,7 +658,7 @@ GET https://example.org aws-sigv4: aws:amz:sts # generate AWS SigV4 Authorization header cacert: /etc/cert.pem # custom certificate file compressed: true # request a compressed response -delay: 3000 # delay in ms for this request +delay: 3s # delay for this request http3: true # use HTTP/3 protocol version insecure: true # allow insecure SSL connections and transfers ipv6: true # use IPv6 addresses @@ -666,9 +666,12 @@ location: true # follow redirection for this request max-redirs: 10 # maximum number of redirections output: out.html # dump the response to this file path-as-is: true # do not handle sequences of /../ or /./ in URL path +retry: 10 # number of retry if HTTP/asserts errors +retry-interval: 500ms # interval between retry skip: false # skip this request unix-socket: sock # use Unix socket for transfer user: bob:secret # use basic authentication +proxy: my.proxy:8012 # define proxy (host:port where host can be an IP address) variable: country=Italy # define variable country variable: planet=Earth # define variable planet verbose: true # allow verbose output diff --git a/sites/hurl.dev/_docs/response.md b/sites/hurl.dev/_docs/response.md index 82a1dc5..0d8feb1 100644 --- a/sites/hurl.dev/_docs/response.md +++ b/sites/hurl.dev/_docs/response.md @@ -83,8 +83,7 @@ xpath "//li" count == 18 ## Capture and Assertion -With the response section, one can optionally [capture value from headers, body], -or [add assert on status code, body or headers]. +With the response section, one can optionally [capture value from headers, body], or [add assert on status code, body or headers]. ### Body compression @@ -97,7 +96,9 @@ header by example) and add assert and captures on the decoded body as if there w ## Timings -HTTP response timings are exposed through Hurl structured output (see [`--json`]) and HTML report (see [`--report-html`]). +HTTP response timings are exposed through Hurl structured output (see [`--json`]), HTML report (see [`--report-html`]) +and JSON report (see [`--report-json`]). + On each response, libcurl response timings are available: - __time_namelookup__: the time it took from the start until the name resolving was completed. You can use @@ -133,4 +134,5 @@ All timings are in microsecond. [`Accept-Encoding`]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding [`--json`]: {% link _docs/manual.md %}#json [`--report-html`]: {% link _docs/manual.md %}#report-html +[`--report-json`]: {% link _docs/manual.md %}#report-json [`--resolve`]: {% link _docs/manual.md %}#resolve diff --git a/sites/hurl.dev/_docs/running-tests.md b/sites/hurl.dev/_docs/running-tests.md index 6f94bd7..8f6635c 100644 --- a/sites/hurl.dev/_docs/running-tests.md +++ b/sites/hurl.dev/_docs/running-tests.md @@ -31,50 +31,189 @@ test tool with an adapted output, you can use [`--test` option]: ```shell $ hurl --test hello.hurl assert_json.hurl -hello.hurl: Running [1/2] hello.hurl: Success (6 request(s) in 245 ms) -assert_json.hurl: Running [2/2] assert_json.hurl: Success (8 request(s) in 308 ms) -------------------------------------------------------------------------------- -Executed files: 2 -Succeeded files: 2 (100.0%) -Failed files: 0 (0.0%) -Duration: 561 ms +Executed files: 2 +Executed requests: 10 (17.82/s) +Succeeded files: 2 (100.0%) +Failed files: 0 (0.0%) +Duration: 561 ms ``` Or, in case of errors: ```shell $ hurl --test hello.hurl error_assert_status.hurl -hello.hurl: Running [1/2] -hello.hurl: Success (6 request(s) in 258 ms) -assert_json.hurl: Running [2/2] +hello.hurl: Success (4 request(s) in 5 ms) error: Assert status code - --> assert_json.hurl:6:8 - | - 6 | HTTP/* 200 - | ^^^ actual value is <301> - | + --> error_assert_status.hurl:9:6 + | + | GET http://localhost:8000/not_found + | ... + 9 | HTTP 200 + | ^^^ actual value is <404> + | -assert_json.hurl: Failure (5 request(s) in 230 ms) +error_assert_status.hurl: Failure (1 request(s) in 2 ms) -------------------------------------------------------------------------------- -Executed files: 2 -Succeeded files: 1 (50.0%) -Failed files: 1 (50.0%) -Duration: 499 ms +Executed files: 2 +Executed requests: 5 (500.0/s) +Succeeded files: 1 (50.0%) +Failed files: 1 (50.0%) +Duration: 10 ms ``` -You can use [`--glob` option] to test files that match a given pattern: +In test mode, files are executed in parallel to speed-ud the execution. If a sequential run is needed, you can use +[`--jobs 1`] option to execute tests one by one. + +```shell +$ hurl --test --jobs 1 *.hurl +``` + +[`--repeat` option] can be used to repeat run files and do performance check. For instance, this call will run 1000 tests +in parallel: + +```shell +$ hurl --test --repeat 1000 stress.hurl +``` + + +### Selecting Tests + +Hurl can take multiple files into inputs: + +```shell +$ hurl --test test/integration/a.hurl test/integration/b.hurl test/integration/c.hurl +``` + +```shell +$ hurl --test test/integration/*.hurl +``` + +Or you can simply give a directory and Hurl will find files with `.hurl` extension recursively: + +```shell +$ hurl --test test/integration/ +``` + +Finally, you can use [`--glob` option] to test files that match a given pattern: ```shell $ hurl --test --glob "test/integration/**/*.hurl" ``` +## Debugging + +### Debug Logs + +If you need more error context, you can use [`--error-format long` option] to print HTTP bodies for failed asserts: + +```shell +$ hurl --test --error-format long hello.hurl error_assert_status.hurl +hello.hurl: Success (4 request(s) in 6 ms) +HTTP/1.1 404 +Server: Werkzeug/3.0.3 Python/3.12.4 +Date: Wed, 10 Jul 2024 15:42:41 GMT +Content-Type: text/html; charset=utf-8 +Content-Length: 207 +Server: Flask Server +Connection: close + + + +404 Not Found +

Not Found

+

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

+ + +error: Assert status code + --> error_assert_status.hurl:9:6 + | + | GET http://localhost:8000/not_found + | ... + 9 | HTTP 200 + | ^^^ actual value is <404> + | + +error_assert_status.hurl: Failure (1 request(s) in 2 ms) +-------------------------------------------------------------------------------- +Executed files: 2 +Executed requests: 5 (454.5/s) +Succeeded files: 1 (50.0%) +Failed files: 1 (50.0%) +Duration: 11 ms +``` + +Individual requests can be modified with [`[Options]` section][options] to turn on logs for a particular request, using +[`verbose`] and [`very-verbose`] option. + +With this Hurl file: + +```hurl +GET https://foo.com +HTTP 200 + +GET https://bar.com +[Options] +very-verbose: true +HTTP 200 + +GET https://baz.com +HTTP 200 +``` + +Running `hurl --test .` will output debug logs for the request to `https://bar.com`. + +[`--verbose`] / [`--very-verbose`] can also be enabled globally, for every requests of every tested files: + +```shell +$ hurl --test --very-verbose . +``` + +### HTTP Responses + +In test mode, HTTP responses are not displayed. One way to get HTTP responses even in test mode is to use +[`--output` option] of `[Options]` section: `--output file` allows to save a particular response to a file, while +`--output -` allows to redirect HTTP responses to standard output. + +```hurl +GET http://foo.com +HTTP 200 + +GET https://bar.com +[Options] +output: - +HTTP 200 +``` + +```shell +$ hurl --test . + +301 Moved +

301 Moved

+The document has moved +here. + +/tmp/test.hurl: Success (2 request(s) in 184 ms) +-------------------------------------------------------------------------------- +Executed files: 1 +Executed requests: 2 (10.7/s) +Succeeded files: 1 (100.0%) +Failed files: 0 (0.0%) +Duration: 187 ms +``` + + + ## Generating Report +In the different reports, files are always referenced in the input order (which, as tests are executed in parallel, can +be different from the execution order). + ### HTML Report -Hurl can generate an HTML report by using the [`--report-html HTML_DIR`] option. +Hurl can generate an HTML report by using the [`--report-html DIR`] option. If the HTML report already exists, the test results will be appended to it. @@ -88,6 +227,14 @@ The input Hurl files (HTML version) are also included and are easily accessed fr Hurl HTML file
+### JSON Report + +A JSON report can be produced by using the [`--report-json DIR`]. The report directory will contain a `report.json` +file, including each test file executed with [`--json`] option and a reference to each HTTP response of the run dumped +to disk. + +If the JSON report already exists, it will be updated with the new test results. + ### JUnit Report A JUnit report can be produced by using the [`--report-junit FILE`] option. @@ -110,9 +257,11 @@ To use variables in your tests, you can: You will find a detailed description in the [Injecting Variables] section of the docs. + [`--output /dev/null`]: {% link _docs/manual.md %}#output [`--test`]: {% link _docs/manual.md %}#test -[`--report-html HTML_DIR`]: {% link _docs/manual.md %}#report-html +[`--report-html DIR`]: {% link _docs/manual.md %}#report-html +[`--report-json DIR`]: {% link _docs/manual.md %}#report-json [`--report-junit FILE`]: {% link _docs/manual.md %}#report-junit [`--report-tap FILE`]: {% link _docs/manual.md %}#report-tap [`--test` option]: {% link _docs/manual.md %}#test @@ -121,3 +270,13 @@ You will find a detailed description in the [Injecting Variables] section of the [`--variables-file` option]: {% link _docs/manual.md %}#variables-file [Injecting Variables]: {% link _docs/templates.md %}#injecting-variables [Test Anything Protocol]: https://testanything.org +[`--jobs 1`]: {% link _docs/manual.md %}#jobs +[`--json`]: {% link _docs/manual.md %}#json +[`--error-format long` option]: {% link _docs/manual.md %}#error-format +[options]: {% link _docs/request.md %}#options +[`--verbose`]: {% link _docs/manual.md %}#verbose +[`--very-verbose`]: {% link _docs/manual.md %}#very-verbose +[`verbose`]: {% link _docs/manual.md %}#verbose +[`very-verbose`]: {% link _docs/manual.md %}#very-verbose +[`--output` option]: {% link _docs/manual.md %}#output +[`--repeat` option]: {% link _docs/manual.md %}#repeat diff --git a/sites/hurl.dev/_docs/samples.md b/sites/hurl.dev/_docs/samples.md index d92e3ec..9e72adf 100644 --- a/sites/hurl.dev/_docs/samples.md +++ b/sites/hurl.dev/_docs/samples.md @@ -36,6 +36,12 @@ GET https://example.ord/dogs/567 HTTP 200 ``` +Finally, Hurl can take files as input, or directories. In the latter case, Hurl will search files with `.hurl` extension recursively. + +```shell +$ hurl --test integration/*.hurl +$ hurl --test . +``` You can check [Hurl tests suite] for more samples. @@ -595,6 +601,15 @@ $ hurl --test --report-html build/report/ *.hurl [Doc]({% link _docs/running-tests.md %}#generating-report) +### JSON Report + +```shell +$ hurl --test --report-json build/report/ *.hurl +``` + +[Doc]({% link _docs/running-tests.md %}#generating-report) + + ### JUnit Report ```shell @@ -656,6 +671,7 @@ jsonpath "$.state" == "RUNNING" GET https://api.example.org/jobs/{{job_id}} [Options] retry: 10 # maximum number of retry, -1 for unlimited +retry-interval: 500ms HTTP 200 [Asserts] jsonpath "$.state" == "COMPLETED" @@ -667,13 +683,13 @@ jsonpath "$.state" == "COMPLETED" ### Delaying Requests -Add delay for every request, or a particular requests: +Add delay for every request, or a particular request: ```hurl -# Delaying this request by 5s +# Delaying this request by 5 seconds GET https://example.org/turtle [Options] -delay: 5000 +delay: 5s HTTP 200 # No delay! diff --git a/sites/hurl.dev/_docs/tutorial/debug-tips.md b/sites/hurl.dev/_docs/tutorial/debug-tips.md index 43fb802..d8a5412 100644 --- a/sites/hurl.dev/_docs/tutorial/debug-tips.md +++ b/sites/hurl.dev/_docs/tutorial/debug-tips.md @@ -92,7 +92,6 @@ In each run request, we can also see a curl command line to replay this particul ... ``` - In verbose mode, HTTP request and response bodies are not displayed in the debug logs. If you need to inspect the request or response body, you can display more logs with [`--very-verbose`] option: @@ -219,7 +218,6 @@ $ hurl --very-verbose --no-output basic.hurl [`--very-verbose`] output is much more verbose; with body request and response, [`libcurl`] logs and [response timings] are displayed. - ### Debugging a specific entry If you have a lot of entries (request / response pairs) in your Hurl file, using [`--verbose`] or [`--very-verbose`] @@ -341,7 +339,43 @@ $ hurl --error-format long --test basic.hurl basic.hurl: Failure (4 request(s) in 23 ms) ``` +## Get Response Body + +When there are errors (HTTP runtimes or asserts errors), Hurl doesn't output HTTP response body. But sometimes the response +body is necessary to explain failures. To do so, either: + +- use [`--very-verbose`] globally or per-request to get the full body response + +```hurl +GET https://foo.com/success +HTTP 200 + +GET https://foo.com/failure +[Options] +very-verbose: true +HTTP 200 + +GET https://foo.com/success +HTTP 200 +``` + +- use [`--output`] per-request and [`--ignore-asserts`]: `--ignore-asserts` will disable any check, while `--output` can +be used to output any particular response body. With this file, the response of `https://foo.com/failure` will be outputted +on standard output: + +```hurl +GET https://foo.com/success +HTTP 200 +GET https://foo.com/failure +[Options] +# use - to output on standard output, foo.bin to save on disk +output: - +HTTP 200 + +GET https://foo.com/success +HTTP 200 +``` ## Interactive Mode @@ -477,3 +511,5 @@ the returned response to Hurl. [`--error-format`]: {% link _docs/manual.md %}#error-format [`libcurl`]: https://curl.se/libcurl/ [response timings]: {% link _docs/response.md %}#timings +[`--ignore-asserts`]: {% link _docs/manual.md %}#ignore-asserts +[`--output`]: {% link _docs/manual.md %}#output diff --git a/sites/hurl.dev/_posts/2024-04-24-announcing-hurl-4.3.0.md b/sites/hurl.dev/_posts/2024-04-24-announcing-hurl-4.3.0.md index 5e4dc04..c0705c1 100644 --- a/sites/hurl.dev/_posts/2024-04-24-announcing-hurl-4.3.0.md +++ b/sites/hurl.dev/_posts/2024-04-24-announcing-hurl-4.3.0.md @@ -255,7 +255,7 @@ pool which size is roughly the current amount of CPUs and that can be configured in `--parallel` mode but reports ([HTML], [TAP], [JUnit]) keep the input files order. The parallelism used is multithread sync: the thread pool is instantiated for the whole run, each Hurl file is run -in its own thread, synchronously . We've not gone through the full multithreaded async route for implementation +in its own thread, synchronously. We've not gone through the full multithreaded async route for implementation simplicity. Moreover, there is no additional dependency, only the standard Rust lib with "classic" threads and [multiple producers / single consumer channels] to communicate between threads. diff --git a/sites/hurl.dev/_posts/2024-08-29-hurl-5.0.0-the-parallel-edition.md b/sites/hurl.dev/_posts/2024-08-29-hurl-5.0.0-the-parallel-edition.md new file mode 100644 index 0000000..871c135 --- /dev/null +++ b/sites/hurl.dev/_posts/2024-08-29-hurl-5.0.0-the-parallel-edition.md @@ -0,0 +1,322 @@ +--- +title: Hurl 5.0.0, the Parallel Edition +layout: blog +section: Blog +permalink: /blog/:year/:month/:day/:title.html +--- + +# {{ page.title }} + + + +

+ + + + + Hurl 5.0.0, the parallel edition + +

+ +The Hurl team is thrilled to announce [Hurl 5.0.0] Partying face emoji ! + +[Hurl] is a command line tool powered by [curl], that runs HTTP requests defined in a simple plain text format: + +```hurl +GET https://example.org/api/tests/4567 +HTTP 200 +[Asserts] +header "x-foo" contains "bar" +certificate "Expire-Date" daysAfterNow > 15 +jsonpath "$.status" == "RUNNING" # Check the status code +jsonpath "$.tests" count == 25 # Check the number of items +jsonpath "$.id" matches /\d{4}/ # Check the format of the id +``` + +## What’s New in This Release + +- [Run Tests in Parallel](#run-tests-in-parallel) +- [Better Error Display](#better-error-display) +- [JSON Report](#json-report) +- [Directories as Input](#directories-as-input) +- [Time Units](#time-units) +- [Others](#others) + +## Run Tests in Parallel + +By default, Hurl runs requests as an HTTP client, outputting response bodies. For instance, this file: + +```hurl +POST https://example.com/login +[FormParams] +user: Bob +password: secret +HTTP 302 + +GET https://example.com/protected +Content-Type: text/plain; charset=UTF-8 +HTTP 200 +``` + +When executed, Hurl outputs the response body behind `protected` path: + +```shell +$ hurl protected.hurl +Hello World! +``` + +Another usage of Hurl is to run tests against APIs, HTML content etc... With [`--test`], Hurl displays a nice test oriented +report: + +```shell +$ hurl --test *.hurl +e.hurl: Success (1 request(s) in 191 ms) +a.hurl: Success (1 request(s) in 190 ms) +d.hurl: Success (1 request(s) in 196 ms) +b.hurl: Success (1 request(s) in 197 ms) +error: Assert status code + --> c.hurl:2:6 + | + | GET https://hurl.dev + 2 | HTTP 301 + | ^^^ actual value is <200> + | + +c.hurl: Failure (1 request(s) in 198 ms) +-------------------------------------------------------------------------------- +Executed files: 5 +Executed requests: 5 (25.0/s) +Succeeded files: 4 (80.0%) +Failed files: 1 (20.0%) +Duration: 200 ms +``` + +Before 5.0.0, each Hurl file was executed sequentially, one-by-one. Starting with 5.0.0, tests are now, by +default, __run in parallel, allowing blazingly fast execution!__ + +To develop this feature, we take a lot of inspiration of the venerable [GNU Parallel]. + +In parallel mode, each Hurl file is executed on its own thread, sharing nothing with other jobs. There is a thread +pool which size is roughly the current amount of CPUs and that can be configured with [`--jobs`] option. During parallel +execution, standard output and error are buffered for each file and only displayed on screen when a job is finished. +This way, debug logs and messages are never interleaved between execution. Order of execution is not guaranteed in +`--parallel` mode but reports ([HTML], [TAP], [JSON] and [JUnit]) keep the input files order. + +The parallelism used is multithread sync: the thread pool is instantiated for the whole run, each Hurl file is run +in its own thread, synchronously. We've not gone through the full multithreaded async route for implementation +simplicity. Moreover, there is no additional dependency, only the standard Rust lib with "classic" threads and +[multiple producers / single consumer channels] to communicate between threads. + +What's also exciting is that we have also introduced in 5.0.0 a [`--repeat` option], that repeats the input file a given +number of times. Let's say we've a stress test `stress.hurl`. Now we can play it 1000 times, with a pool of 16 jobs with +a single command: + +```shell +$ hurl --test --jobs 16 --repeat 1000 stress.hurl +``` + +For the anecdote, in our day job, we've found a regression in a [Java `getRandom` method] (part of Apache Common library) +using these options. With a very simple Hurl file and a single command, we were able to reliably reproduce performances +issues with concurrent request. How convenient! + +A last word about this new exciting feature: tests may need to be executed one-by-one for various reason. In this case, +just limit the number of jobs to one (`--jobs 1`), and the tests will be run sequentially, as before 5.0.0 + +Hurl is quite famous for being fast, wait to see how incredible it is now! + +## Better Error Display + +Starting with 5.0.0, we've begun to improve error rendering. We started to work on [multiline body assertions] to set +the foundation for better error diagnostics with all type of asserts. + +Let's say we've an endpoint which returns a CSV file. Using multiline body assertions, our Hurl test is: + +~~~hurl +GET http://localhost:8000/deniro.csv +HTTP 200 +``` +"Year", "Score", "Title" +1968, 86, "Greetings" +1970, 17, "Bloody Mama" +1970, 73, "Hi, Mom!" +1971, 40, "Born to Win" +1973, 98, "Mean Streets" +1973, 88, "Bang the Drum Slowly" +1974, 97, "The Godfather, Part II" +1976, 41, "The Last Tycoon" +1976, 99, "Taxi Driver" +1977, 47, "1900" +1978, 67, "New York,New York" +1978, 93, "The Deer Hunter" +1980, 97, "Raging Bull" +1981, 75, "True Confessions" +1983, 90, "The King of Comedy" +1984, 90, "Once Upon a Time" +1984, 60, "Falling in Love" +1985, 98, "Brazil" +1986, 65, "The Mission" +``` +~~~ + +Before 5.0.0, if we have differences between the expected body response and the real response, Hurl output was: + +```shell +$ hurl deniro.hurl +error: Assert body value + --> test.hurl:4:1 + | + | GET http://localhost:8000/deniro.csv + | ... + 4 | "Year", "Score", "Title" + | ^ actual value is <"Year", "Score", "Title" + | 1968, 86, "Greetings" + | 1970, 17, "Bloody Mama" + | 1970, 73, "Hi, Mom!" + | 1971, 40, "Born to Win" + | 1973, 98, "Mean Streets" + | 1973, 88, "Bang the Drum Slowly" + | 1974, 97, "The Godfather, Part II" + | 1976, 41, "The Last Tycoon" + | 1976, 99, "Taxi Driver" + | 1977, 47, "1900" + | 1977, 67, "New York, New York" + | 1978, 93, "The Deer Hunter" + | 1980, 97, "Raging Bull" + | 1981, 75, "True Confessions" + | 1983, 90, "The King of Comedy" + | 1984, 89, "Once Upon a Time in America" + | 1984, 60, "Falling in Love" + | 1985, 98, "Brazil" + | 1986, 65, "The Mission" + | + | > + | +``` + +The diagnostic was rather basic: we indicated the start of the expected body line, and dumped the whole actual body +response. + + +With Hurl 5.0.0, we've begun to use diffing algorithms to improve the error rendering: + +```shell +error: Assert body value + --> test.hurl:15:1 + | + | GET http://localhost:8000/deniro.csv + | ... +15 | 1978, 67, "New York,New York" + | -1978, 67, "New York,New York" + | +1977, 67, "New York, New York" + | +``` + +Now, we point to the first line where a difference occurs. It's more focused, with less noise and we now have a base to +improve (display all the differences instead of just the first for instance). + +Under the hood, we're using the excellent zero-dependency [Similar Rust crate] from [Armin Ronacher]. We're very reluctant +to add new dependencies to Hurl, and we were very happy to find such a high quality library without additional costs. + +## JSON Report + +Along side [HTML], [TAP], [JUnit], Hurl 5.0.0 introduces a brand-new type of report: the [JSON report]! +With [`--report-json`], you can export a whole Hurl test session in a structured data-oriented report. Every HTTP +response headers, bodies is saved and accessible for analyse. + +```shell +$ hurl --test --report-json build/report integration/*.hurl +``` + +Very convenient, and also different reports can be combined: + +```shell +$ hurl --test \ + --report-json build/report/json \ + --report-html build/report/html \ + integration/*.hurl +``` + +## Directories as Input + +A little quality of life improvement: Hurl can use directories as input and recursively looks for `.hurl` files. + +Instead of: + +```shell +$ hurl --test integration/*.hurl +``` + +You can write: + +```shell +$ hurl --test integration/ +``` + +Or even + +```shell +$ hurl --test . +``` + +And we take care of running your Hurl files! + +## Time Units + +Another small but nifty improvements: _time units_! + +When it makes sens, you can specify time units, either in `[Options]` section or in command line options. For instance, +if we want to retry this request on error, with 2 seconds spaced retried, we can write: + +```hurl +GET https://foo.com/api +[Options] +retry: 10 # maximum number of retries +retry-interval: 2s # retries are 2 seconds spaced +HTTP 200 +[Asserts] +jsonpath "$.state" == "ok" +``` + +Using the new [`--repeat`] option, we can adjust our benchmarks by introducing a slight delay between requests with +`--delay 15ms`: + +```shell +$ hurl --test --repeat 500 --delay 15ms benchmark.hurl +``` + +Or specify a 30 seconds timeout: + +```shell +$ hurl --max-time 30s foo.hurl +``` + +## Others + +There are a lot other improvements with Hurl 5.0.0 and also a lot of bug fixes, +you can check the complete list of enhancements and bug fixes [in our release note]. + +If you like Hurl, don't hesitate to [give us a star on GitHub] or share it on [Twitter]! + +We'll be happy to hear from you, either for enhancement requests or for sharing your success story using Hurl! + +[Hurl 5.0.0]: https://github.com/Orange-OpenSource/hurl/releases/tag/5.0.0 +[Hurl]: https://hurl.dev +[curl]: https://curl.se +[`--test`]: {% link _docs/running-tests.md %} +[`--jobs`]: {% link _docs/manual.md %}#jobs +[HTML]: {% link _docs/running-tests.md %}#html-report +[TAP]: {% link _docs/running-tests.md %}#tap-report +[JUnit]: {% link _docs/running-tests.md %}#junit-report +[JSON]: {% link _docs/running-tests.md %}#json-report +[JSON report]: {% link _docs/running-tests.md %}#json-report +[GNU Parallel]: https://www.gnu.org/software/parallel/ +[multiple producers / single consumer channels]: https://doc.rust-lang.org/book/ch16-02-message-passing.html +[Armin Ronacher]: https://x.com/mitsuhiko +[Similar Rust crate]: https://github.com/mitsuhiko/similar +[multiline body assertions]: {% link _docs/asserting-response.md %}#multiline-string-body +[Java `getRandom` method]: https://issues.apache.org/jira/browse/LANG-1748 +[`--repeat` option]: {% link _docs/manual.md %}#repeat +[in our release note]: https://github.com/Orange-OpenSource/hurl/releases/tag/5.0.0 +[Twitter]: https://x.com/HurlDev +[give us a star on GitHub]: https://github.com/Orange-OpenSource/hurl/stargazers + diff --git a/sites/hurl.dev/_sass/_code.scss b/sites/hurl.dev/_sass/_code.scss index 80a71fb..4621a7b 100644 --- a/sites/hurl.dev/_sass/_code.scss +++ b/sites/hurl.dev/_sass/_code.scss @@ -70,6 +70,10 @@ pre, code { color: $hurl-number-light; color: var(--hurl-number); } + .unit { + color: $hurl-number-light; + color: var(--hurl-number); + } .boolean { color: $hurl-boolean-light; color: var(--hurl-boolean); diff --git a/sites/hurl.dev/assets/cast/starwars.cast b/sites/hurl.dev/assets/cast/starwars.cast new file mode 100644 index 0000000..d54ef82 --- /dev/null +++ b/sites/hurl.dev/assets/cast/starwars.cast @@ -0,0 +1,252 @@ +{"version": 2, "width": 80, "height": 25, "timestamp": 1723199510, "env": {"PROMPT": "%F{245}%~%f %F{cyan}$%f ", "SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.078741, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[0.079238, "o", "\u001b]7;file://MC-HC7200XP73/Users/jc/Documents/Dev/hurl-video\u0007"] +[0.080786, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[36m$\u001b[39m \u001b[K\u001b[?2004h"] +[0.840789, "o", "v"] +[1.078007, "o", "\bvi"] +[1.290752, "o", "m"] +[1.349601, "o", " "] +[1.561981, "o", "s"] +[1.744498, "o", "t"] +[1.844444, "o", "a"] +[1.937816, "o", "r"] +[2.114978, "o", "w"] +[2.343714, "o", "a"] +[2.506271, "o", "r"] +[2.642025, "o", "s"] +[3.0524, "o", "."] +[3.351009, "o", "h"] +[3.546132, "o", "u"] +[3.661939, "o", "r"] +[3.969756, "o", "l"] +[4.28651, "o", "\u001b[?2004l\r\r\n"] +[4.356357, "o", "\u001b[?1049h\u001b[>4;2m\u001b[?1h\u001b=\u001b[?2004h\u001b[?1004h\u001b[1;25r\u001b[?12h\u001b[?12l\u001b[22;2t\u001b[22;1t"] +[4.358706, "o", "\u001b[27m\u001b[23m\u001b[29m\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[H\u001b[2J\u001b[?25l\u001b[25;1H\"starwars.hurl\" [New]"] +[4.364192, "o", "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[3;1H\u001bPzz\u001b\\\u001b[0%m\u001b[6n\u001b[3;1H \u001b[1;1H\u001b[>c\u001b]10;?\u0007\u001b]11;?\u0007"] +[4.364676, "o", "\u001b[1;1H\u001b[38;5;242m 1 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m~ \u001b[3;1H~ \u001b[4;1H~ \u001b[5;1H~ \u001b[6;1H~ \u001b[7;1H~ \u001b[8;1H~ \u001b[9;1H~ \u001b[10;1H~ \u001b[11;1H~ \u001b[12;1H~ \u001b[13;1H~ "] +[4.36475, "o", " \u001b[14;1H~ \u001b[15;1H~ \u001b[16;1H~ \u001b[17;1H~ \u001b[18;1H~ \u001b[19;1H~ \u001b[20;1H~ \u001b[21;1H~ \u001b[22;1H~ \u001b[23;1H~ \u001b[m\u001b[38;5;231m"] +[4.364786, "o", "\u001b[48;5;235m\u001b[24;1H\u001b[38;5;238m\u001b[48;5;117m NORMAL \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;252m\u001b[48;5;240m starwars.hurl \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;248m\u001b[48;5;238m unix | utf-8 | hurl \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;247m\u001b[48;5;240m 100% \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;238m\u001b[48;5;244m 0:0 \u001b[1;5H\u001b[?25h\u001b[?4m"] +[4.940239, "o", "\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;1H\u001b[38;5;238m\u001b[48;5;119m INSERT \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[69C\u001b[38;5;238m\u001b[48;5;244m1\u001b[1;5H\u001b[?25l\u001b[?25h"] +[5.298807, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mG\u001b[24;24H\u001b[38;5;252m\u001b[48;5;240m| + \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[48C\u001b[38;5;238m\u001b[48;5;244m1:2\u001b[1;6H\u001b[?25h"] +[5.418816, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mE\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[1;7H\u001b[?25h"] +[5.566911, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\b\b\u001b[38;5;214mGET\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[1;8H\u001b[?25h"] +[5.647682, "o", "\u001b[?25l\u001b[24;78H5\u001b[1;9H\u001b[?25h"] +[6.062742, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mh\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m6\u001b[1;10H\u001b[?25h"] +[6.303656, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mt\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[1;11H\u001b[?25h"] +[6.430176, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mt\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[1;12H\u001b[?25h"] +[6.765172, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[1;13H\u001b[?25h"] +[6.901504, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ms\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m10\u001b[1;14H\u001b[?25h"] +[7.156304, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m:\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[1;15H\u001b[?25h"] +[7.487189, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[1;16H\u001b[?25h"] +[7.638695, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[1;17H\u001b[?25h"] +[8.491368, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ms\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[1;18H\u001b[?25h"] +[8.663322, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mw\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[1;19H\u001b[?25h"] +[8.891246, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ma\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m6\u001b[1;20H\u001b[?25h"] +[9.058838, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m7\u001b[1;21H\u001b[?25h"] +[9.136986, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mi\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m8\u001b[1;22H\u001b[?25h"] +[9.475052, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m.\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m9\u001b[1;23H\u001b[?25h"] +[9.696255, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45md\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m20\u001b[1;24H\u001b[?25h"] +[9.872936, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[1;25H\u001b[?25h"] +[10.002114, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mv\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[1;26H\u001b[?25h"] +[10.593508, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[1;27H\u001b[?25h"] +[11.668523, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ma\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[1;28H\u001b[?25h"] +[11.838905, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[1;29H\u001b[?25h"] +[11.916432, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mi\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m6\u001b[1;30H\u001b[?25h"] +[12.353964, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m7\u001b[1;31H\u001b[?25h"] +[12.813153, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m8\u001b[1;32H\u001b[?25h"] +[12.908878, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m9\u001b[1;33H\u001b[?25h"] +[13.013648, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mo\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m30\u001b[1;34H\u001b[?25h"] +[13.184419, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[1;35H\u001b[?25h"] +[13.354872, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ml\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[1;36H\u001b[?25h"] +[13.466251, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[1;37H\u001b[?25h"] +[13.797247, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 2 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[2;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m2:1 \u001b[2;5H\u001b[?25h"] +[14.388735, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mH\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m2\u001b[2;6H\u001b[?25h"] +[14.588373, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mT\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[2;7H\u001b[?25h"] +[14.719378, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mT\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[2;8H\u001b[?25h"] +[15.039987, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mP\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m5\u001b[2;9H\u001b[?25h"] +[15.265073, "o", "\u001b[?25l\u001b[24;78H6\u001b[2;10H\u001b[?25h"] +[15.692804, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m2\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[2;11H\u001b[?25h"] +[15.975594, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m0\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[2;12H\u001b[?25h"] +[16.119057, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m0\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[2;13H\u001b[?25h"] +[16.497229, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 3 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[3;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m3:1\u001b[3;5H\u001b[?25h"] +[17.294757, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m[\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m2\u001b[3;6H\u001b[?25h"] +[17.723488, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mA\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[3;7H\u001b[?25h"] +[18.221719, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[3;8H\u001b[?25h"] +[18.341932, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m5\u001b[3;9H\u001b[?25h"] +[18.558075, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235me\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m6\u001b[3;10H\u001b[?25h"] +[18.753873, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mr\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[3;11H\u001b[?25h"] +[18.930166, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mt\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[3;12H\u001b[?25h"] +[19.06522, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[3;13H\u001b[?25h"] +[19.841055, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[3;5H\u001b[95m[Asserts]\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[3;5H\u001b[4m\u001b[38;5;197m[\u001b[7C]\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m10\u001b[3;14H\u001b[?25h"] +[20.338888, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 4 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4;5H\u001b[K\u001b[3;5H\u001b[95m[\u001b[7C]\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m4:1 \u001b[4;5H\u001b[?25h"] +[20.819063, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mj\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m2\u001b[4;6H\u001b[?25h"] +[20.945817, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[4;7H\u001b[?25h"] +[21.145082, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mo\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[4;8H\u001b[?25h"] +[21.187248, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mn\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m5\u001b[4;9H\u001b[?25h"] +[21.605866, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mp\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m6\u001b[4;10H\u001b[?25h"] +[21.786839, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ma\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[4;11H\u001b[?25h"] +[21.909928, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mt\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[4;12H\u001b[?25h"] +[22.108092, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4;5H\u001b[38;5;45mjsonpath\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[4;13H\u001b[?25h"] +[22.190372, "o", "\u001b[?25l\u001b[24;78H10\u001b[4;14H\u001b[?25h"] +[22.48205, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m\"\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[4;15H\u001b[?25h"] +[23.02036, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m$\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[4;16H\u001b[?25h"] +[23.470271, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m.\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[4;17H\u001b[?25h"] +[23.631396, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mc\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[4;18H\u001b[?25h"] +[23.984213, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mo\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[4;19H\u001b[?25h"] +[24.04437, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mu\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m6\u001b[4;20H\u001b[?25h"] +[24.267468, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mn\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m7\u001b[4;21H\u001b[?25h"] +[24.393243, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mt\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m8\u001b[4;22H\u001b[?25h"] +[24.664193, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m\"\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m9\u001b[4;23H\u001b[?25h"] +[24.853248, "o", "\u001b[?25l\u001b[24;78H20\u001b[4;24H\u001b[?25h"] +[25.503289, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m=\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[4;25H\u001b[?25h"] +[25.631998, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\b\u001b[38;5;214m==\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[4;26H\u001b[?25h"] +[25.949905, "o", "\u001b[?25l\u001b[24;79H3\u001b[4;27H\u001b[?25h"] +[26.304888, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m8\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[4;28H\u001b[?25h"] +[26.702835, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m2\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[4;29H\u001b[?25h"] +[27.276702, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 5 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[5;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m5:1 \u001b[5;5H\u001b[?25h"] +[27.494039, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 6 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[6;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m6\u001b[6;5H\u001b[?25h"] +[27.684934, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 7 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[7;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m7\u001b[7;5H\u001b[?25h"] +[28.568632, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mG\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m2\u001b[7;6H\u001b[?25h"] +[28.71621, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mE\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[7;7H\u001b[?25h"] +[28.905324, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\b\b\u001b[38;5;214mGET\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[7;8H\u001b[?25h"] +[29.338985, "o", "\u001b[?25l\u001b[24;78H5\u001b[7;9H\u001b[?25h"] +[29.728541, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mh\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m6\u001b[7;10H\u001b[?25h"] +[29.990712, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mt\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[7;11H\u001b[?25h"] +[30.108971, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mt\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[7;12H\u001b[?25h"] +[30.418408, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[7;13H\u001b[?25h"] +[30.573449, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ms\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m10\u001b[7;14H\u001b[?25h"] +[30.758137, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m:\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[7;15H\u001b[?25h"] +[31.133505, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[7;16H\u001b[?25h"] +[31.287384, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[7;17H\u001b[?25h"] +[32.270885, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ms\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[7;18H\u001b[?25h"] +[32.45389, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mw\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[7;19H\u001b[?25h"] +[32.67406, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ma\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m6\u001b[7;20H\u001b[?25h"] +[32.820671, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m7\u001b[7;21H\u001b[?25h"] +[32.887546, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mi\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m8\u001b[7;22H\u001b[?25h"] +[33.216276, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m.\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m9\u001b[7;23H\u001b[?25h"] +[33.404815, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45md\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m20\u001b[7;24H\u001b[?25h"] +[33.553972, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[7;25H\u001b[?25h"] +[33.668833, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mv\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[7;26H\u001b[?25h"] +[34.169994, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[7;27H\u001b[?25h"] +[34.302288, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ma\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[7;28H\u001b[?25h"] +[34.577465, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[7;29H\u001b[?25h"] +[34.635267, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mi\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m6\u001b[7;30H\u001b[?25h"] +[35.220359, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m7\u001b[7;31H\u001b[?25h"] +[36.158715, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m8\u001b[7;32H\u001b[?25h"] +[36.224745, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m9\u001b[7;33H\u001b[?25h"] +[36.368727, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mo\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m30\u001b[7;34H\u001b[?25h"] +[36.538358, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45mp\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[7;35H\u001b[?25h"] +[36.711555, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45ml\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[7;36H\u001b[?25h"] +[36.83972, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[7;37H\u001b[?25h"] +[37.107956, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m/\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[7;38H\u001b[?25h"] +[37.444186, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[4m\u001b[38;5;45m1\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[7;39H\u001b[?25h"] +[37.859536, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 8 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[8;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m8:1 \u001b[8;5H\u001b[?25h"] +[38.567553, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mH\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m2\u001b[8;6H\u001b[?25h"] +[38.806253, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mT\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[8;7H\u001b[?25h"] +[38.92605, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mT\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[8;8H\u001b[?25h"] +[39.231014, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mP\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m5\u001b[8;9H\u001b[?25h"] +[39.447535, "o", "\u001b[?25l\u001b[24;78H6\u001b[8;10H\u001b[?25h"] +[39.821254, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m2\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[8;11H\u001b[?25h"] +[40.043375, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m0\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[8;12H\u001b[?25h"] +[40.19373, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;39m0\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[8;13H\u001b[?25h"] +[40.76209, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 9 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[9;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m9:1\u001b[9;5H\u001b[?25h"] +[41.622651, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m[\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m2\u001b[9;6H\u001b[?25h"] +[42.073233, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mA\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[9;7H\u001b[?25h"] +[42.314315, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[9;8H\u001b[?25h"] +[42.452406, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m5\u001b[9;9H\u001b[?25h"] +[42.699116, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235me\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m6\u001b[9;10H\u001b[?25h"] +[42.890233, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mr\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[9;11H\u001b[?25h"] +[43.076122, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mt\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[9;12H\u001b[?25h"] +[43.200982, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[9;13H\u001b[?25h"] +[43.767973, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[9;5H\u001b[95m[Asserts]\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[9;5H\u001b[4m\u001b[38;5;197m[\u001b[7C]\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m10\u001b[9;14H\u001b[?25h"] +[44.105076, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 10 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[10;5H\u001b[K\u001b[9;5H\u001b[95m[\u001b[7C]\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;75H\u001b[38;5;238m\u001b[48;5;244m10:1 \u001b[10;5H\u001b[?25h"] +[44.519018, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mj\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m2\u001b[10;6H\u001b[?25h"] +[44.633224, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ms\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m3\u001b[10;7H\u001b[?25h"] +[44.851691, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mo\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m4\u001b[10;8H\u001b[?25h"] +[44.903784, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mn\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m5\u001b[10;9H\u001b[?25h"] +[45.109333, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mp\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m6\u001b[10;10H\u001b[?25h"] +[45.256541, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235ma\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m7\u001b[10;11H\u001b[?25h"] +[45.396027, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235mt\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m8\u001b[10;12H\u001b[?25h"] +[45.599163, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[10;5H\u001b[38;5;45mjsonpath\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m9\u001b[10;13H\u001b[?25h"] +[45.667307, "o", "\u001b[?25l\u001b[24;78H10\u001b[10;14H\u001b[?25h"] +[46.013033, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m\"\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[10;15H\u001b[?25h"] +[46.511559, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m$\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[10;16H\u001b[?25h"] +[46.930752, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m.\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[10;17H\u001b[?25h"] +[47.285639, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mn\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[10;18H\u001b[?25h"] +[47.412755, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34ma\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[10;19H\u001b[?25h"] +[47.635207, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mm\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m6\u001b[10;20H\u001b[?25h"] +[47.773502, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m7\u001b[10;21H\u001b[?25h"] +[48.14837, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m\"\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m8\u001b[10;22H\u001b[?25h"] +[48.462018, "o", "\u001b[?25l\u001b[24;79H9\u001b[10;23H\u001b[?25h"] +[48.810466, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m=\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m20\u001b[10;24H\u001b[?25h"] +[48.950032, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\b\u001b[38;5;214m==\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[10;25H\u001b[?25h"] +[49.526415, "o", "\u001b[?25l\u001b[24;79H2\u001b[10;26H\u001b[?25h"] +[49.822549, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m\"\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[10;27H\u001b[?25h"] +[50.94201, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mD\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[10;28H\u001b[?25h"] +[51.123086, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34ma\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[10;29H\u001b[?25h"] +[51.247713, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mr\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m6\u001b[10;30H\u001b[?25h"] +[51.944946, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mt\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m7\u001b[10;31H\u001b[?25h"] +[52.115296, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mh\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m8\u001b[10;32H\u001b[?25h"] +[52.366316, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m9\u001b[10;33H\u001b[?25h"] +[53.072486, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mV\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;78H\u001b[38;5;238m\u001b[48;5;244m30\u001b[10;34H\u001b[?25h"] +[53.477, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34ma\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m1\u001b[10;35H\u001b[?25h"] +[53.653441, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34md\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m2\u001b[10;36H\u001b[?25h"] +[53.805092, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34me\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m3\u001b[10;37H\u001b[?25h"] +[53.974461, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34mr\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m4\u001b[10;38H\u001b[?25h"] +[54.148342, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;34m\"\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;79H\u001b[38;5;238m\u001b[48;5;244m5\u001b[10;39H\u001b[?25h"] +[54.714204, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 11 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[11;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m1:1 \u001b[11;5H\u001b[?25h"] +[54.964312, "o", "\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\r\n\u001b[38;5;242m 12 \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[12;5H\u001b[K\u001b[24;76H\u001b[38;5;238m\u001b[48;5;244m2\u001b[12;5H\u001b[?25h"] +[56.472205, "o", "\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[24;1H\u001b[38;5;238m\u001b[48;5;117m NORMAL \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[69C\u001b[38;5;238m\u001b[48;5;244m0\u001b[12;5H\u001b[?25l\u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[25;1H\u001b[K\u001b[25;1H:\u001b[24;2H\u001b[38;5;238m\u001b[48;5;117mCOMMAND \u001b[m\u001b[38;5;231m\u001b[48;5;235m\u001b[38;5;252m\u001b[48;5;240m starwars.hurl | + \r\n\u001b[m\u001b[38;5;231m\u001b[48;5;235m:\u001b[?25h"] +[56.580571, "o", "w"] +[56.787525, "o", "q"] +[56.95383, "o", "\r"] +[56.956608, "o", "\u001b[?25l\u001b[?2004l\u001b[>4;m\"starwars.hurl\""] +[56.964175, "o", " [New] 12L, 170B written"] +[56.969424, "o", "\r\u001b[23;2t\u001b[23;1t\r\r\n\u001b[39;49m\u001b[?1004l\u001b[?2004l\u001b[?1l\u001b>\u001b[?1049l\u001b[?25h\u001b[>4;m"] +[56.972021, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[56.972864, "o", "\u001b]7;file://MC-HC7200XP73/Users/jc/Documents/Dev/hurl-video\u0007"] +[56.976273, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[36m$\u001b[39m \u001b[K\u001b[?2004h"] +[57.679353, "o", "h"] +[57.880288, "o", "\bhu"] +[57.970305, "o", "r"] +[58.184879, "o", "l"] +[58.239875, "o", " "] +[58.530516, "o", "-"] +[58.665894, "o", "-"] +[58.985386, "o", "t"] +[59.032842, "o", "e"] +[59.232462, "o", "s"] +[59.324253, "o", "t"] +[59.393076, "o", " "] +[59.969847, "o", "."] +[60.440952, "o", "\u001b[?2004l\r\r\n"] +[60.462086, "o", "Executed files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./basic.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./securi"] +[60.462149, "o", "ty.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./basic.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./basic.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.462359, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./basic.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K"] +[60.462393, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./basic.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.605598, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K"] +[60.605832, "o", "Executed files: 0/8 (0%)\r\n[> ] 1/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[======> ] 2/4 \u001b[1m./basic.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.706138, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K"] +[60.706271, "o", "\u001b[1m./basic.hurl\u001b[0m: \u001b[1;32mSuccess\u001b[0m (4 request(s) in 240 ms)\r\nExecuted files: 1/8 (12%)\r\n[==================> ] 4/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[========> ] 3/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[==================> ] 4/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[==================> ] 4/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.709483, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K"] +[60.709524, "o", "Executed files: 1/8 (12%)\r\n[==================> ] 4/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[==================> ] 4/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[==================> ] 4/4 \u001b[1m./stress.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.716466, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1m./stress.hurl\u001b[0m: \u001b[1;32mSuccess\u001b[0m (4 request(s) in 251 ms)\r\n"] +[60.716816, "o", "Executed files: 2/8 (25%)\r\n[==================> ] 4/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[==================> ] 4/4 \u001b[1m./new-user.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.721238, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1m./new-user.hurl\u001b[0m: \u001b[1;32mSuccess\u001b[0m (4 request(s) in 258 ms)\r\n"] +[60.721342, "o", "Executed files: 3/8 (37%)\r\n[==================> ] 4/4 \u001b[1m./security.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.726821, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1m./security.hurl\u001b[0m: \u001b[1;32mSuccess\u001b[0m (4 request(s) in 262 ms)\r\n"] +[60.726963, "o", "Executed files: 4/8 (50%)\r\n[============> ] 4/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.729809, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K"] +[60.729832, "o", "Executed files: 4/8 (50%)\r\n[============> ] 4/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[================> ] 5/6 \u001b[1m./logout.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[============> ] 4/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.776048, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1m./logout.hurl\u001b[0m: \u001b[1;32mSuccess\u001b[0m (6 request(s) in 312 ms)\r\nExecuted files: 5/8 (62%)\r\n[====================> ] 6/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[====================> ] 6/6 \u001b[1m./login.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.785489, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1m./login.hurl\u001b[0m: \u001b[1;32mSuccess\u001b[0m (6 request(s) in 319 ms)\r\nExecuted files: 6/8 (75%)\r\n[====================> ] 6/6 \u001b[1m./health.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[60.787262, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1m./health.hurl\u001b[0m: \u001b[1;32mSuccess\u001b[0m (6 request(s) in 323 ms)"] +[60.787365, "o", "\r\nExecuted files: 7/8 (87%)\r\n[> ] 1/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[61.246685, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[KExecuted files: 7/8 (87%)\r\n[============> ] 2/2 \u001b[1m./starwars.hurl\u001b[0m: \u001b[1;36mRunning\u001b[0m\r\n"] +[61.292936, "o", "\u001b[1A\u001b[K\u001b[1A\u001b[K\u001b[1;31merror\u001b[0m: \u001b[1mAssert failure\u001b[0m\r\n \u001b[1;34m-->\u001b[0m ./starwars.hurl:10:0\r\n\u001b[1;34m |\u001b[0m\r\n\u001b[1;34m |\u001b[0m \u001b[90mGET https://swapi.dev/api/people/1\u001b[0m\r\n\u001b[1;34m |\u001b[0m\u001b[90m ...\u001b[0m\r\n\u001b[1;34m10 |\u001b[0m jsonpath \"$.name\" == \"Darth Vader\"\r\n\u001b[1;34m |\u001b[0m\u001b[1;31m actual: string \u001b[0m\r\n\u001b[1;34m |\u001b[0m\u001b[1;31m expected: string \u001b[0m\r\n\u001b[1;34m |\u001b[0m\r\n\r\n\u001b[1m./starwars.hurl\u001b[0m: \u001b[1;31mFailure\u001b[0m (2 request(s) in 828 ms)\r\n"] +[61.293031, "o", "--------------------------------------------------------------------------------\r\nExecuted files: 8\r\nExecuted requests: 36 (43.3/s)\r\nSucceeded files: 7 (87.5%)\r\nFailed files: 1 (12.5%)\r\nDuration: 832 ms\r\n\r\n"] +[61.295473, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] +[61.296453, "o", "\u001b]7;file://MC-HC7200XP73/Users/jc/Documents/Dev/hurl-video\u0007"] +[61.300128, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[36m$\u001b[39m \u001b[K"] +[61.300235, "o", "\u001b[?2004h"] +[69.897119, "o", "\u001b[?2004l\r\r\n"] diff --git a/sites/hurl.dev/assets/img/hurl-parallel.avif b/sites/hurl.dev/assets/img/hurl-parallel.avif new file mode 100644 index 0000000..f9d886c Binary files /dev/null and b/sites/hurl.dev/assets/img/hurl-parallel.avif differ diff --git a/sites/hurl.dev/assets/img/hurl-parallel.png b/sites/hurl.dev/assets/img/hurl-parallel.png new file mode 100644 index 0000000..e0fbcd0 Binary files /dev/null and b/sites/hurl.dev/assets/img/hurl-parallel.png differ diff --git a/sites/hurl.dev/assets/img/hurl-parallel.webp b/sites/hurl.dev/assets/img/hurl-parallel.webp new file mode 100644 index 0000000..235c8a7 Binary files /dev/null and b/sites/hurl.dev/assets/img/hurl-parallel.webp differ diff --git a/sites/hurl.dev/assets/img/run-cycle-dark.svg b/sites/hurl.dev/assets/img/run-cycle-dark.svg new file mode 100644 index 0000000..61ee9b9 --- /dev/null +++ b/sites/hurl.dev/assets/img/run-cycle-dark.svg @@ -0,0 +1,3 @@ + + +
START
START
Entry 
to run?
Entry...
Eval
entry options
Eval...
YES
YES
SUCCESS
SUCCESS
NO
NO
Skip?
Skip?
Delay?
Delay?
NO
NO
Sleep delay
Sleep delay
YES
YES
Run HTTP requests
Run HTTP requests
NO
NO
Eval errors
Eval errors
Eval captures
Eval captures
Errors?
Errors?
Increment
repeat index
Increment...
NO
NO
Sleep
retry interval
Sleep...
YES
YES
Retry?
Retry?
YES
YES
ERROR
ERROR
NO
NO
Repeat?
Repeat?
YES
YES
Increment
entry index
Increment...
NO
NO
YES
YES
\ No newline at end of file diff --git a/sites/hurl.dev/assets/img/run-cycle-light.svg b/sites/hurl.dev/assets/img/run-cycle-light.svg new file mode 100644 index 0000000..a5c4c64 --- /dev/null +++ b/sites/hurl.dev/assets/img/run-cycle-light.svg @@ -0,0 +1,3 @@ + + +
START
START
Entry 
to run?
Entry...
Eval
entry options
Eval...
YES
YES
SUCCESS
SUCCESS
NO
NO
Skip?
Skip?
Delay?
Delay?
NO
NO
Sleep delay
Sleep delay
YES
YES
Run HTTP requests
Run HTTP requests
NO
NO
Eval errors
Eval errors
Eval captures
Eval captures
Errors?
Errors?
Increment
repeat index
Increment...
NO
NO
Sleep
retry interval
Sleep...
YES
YES
Retry?
Retry?
YES
YES
ERROR
ERROR
NO
NO
Repeat?
Repeat?
YES
YES
Increment
entry index
Increment...
NO
NO
YES
YES
\ No newline at end of file diff --git a/sites/hurl.dev/assets/js/home.js b/sites/hurl.dev/assets/js/home.js index cf61e61..1b7038a 100644 --- a/sites/hurl.dev/assets/js/home.js +++ b/sites/hurl.dev/assets/js/home.js @@ -1,14 +1,14 @@ -document.getElementById("home-samples").addEventListener("change", (event) => selectSample(event.target.value)); - -function selectSample(sampleId) { +document.getElementById("home-samples") + .addEventListener("change", (event) => { + const sampleId = event.target.value; const divSample = document.querySelector(".home-sample"); const sample = document.querySelector("." + sampleId); divSample.innerHTML = sample.outerHTML; -} +}); -AsciinemaPlayer.create('/assets/cast/hurl.cast', document.getElementById('home-demo'), { +AsciinemaPlayer.create('/assets/cast/starwars.cast', document.getElementById('home-demo'), { loop: true, speed: 3, theme: "asciinema", - poster: "npt:1:00", + poster: "npt:00:56", }); diff --git a/sites/macos/hurlfmt b/sites/macos/hurlfmt index 4b28eaf..8697472 100755 Binary files a/sites/macos/hurlfmt and b/sites/macos/hurlfmt differ