From 87d16014c38b824fca14db6538a49b8051015793 Mon Sep 17 00:00:00 2001 From: Cathal Mullan Date: Sat, 4 Jan 2025 16:08:27 +0000 Subject: [PATCH] Focus only on path routing. --- BENCHMARKING.md | 37 +- Cargo.lock | 124 +- Cargo.toml | 33 +- README.md | 422 +- TODO.md | 10 - benches/gitlab_criterion.rs | 82 - benches/gitlab_divan.rs | 58 - benches/gitlab_routes.rs | 38 - benches/matchit_criterion.rs | 49 +- benches/matchit_divan.rs | 49 +- benches/path_tree_criterion.rs | 61 +- benches/path_tree_divan.rs | 61 +- crates/authority/Cargo.toml | 23 - crates/authority/src/constraints.rs | 5 - crates/authority/src/delete.rs | 142 - crates/authority/src/display.rs | 103 - crates/authority/src/errors.rs | 17 - crates/authority/src/errors/constraint.rs | 37 - crates/authority/src/errors/delete.rs | 54 - crates/authority/src/errors/encoding.rs | 53 - crates/authority/src/errors/insert.rs | 35 - crates/authority/src/errors/search.rs | 25 - crates/authority/src/errors/template.rs | 483 - crates/authority/src/find.rs | 111 - crates/authority/src/id.rs | 26 - crates/authority/src/insert.rs | 239 - crates/authority/src/lib.rs | 222 - crates/authority/src/node.rs | 44 - crates/authority/src/optimize.rs | 109 - crates/authority/src/parser.rs | 468 - crates/authority/src/search.rs | 333 - crates/method/Cargo.toml | 23 - crates/method/src/display.rs | 29 - crates/method/src/errors.rs | 8 - crates/method/src/errors/delete.rs | 15 - crates/method/src/errors/insert.rs | 15 - crates/method/src/errors/search.rs | 14 - crates/method/src/id.rs | 26 - crates/method/src/lib.rs | 116 - crates/path/Cargo.toml | 23 - crates/path/src/errors.rs | 17 - crates/path/src/errors/delete.rs | 109 - crates/path/src/errors/encoding.rs | 53 - crates/path/src/errors/insert.rs | 64 - crates/path/src/errors/search.rs | 25 - crates/path/src/find.rs | 111 - crates/path/src/id.rs | 22 - crates/path/src/lib.rs | 304 - crates/path/src/node.rs | 44 - crates/path/src/state.rs | 284 - crates/path/src/vec.rs | 82 - crates/percent/Cargo.toml | 19 - crates/percent/src/errors.rs | 66 - crates/percent/src/lib.rs | 273 - crates/punycode/Cargo.toml | 19 - crates/punycode/src/errors.rs | 257 - crates/punycode/src/lib.rs | 663 - crates/rails-macro/Cargo.toml | 30 - crates/rails-macro/src/lib.rs | 60 - crates/rails/Cargo.toml | 31 - crates/rails/README.md | 57 - crates/rails/input/routes.txt | 10510 ----- crates/rails/output/routes.json | 37912 ---------------- crates/rails/src/main.rs | 846 - docs/Authority.md | 3 - docs/Method.md | 3 - docs/Path.md | 3 - examples/oci/Cargo.toml | 2 +- examples/oci/src/constraints/name.rs | 7 +- examples/oci/src/extract.rs | 7 +- examples/oci/src/extract/body.rs | 10 +- examples/oci/src/extract/method.rs | 7 +- examples/oci/src/extract/path.rs | 14 +- examples/oci/src/extract/query.rs | 13 +- examples/oci/src/extract/route.rs | 7 +- examples/oci/src/handler.rs | 3 +- examples/oci/src/lib.rs | 115 +- examples/oci/src/main.rs | 3 +- examples/oci/src/response.rs | 3 +- examples/oci/src/router.rs | 106 +- examples/oci/src/routes/blob.rs | 13 +- examples/oci/src/routes/manifest.rs | 13 +- examples/oci/src/routes/root.rs | 3 +- examples/oci/src/routes/tags.rs | 11 +- examples/oci/src/state.rs | 6 +- examples/oci/src/types/digest.rs | 3 +- flake.lock | 12 +- fuzz/fuzz_targets/e2e.rs | 11 +- src/chain.rs | 15 - {crates/path/src => src}/constraints.rs | 36 +- src/decode/punycode.rs | 671 - {crates/path/src => src}/delete.rs | 65 +- {crates/path/src => src}/display.rs | 17 +- src/errors.rs | 37 +- {crates/path/src => src}/errors/constraint.rs | 2 +- src/errors/delete.rs | 108 +- src/errors/encoding.rs | 17 - src/errors/insert.rs | 69 +- src/errors/request.rs | 50 - src/errors/route.rs | 128 - src/errors/search.rs | 29 +- {crates/path/src => src}/errors/template.rs | 27 +- {crates/path/src => src}/insert.rs | 70 +- src/lib.rs | 32 +- src/node.rs | 35 + {crates/path/src => src}/optimize.rs | 9 +- {crates/path/src => src}/parser.rs | 7 +- src/request.rs | 92 - src/route.rs | 83 - src/router.rs | 379 +- {crates/path/src => src}/search.rs | 53 +- {crates/authority/src => src}/state.rs | 0 {crates/authority/src => src}/vec.rs | 39 +- tests/authority.rs | 315 - tests/constraint.rs | 203 +- tests/delete.rs | 136 +- tests/display.rs | 74 +- tests/dynamic.rs | 328 +- tests/escape.rs | 144 +- tests/gitlab.rs | 13819 ------ tests/insert.rs | 182 +- tests/method.rs | 839 - tests/optimize.rs | 135 +- tests/optional.rs | 386 +- tests/static.rs | 417 +- tests/wildcard.rs | 377 +- 126 files changed, 1522 insertions(+), 73961 deletions(-) delete mode 100644 TODO.md delete mode 100644 benches/gitlab_criterion.rs delete mode 100644 benches/gitlab_divan.rs delete mode 100644 benches/gitlab_routes.rs delete mode 100644 crates/authority/Cargo.toml delete mode 100644 crates/authority/src/constraints.rs delete mode 100644 crates/authority/src/delete.rs delete mode 100644 crates/authority/src/display.rs delete mode 100644 crates/authority/src/errors.rs delete mode 100644 crates/authority/src/errors/constraint.rs delete mode 100644 crates/authority/src/errors/delete.rs delete mode 100644 crates/authority/src/errors/encoding.rs delete mode 100644 crates/authority/src/errors/insert.rs delete mode 100644 crates/authority/src/errors/search.rs delete mode 100644 crates/authority/src/errors/template.rs delete mode 100644 crates/authority/src/find.rs delete mode 100644 crates/authority/src/id.rs delete mode 100644 crates/authority/src/insert.rs delete mode 100644 crates/authority/src/lib.rs delete mode 100644 crates/authority/src/node.rs delete mode 100644 crates/authority/src/optimize.rs delete mode 100644 crates/authority/src/parser.rs delete mode 100644 crates/authority/src/search.rs delete mode 100644 crates/method/Cargo.toml delete mode 100644 crates/method/src/display.rs delete mode 100644 crates/method/src/errors.rs delete mode 100644 crates/method/src/errors/delete.rs delete mode 100644 crates/method/src/errors/insert.rs delete mode 100644 crates/method/src/errors/search.rs delete mode 100644 crates/method/src/id.rs delete mode 100644 crates/method/src/lib.rs delete mode 100644 crates/path/Cargo.toml delete mode 100644 crates/path/src/errors.rs delete mode 100644 crates/path/src/errors/delete.rs delete mode 100644 crates/path/src/errors/encoding.rs delete mode 100644 crates/path/src/errors/insert.rs delete mode 100644 crates/path/src/errors/search.rs delete mode 100644 crates/path/src/find.rs delete mode 100644 crates/path/src/id.rs delete mode 100644 crates/path/src/lib.rs delete mode 100644 crates/path/src/node.rs delete mode 100644 crates/path/src/state.rs delete mode 100644 crates/path/src/vec.rs delete mode 100644 crates/percent/Cargo.toml delete mode 100644 crates/percent/src/errors.rs delete mode 100644 crates/percent/src/lib.rs delete mode 100644 crates/punycode/Cargo.toml delete mode 100644 crates/punycode/src/errors.rs delete mode 100644 crates/punycode/src/lib.rs delete mode 100644 crates/rails-macro/Cargo.toml delete mode 100644 crates/rails-macro/src/lib.rs delete mode 100644 crates/rails/Cargo.toml delete mode 100644 crates/rails/README.md delete mode 100644 crates/rails/input/routes.txt delete mode 100644 crates/rails/output/routes.json delete mode 100644 crates/rails/src/main.rs delete mode 100644 docs/Authority.md delete mode 100644 docs/Method.md delete mode 100644 docs/Path.md delete mode 100644 src/chain.rs rename {crates/path/src => src}/constraints.rs (79%) delete mode 100644 src/decode/punycode.rs rename {crates/path/src => src}/delete.rs (78%) rename {crates/path/src => src}/display.rs (89%) rename {crates/path/src => src}/errors/constraint.rs (97%) delete mode 100644 src/errors/request.rs delete mode 100644 src/errors/route.rs rename {crates/path/src => src}/errors/template.rs (95%) rename {crates/path/src => src}/insert.rs (78%) create mode 100644 src/node.rs rename {crates/path/src => src}/optimize.rs (96%) rename {crates/path/src => src}/parser.rs (99%) delete mode 100644 src/request.rs delete mode 100644 src/route.rs rename {crates/path/src => src}/search.rs (88%) rename {crates/authority/src => src}/state.rs (100%) rename {crates/authority/src => src}/vec.rs (50%) delete mode 100644 tests/authority.rs delete mode 100644 tests/gitlab.rs delete mode 100644 tests/method.rs diff --git a/BENCHMARKING.md b/BENCHMARKING.md index dcb5b4e3..6824a373 100644 --- a/BENCHMARKING.md +++ b/BENCHMARKING.md @@ -6,10 +6,9 @@ Check out our [codspeed results](https://codspeed.io/DuskSystems/wayfind/benchma ## Context -For all benchmarks, we percent-decode the path before matching. -After matching, we convert any extracted parameters to strings. +For all benchmarks, we convert any extracted parameters to strings. -Some routers perform these operations automatically, while others require them to be done manually. +Some routers perform this operations automatically, while others require them to be done manually. We do this to try and match behaviour as best as possible. This is as close to an "apples-to-apples" comparison as we can get. @@ -19,14 +18,14 @@ In a router of 130 routes, benchmark matching 4 paths. | Library | Time | Alloc Count | Alloc Size | Dealloc Count | Dealloc Size | |:-----------------|----------:|------------:|-----------:|--------------:|-------------:| -| wayfind | 475.73 ns | 5 | 329 B | 5 | 329 B | -| matchit | 551.32 ns | 5 | 480 B | 5 | 512 B | -| path-tree | 564.04 ns | 5 | 480 B | 5 | 512 B | -| xitca-router | 646.81 ns | 8 | 864 B | 8 | 896 B | -| ntex-router | 2.2001 µs | 19 | 1.312 KB | 19 | 1.344 KB | -| route-recognizer | 3.1331 µs | 161 | 8.569 KB | 161 | 8.601 KB | -| routefinder | 6.1604 µs | 68 | 5.088 KB | 68 | 5.12 KB | -| actix-router | 20.956 µs | 215 | 14 KB | 215 | 14.03 KB | +| wayfind | 329.54 ns | 5 | 329 B | 5 | 329 B | +| matchit | 372.73 ns | 5 | 480 B | 5 | 512 B | +| path-tree | 435.01 ns | 5 | 480 B | 5 | 512 B | +| xitca-router | 519.06 ns | 8 | 864 B | 8 | 896 B | +| ntex-router | 2.1569 µs | 19 | 1.312 KB | 19 | 1.344 KB | +| route-recognizer | 3.0280 µs | 161 | 8.569 KB | 161 | 8.601 KB | +| routefinder | 6.1353 µs | 68 | 5.088 KB | 68 | 5.12 KB | +| actix-router | 21.199 µs | 215 | 14 KB | 215 | 14.03 KB | ## `path-tree` inspired benches @@ -34,11 +33,11 @@ In a router of 320 routes, benchmark matching 80 paths. | Library | Time | Alloc Count | Alloc Size | Dealloc Count | Dealloc Size | |:-----------------|----------:|------------:|-----------:|--------------:|-------------:| -| wayfind | 7.0409 µs | 60 | 3.847 KB | 60 | 3.847 KB | -| path-tree | 8.4434 µs | 60 | 8.727 KB | 60 | 8.75 KB | -| matchit | 9.8761 µs | 141 | 19.09 KB | 141 | 19.11 KB | -| xitca-router | 11.651 µs | 210 | 26.79 KB | 210 | 26.81 KB | -| ntex-router | 35.669 µs | 202 | 20.82 KB | 202 | 20.84 KB | -| route-recognizer | 69.671 µs | 2873 | 192.9 KB | 2873 | 206.1 KB | -| routefinder | 87.075 µs | 526 | 49.68 KB | 526 | 49.71 KB | -| actix-router | 185.31 µs | 2202 | 130.1 KB | 2202 | 130.1 KB | +| wayfind | 4.6335 µs | 60 | 3.847 KB | 60 | 3.847 KB | +| path-tree | 7.0053 µs | 60 | 8.727 KB | 60 | 8.75 KB | +| matchit | 8.1093 µs | 141 | 19.09 KB | 141 | 19.11 KB | +| xitca-router | 9.9790 µs | 210 | 26.79 KB | 210 | 26.81 KB | +| ntex-router | 34.594 µs | 202 | 20.82 KB | 202 | 20.84 KB | +| route-recognizer | 67.158 µs | 2873 | 192.9 KB | 2873 | 206.1 KB | +| routefinder | 85.597 µs | 526 | 49.68 KB | 526 | 49.71 KB | +| actix-router | 186.41 µs | 2202 | 130.1 KB | 2202 | 130.1 KB | diff --git a/Cargo.lock b/Cargo.lock index 8c2f02df..e5c02825 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,21 +92,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bitflags" version = "2.6.0" @@ -124,9 +109,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.11.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786a307d683a5bf92e6fd5fd69a7eb613751668d1d8d67d802846dfe367c62c8" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", "regex-automata", @@ -162,9 +147,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.6" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "jobserver", "libc", @@ -443,17 +428,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "fancy-regex" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" -dependencies = [ - "bit-set", - "regex-automata", - "regex-syntax", -] - [[package]] name = "fnv" version = "1.0.7" @@ -684,7 +658,6 @@ dependencies = [ "console", "lazy_static", "linked-hash-map", - "serde", "similar", ] @@ -785,9 +758,9 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchit" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0aa4b8ca861b08d68afc8702af3250776898c1508b278e1da9d01e01d4b45c" +checksum = "2f926ade0c4e170215ae43342bf13b9310a437609c81f29f86c5df6657582ef9" [[package]] name = "memchr" @@ -1223,9 +1196,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" -version = "2.0.93" +version = "2.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" +checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" dependencies = [ "proc-macro2", "quote", @@ -1244,18 +1217,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", @@ -1497,36 +1470,17 @@ dependencies = [ "codspeed-criterion-compat", "criterion", "divan", - "fancy-regex", "insta", "matchit", "ntex-router", "path-tree", - "percent-encoding", "route-recognizer", "routefinder", - "serde", - "serde_json", "similar-asserts", "smallvec", - "wayfind-authority", - "wayfind-method", - "wayfind-path", - "wayfind-percent", - "wayfind-punycode", - "wayfind-rails-macro", "xitca-router", ] -[[package]] -name = "wayfind-authority" -version = "0.7.0" -dependencies = [ - "insta", - "similar-asserts", - "smallvec", -] - [[package]] name = "wayfind-fuzz" version = "0.0.0" @@ -1535,15 +1489,6 @@ dependencies = [ "wayfind", ] -[[package]] -name = "wayfind-method" -version = "0.7.0" -dependencies = [ - "insta", - "similar-asserts", - "smallvec", -] - [[package]] name = "wayfind-oci-example" version = "0.7.0" @@ -1567,51 +1512,6 @@ dependencies = [ "wayfind", ] -[[package]] -name = "wayfind-path" -version = "0.7.0" -dependencies = [ - "insta", - "similar-asserts", - "smallvec", -] - -[[package]] -name = "wayfind-percent" -version = "0.7.0" -dependencies = [ - "insta", -] - -[[package]] -name = "wayfind-punycode" -version = "0.7.0" -dependencies = [ - "insta", -] - -[[package]] -name = "wayfind-rails" -version = "0.7.0" -dependencies = [ - "fancy-regex", - "insta", - "serde", - "serde_json", - "wayfind", -] - -[[package]] -name = "wayfind-rails-macro" -version = "0.7.0" -dependencies = [ - "proc-macro2", - "quote", - "serde_json", - "syn", - "wayfind", -] - [[package]] name = "web-sys" version = "0.3.76" diff --git a/Cargo.toml b/Cargo.toml index 9e2824ab..c0fd82b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ # https://doc.rust-lang.org/cargo/reference/workspaces.html [workspace] resolver = "2" -members = [".", "crates/*", "examples/*", "fuzz"] +members = [".", "examples/*", "fuzz"] [workspace.package] version = "0.7.0" @@ -94,35 +94,14 @@ categories.workspace = true workspace = true [dependencies] -# Routers -wayfind-authority = { path = "crates/authority" } -wayfind-path = { path = "crates/path" } -wayfind-method = { path = "crates/method" } - -# Decoding -wayfind-percent = { path = "crates/percent" } -wayfind-punycode = { path = "crates/punycode" } - # Data Structures smallvec = { workspace = true } [dev-dependencies] -wayfind-rails-macro = { path = "crates/rails-macro" } - # Testing insta = { workspace = true } similar-asserts = { workspace = true } -# Encoding -percent-encoding = "2.3" - -# Serde -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" - -# Regex -fancy-regex = "0.14" - # Benchmarking divan = "0.1" criterion = { version = "0.5", features = ["html_reports"] } @@ -131,21 +110,13 @@ codspeed-criterion-compat = "=2.7.2" # Routers actix-router = "=0.5.3" -matchit = "=0.8.5" +matchit = "=0.8.6" ntex-router = "=0.5.3" path-tree = "=0.8.1" route-recognizer = "=0.3.1" routefinder = "=0.5.4" xitca-router = "=0.3.0" -[[bench]] -name = "gitlab_criterion" -harness = false - -[[bench]] -name = "gitlab_divan" -harness = false - [[bench]] name = "matchit_criterion" harness = false diff --git a/README.md b/README.md index 2d009f7a..826933c9 100644 --- a/README.md +++ b/README.md @@ -42,38 +42,24 @@ Dynamic parameters are greedy in nature, similar to a regex `.*`, and will attem ```rust use std::error::Error; -use wayfind::{Router, RouteBuilder, RequestBuilder}; +use wayfind::Router; fn main() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/users/{id}", 1)?; + router.insert("/users/{id}/files/{filename}.{extension}", 2)?; - let route = RouteBuilder::new() - .route("/users/{id}") - .build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new() - .route("/users/{id}/files/{filename}.{extension}") - .build()?; - router.insert(&route, 2)?; - - let request = RequestBuilder::new() - .path("/users/123") - .build()?; - let search = router.search(&request)?.unwrap(); + let search = router.search("/users/123")?.unwrap(); assert_eq!(*search.data, 1); - assert_eq!(search.path.route, "/users/{id}"); - assert_eq!(search.path.parameters[0], ("id", "123")); + assert_eq!(search.route, "/users/{id}"); + assert_eq!(search.parameters[0], ("id", "123")); - let request = RequestBuilder::new() - .path("/users/123/files/my.document.pdf") - .build()?; - let search = router.search(&request)?.unwrap(); + let search = router.search("/users/123/files/my.document.pdf")?.unwrap(); assert_eq!(*search.data, 2); - assert_eq!(search.path.route, "/users/{id}/files/{filename}.{extension}"); - assert_eq!(search.path.parameters[0], ("id", "123")); - assert_eq!(search.path.parameters[1], ("filename", "my.document")); - assert_eq!(search.path.parameters[2], ("extension", "pdf")); + assert_eq!(search.route, "/users/{id}/files/{filename}.{extension}"); + assert_eq!(search.parameters[0], ("id", "123")); + assert_eq!(search.parameters[1], ("filename", "my.document")); + assert_eq!(search.parameters[2], ("extension", "pdf")); Ok(()) } @@ -94,36 +80,22 @@ Like dynamic parameters, wildcard parameters are also greedy in nature. ```rust use std::error::Error; -use wayfind::{Router, RouteBuilder, RequestBuilder}; +use wayfind::Router; fn main() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/files/{*slug}/delete", 1)?; + router.insert("/{*catch_all}", 2)?; - let route = RouteBuilder::new() - .route("/files/{*slug}/delete") - .build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new() - .route("/{*catch_all}") - .build()?; - router.insert(&route, 2)?; - - let request = RequestBuilder::new() - .path("/files/documents/reports/annual.pdf/delete") - .build()?; - let search = router.search(&request)?.unwrap(); + let search = router.search("/files/documents/reports/annual.pdf/delete")?.unwrap(); assert_eq!(*search.data, 1); - assert_eq!(search.path.route, "/files/{*slug}/delete"); - assert_eq!(search.path.parameters[0], ("slug", "documents/reports/annual.pdf")); + assert_eq!(search.route, "/files/{*slug}/delete"); + assert_eq!(search.parameters[0], ("slug", "documents/reports/annual.pdf")); - let request = RequestBuilder::new() - .path("/any/other/path") - .build()?; - let search = router.search(&request)?.unwrap(); + let search = router.search("/any/other/path")?.unwrap(); assert_eq!(*search.data, 2); - assert_eq!(search.path.route, "/{*catch_all}"); - assert_eq!(search.path.parameters[0], ("catch_all", "any/other/path")); + assert_eq!(search.route, "/{*catch_all}"); + assert_eq!(search.parameters[0], ("catch_all", "any/other/path")); Ok(()) } @@ -151,58 +123,38 @@ There is a small overhead to using optional groups, due to `Arc` usage internall ```rust use std::error::Error; -use wayfind::{Router, RouteBuilder, RequestBuilder}; +use wayfind::Router; fn main() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/users(/{id})", 1)?; + router.insert("/files/{*slug}/{file}(.{extension})", 2)?; - let route = RouteBuilder::new() - .route("/users(/{id})") - .build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new() - .route("/files/{*slug}/{file}(.{extension})") - .build()?; - router.insert(&route, 2)?; - - let request = RequestBuilder::new() - .path("/users") - .build()?; - let search = router.search(&request)?.unwrap(); + let search = router.search("/users")?.unwrap(); assert_eq!(*search.data, 1); - assert_eq!(search.path.route, "/users(/{id})"); - assert_eq!(search.path.expanded, Some("/users")); + assert_eq!(search.route, "/users(/{id})"); + assert_eq!(search.expanded, Some("/users")); - let request = RequestBuilder::new() - .path("/users/123") - .build()?; - let search = router.search(&request)?.unwrap(); + let search = router.search("/users/123")?.unwrap(); assert_eq!(*search.data, 1); - assert_eq!(search.path.route, "/users(/{id})"); - assert_eq!(search.path.expanded, Some("/users/{id}")); - assert_eq!(search.path.parameters[0], ("id", "123")); - - let request = RequestBuilder::new() - .path("/files/documents/folder/report.pdf") - .build()?; - let search = router.search(&request)?.unwrap(); + assert_eq!(search.route, "/users(/{id})"); + assert_eq!(search.expanded, Some("/users/{id}")); + assert_eq!(search.parameters[0], ("id", "123")); + + let search = router.search("/files/documents/folder/report.pdf")?.unwrap(); assert_eq!(*search.data, 2); - assert_eq!(search.path.route, "/files/{*slug}/{file}(.{extension})"); - assert_eq!(search.path.expanded, Some("/files/{*slug}/{file}.{extension}")); - assert_eq!(search.path.parameters[0], ("slug", "documents/folder")); - assert_eq!(search.path.parameters[1], ("file", "report")); - assert_eq!(search.path.parameters[2], ("extension", "pdf")); - - let request = RequestBuilder::new() - .path("/files/documents/folder/readme") - .build()?; - let search = router.search(&request)?.unwrap(); + assert_eq!(search.route, "/files/{*slug}/{file}(.{extension})"); + assert_eq!(search.expanded, Some("/files/{*slug}/{file}.{extension}")); + assert_eq!(search.parameters[0], ("slug", "documents/folder")); + assert_eq!(search.parameters[1], ("file", "report")); + assert_eq!(search.parameters[2], ("extension", "pdf")); + + let search = router.search("/files/documents/folder/readme")?.unwrap(); assert_eq!(*search.data, 2); - assert_eq!(search.path.route, "/files/{*slug}/{file}(.{extension})"); - assert_eq!(search.path.expanded, Some("/files/{*slug}/{file}")); - assert_eq!(search.path.parameters[0], ("slug", "documents/folder")); - assert_eq!(search.path.parameters[1], ("file", "readme")); + assert_eq!(search.route, "/files/{*slug}/{file}(.{extension})"); + assert_eq!(search.expanded, Some("/files/{*slug}/{file}")); + assert_eq!(search.parameters[0], ("slug", "documents/folder")); + assert_eq!(search.parameters[1], ("file", "readme")); Ok(()) } @@ -259,10 +211,10 @@ Curently, these can't be disabled. ```rust use std::error::Error; -use wayfind::{PathConstraint, Router, RouteBuilder, RequestBuilder}; +use wayfind::{Router, Constraint}; struct NamespaceConstraint; -impl PathConstraint for NamespaceConstraint { +impl Constraint for NamespaceConstraint { const NAME: &'static str = "namespace"; fn check(segment: &str) -> bool { @@ -276,39 +228,23 @@ impl PathConstraint for NamespaceConstraint { fn main() -> Result<(), Box> { let mut router = Router::new(); - router.path.constraint::()?; - - let route = RouteBuilder::new() - .route("/v2") - .build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new() - .route("/v2/{*name:namespace}/blobs/{type}:{digest}") - .build()?; - router.insert(&route, 2)?; - - let request = RequestBuilder::new() - .path("/v2") - .build()?; - let search = router.search(&request)?.unwrap(); + router.constraint::()?; + router.insert("/v2", 1)?; + router.insert("/v2/{*name:namespace}/blobs/{type}:{digest}", 2)?; + + let search = router.search("/v2")?.unwrap(); assert_eq!(*search.data, 1); - assert_eq!(search.path.route, "/v2"); + assert_eq!(search.route, "/v2"); - let request = RequestBuilder::new() - .path("/v2/my-org/my-repo/blobs/sha256:1234567890") - .build()?; - let search = router.search(&request)?.unwrap(); + let search = router.search("/v2/my-org/my-repo/blobs/sha256:1234567890")?.unwrap(); assert_eq!(*search.data, 2); - assert_eq!(search.path.route, "/v2/{*name:namespace}/blobs/{type}:{digest}"); - assert_eq!(search.path.parameters[0], ("name", "my-org/my-repo")); - assert_eq!(search.path.parameters[1], ("type", "sha256")); - assert_eq!(search.path.parameters[2], ("digest", "1234567890")); + assert_eq!(search.route, "/v2/{*name:namespace}/blobs/{type}:{digest}"); + assert_eq!(search.parameters[0], ("name", "my-org/my-repo")); + assert_eq!(search.parameters[1], ("type", "sha256")); + assert_eq!(search.parameters[2], ("digest", "1234567890")); - let request = RequestBuilder::new() - .path("/v2/invalid repo/blobs/uploads") - .build()?; - assert!(router.search(&request)?.is_none()); + let search = router.search("/v2/invalid repo/blobs/uploads")?; + assert!(search.is_none()); Ok(()) } @@ -322,10 +258,10 @@ Where possible, we try to provide user-friendly error messages. ```rust use std::error::Error; -use wayfind::{PathConstraint, Router}; +use wayfind::{Router, Constraint}; struct ConstraintA; -impl PathConstraint for ConstraintA { +impl Constraint for ConstraintA { const NAME: &'static str = "my_constraint"; fn check(segment: &str) -> bool { @@ -334,7 +270,7 @@ impl PathConstraint for ConstraintA { } struct ConstraintB; -impl PathConstraint for ConstraintB { +impl Constraint for ConstraintB { const NAME: &'static str = "my_constraint"; fn check(segment: &str) -> bool { @@ -344,9 +280,9 @@ impl PathConstraint for ConstraintB { fn main() -> Result<(), Box> { let mut router: Router = Router::new(); - router.path.constraint::()?; + router.constraint::()?; - let error = router.path.constraint::().unwrap_err(); + let error = router.constraint::().unwrap_err(); insta::assert_snapshot!(error, @r" duplicate constraint name @@ -375,221 +311,47 @@ Currenty, this doesn't handle split multi-byte characters well. ```rust use std::error::Error; -use wayfind::{Router, RouteBuilder}; +use wayfind::Router; fn main() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/pet") - .methods(vec!["POST"]) - .build()?; - router.insert(&route, "handle_add_pet")?; - - let route = RouteBuilder::new() - .route("/pet") - .methods(vec!["PUT"]) - .build()?; - router.insert(&route, "handle_update_pet")?; - - let route = RouteBuilder::new() - .route("/pet/findByStatus") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_find_pets_by_status")?; - - let route = RouteBuilder::new() - .route("/pet/findByTags") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_find_pets_by_tags")?; - - let route = RouteBuilder::new() - .route("/pet/{petId}") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_get_pet")?; - - let route = RouteBuilder::new() - .route("/pet/{petId}") - .methods(vec!["POST"]) - .build()?; - router.insert(&route, "handle_update_pet_form")?; - - let route = RouteBuilder::new() - .route("/pet/{petId}") - .methods(vec!["DELETE"]) - .build()?; - router.insert(&route, "handle_delete_pet")?; - - let route = RouteBuilder::new() - .route("/pet/{petId}/uploadImage") - .methods(vec!["POST"]) - .build()?; - router.insert(&route, "handle_upload_pet_image")?; - - let route = RouteBuilder::new() - .route("/store/inventory") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_get_inventory")?; - - let route = RouteBuilder::new() - .route("/store/order") - .methods(vec!["POST"]) - .build()?; - router.insert(&route, "handle_place_order")?; - - let route = RouteBuilder::new() - .route("/store/order/{orderId}") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_get_order")?; - - let route = RouteBuilder::new() - .route("/store/order/{orderId}") - .methods(vec!["DELETE"]) - .build()?; - router.insert(&route, "handle_delete_order")?; - - let route = RouteBuilder::new() - .route("/user") - .methods(vec!["POST"]) - .build()?; - router.insert(&route, "handle_create_user")?; - - let route = RouteBuilder::new() - .route("/user/createWithList") - .methods(vec!["POST"]) - .build()?; - router.insert(&route, "handle_create_users_list")?; - - let route = RouteBuilder::new() - .route("/user/login") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_login")?; - - let route = RouteBuilder::new() - .route("/user/logout") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_logout")?; - - let route = RouteBuilder::new() - .route("/user/{username}") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, "handle_get_user")?; - - let route = RouteBuilder::new() - .route("/user/{username}") - .methods(vec!["PUT"]) - .build()?; - router.insert(&route, "handle_update_user")?; - - let route = RouteBuilder::new() - .route("/user/{username}") - .methods(vec!["DELETE"]) - .build()?; - router.insert(&route, "handle_delete_user")?; - - let route = RouteBuilder::new() - .route("/{*catch_all}") - .build()?; - router.insert(&route, "handle_not_found")?; + router.insert("/pet", 1)?; + router.insert("/pet/findByStatus", 2)?; + router.insert("/pet/findByTags", 3)?; + router.insert("/pet/{petId}", 4)?; + router.insert("/pet/{petId}/uploadImage", 5)?; + router.insert("/store/inventory", 6)?; + router.insert("/store/order", 7)?; + router.insert("/store/order/{orderId}", 8)?; + router.insert("/user", 9)?; + router.insert("/user/createWithList", 10)?; + router.insert("/user/login", 11)?; + router.insert("/user/logout", 12)?; + router.insert("/user/{username}", 13)?; + router.insert("/{*catch_all}", 14)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / - ├─ user [9] + ├─ user [*] │ ╰─ / - │ ├─ createWithList [10] + │ ├─ createWithList [*] │ ├─ log - │ │ ├─ out [12] - │ │ ╰─ in [11] - │ ╰─ {username} [13] - ├─ pet [1] + │ │ ├─ out [*] + │ │ ╰─ in [*] + │ ╰─ {username} [*] + ├─ pet [*] │ ╰─ / │ ├─ findBy - │ │ ├─ Status [2] - │ │ ╰─ Tags [3] - │ ╰─ {petId} [4] - │ ╰─ /uploadImage [5] + │ │ ├─ Status [*] + │ │ ╰─ Tags [*] + │ ╰─ {petId} [*] + │ ╰─ /uploadImage [*] ├─ store/ - │ ├─ inventory [6] - │ ╰─ order [7] + │ ├─ inventory [*] + │ ╰─ order [*] │ ╰─ / - │ ╰─ {orderId} [8] - ╰─ {*catch_all} [14] - === Method - [1] - ├─ POST [1] - ╰─ PUT [2] - - [2] - ╰─ GET [3] - - [3] - ╰─ GET [4] - - [4] - ├─ DELETE [7] - ├─ GET [5] - ╰─ POST [6] - - [5] - ╰─ POST [8] - - [6] - ╰─ GET [9] - - [7] - ╰─ POST [10] - - [8] - ├─ DELETE [12] - ╰─ GET [11] - - [9] - ╰─ POST [13] - - [10] - ╰─ POST [14] - - [11] - ╰─ GET [15] - - [12] - ╰─ GET [16] - - [13] - ├─ DELETE [19] - ├─ GET [17] - ╰─ PUT [18] - === Chains - *-1-1 - *-1-2 - *-2-3 - *-3-4 - *-4-5 - *-4-6 - *-4-7 - *-5-8 - *-6-9 - *-7-10 - *-8-11 - *-8-12 - *-9-13 - *-10-14 - *-11-15 - *-12-16 - *-13-17 - *-13-18 - *-13-19 - *-14-* + │ ╰─ {orderId} [*] + ╰─ {*catch_all} [*] "); Ok(()) diff --git a/TODO.md b/TODO.md deleted file mode 100644 index fc417b40..00000000 --- a/TODO.md +++ /dev/null @@ -1,10 +0,0 @@ -# TODO - -- [x] Authority router. -- [ ] Stop using the term 'route' to mean 'template'. -- [x] Split routers into seperate crates. -- [ ] Dedupe the 2 tree routers? (Auth vs Patha) -- [ ] Consider removing expanded routes, and accepting routes as a vec? (complexity/performance issues) - would need to revamp gitlab logic too -- [ ] Improve our errors. -- [ ] Documentation refresh. -- [ ] Look into query/headers/... diff --git a/benches/gitlab_criterion.rs b/benches/gitlab_criterion.rs deleted file mode 100644 index 6974fab9..00000000 --- a/benches/gitlab_criterion.rs +++ /dev/null @@ -1,82 +0,0 @@ -use codspeed_criterion_compat::{criterion_group, criterion_main, BatchSize, Criterion}; -use gitlab_routes::{constraints, routes}; -use std::hint::black_box; - -pub mod gitlab_routes; - -criterion_main!(benches); -criterion_group! { - name = benches; - config = Criterion::default(); - targets = insert_benchmark, delete_benchmark, display_benchmark -} - -fn insert_benchmark(criterion: &mut Criterion) { - let mut group = criterion.benchmark_group("gitlab insert benchmarks"); - - group.bench_function("gitlab insert benchmarks/wayfind", |bencher| { - let router = wayfind::Router::new(); - bencher.iter_batched( - || router.clone(), - |mut router| { - constraints(&mut router); - for route in black_box(routes()) { - let route = route.build().unwrap(); - router.insert(black_box(&route), true).unwrap(); - } - }, - BatchSize::SmallInput, - ); - }); - - group.finish(); -} - -fn delete_benchmark(criterion: &mut Criterion) { - let mut group = criterion.benchmark_group("gitlab delete benchmarks"); - - group.bench_function("gitlab delete benchmarks/wayfind", |bencher| { - let mut router = wayfind::Router::new(); - constraints(&mut router); - - for route in routes() { - let route = route.build().unwrap(); - router.insert(&route, true).unwrap(); - } - - bencher.iter_batched( - || router.clone(), - |mut router| { - for route in black_box(routes()) { - let route = route.build().unwrap(); - router.delete(black_box(&route)).unwrap(); - } - }, - BatchSize::SmallInput, - ); - }); - - group.finish(); -} - -fn display_benchmark(criterion: &mut Criterion) { - let mut group = criterion.benchmark_group("gitlab display benchmarks"); - - group.bench_function("gitlab display benchmarks/wayfind", |bencher| { - let mut router = wayfind::Router::new(); - constraints(&mut router); - - for route in routes() { - let route = route.build().unwrap(); - router.insert(&route, true).unwrap(); - } - - bencher.iter_batched( - || router.clone(), - |router| router.to_string(), - BatchSize::SmallInput, - ); - }); - - group.finish(); -} diff --git a/benches/gitlab_divan.rs b/benches/gitlab_divan.rs deleted file mode 100644 index 83fc1ed0..00000000 --- a/benches/gitlab_divan.rs +++ /dev/null @@ -1,58 +0,0 @@ -use divan::AllocProfiler; -use gitlab_routes::{constraints, routes}; -use std::hint::black_box; - -pub mod gitlab_routes; - -#[global_allocator] -static ALLOC: AllocProfiler = AllocProfiler::system(); - -fn main() { - divan::main(); -} - -#[divan::bench(name = "wayfind insert")] -fn wayfind_insert(bencher: divan::Bencher<'_, '_>) { - let router = wayfind::Router::new(); - - bencher.with_inputs(|| router.clone()).bench_refs(|router| { - constraints(router); - for route in black_box(routes()) { - let route = route.build().unwrap(); - router.insert(black_box(&route), true).unwrap(); - } - }); -} - -#[divan::bench(name = "wayfind delete")] -fn wayfind_delete(bencher: divan::Bencher<'_, '_>) { - let mut router = wayfind::Router::new(); - constraints(&mut router); - - for route in routes() { - let route = route.build().unwrap(); - router.insert(&route, true).unwrap(); - } - - bencher.with_inputs(|| router.clone()).bench_refs(|router| { - for route in black_box(routes()) { - let route = route.build().unwrap(); - router.delete(black_box(&route)).unwrap(); - } - }); -} - -#[divan::bench(name = "wayfind display")] -fn wayfind_display(bencher: divan::Bencher<'_, '_>) { - let mut router = wayfind::Router::new(); - constraints(&mut router); - - for route in routes() { - let route = route.build().unwrap(); - router.insert(&route, true).unwrap(); - } - - bencher - .with_inputs(|| router.clone()) - .bench_refs(|router| router.to_string()); -} diff --git a/benches/gitlab_routes.rs b/benches/gitlab_routes.rs deleted file mode 100644 index 3f3a486d..00000000 --- a/benches/gitlab_routes.rs +++ /dev/null @@ -1,38 +0,0 @@ -//! Routes extracted from GitLab via `rails routes` command. -//! - -use fancy_regex::Regex; -use serde_json::Value; -use std::sync::LazyLock; -use wayfind::{PathConstraint, RouteBuilder, Router}; - -const ROUTES_JSON: &str = include_str!("../crates/rails/output/routes.json"); -static ROUTES_DATA: LazyLock = LazyLock::new(|| serde_json::from_str(ROUTES_JSON).unwrap()); - -wayfind_rails_macro::generate_constraints!("crates/rails/output/routes.json"); - -#[allow(clippy::large_stack_frames, clippy::missing_panics_doc)] -#[must_use] -pub fn routes<'p>() -> impl IntoIterator> { - ROUTES_DATA["routes"] - .as_array() - .unwrap() - .iter() - .map(|route| { - let mut builder = RouteBuilder::new().route(route["path"].as_str().unwrap()); - - if let Some(methods) = route["methods"].as_array() { - if !methods.is_empty() { - builder = builder.methods( - methods - .iter() - .map(|m| m.as_str().unwrap()) - .collect::>(), - ); - } - } - - builder - }) - .collect::>() -} diff --git a/benches/matchit_criterion.rs b/benches/matchit_criterion.rs index 3f7d60e4..41776276 100644 --- a/benches/matchit_criterion.rs +++ b/benches/matchit_criterion.rs @@ -1,10 +1,10 @@ //! Benches sourced from `matchit` (MIT AND BSD-3-Clause) //! +use std::hint::black_box; + use codspeed_criterion_compat::{criterion_group, criterion_main, Criterion}; use matchit_routes::paths; -use percent_encoding::percent_decode; -use std::hint::black_box; pub mod matchit_routes; @@ -21,16 +21,14 @@ fn matchit_benchmark(criterion: &mut Criterion) { group.bench_function("matchit benchmarks/wayfind", |bencher| { let mut router = wayfind::Router::new(); for route in routes!(brackets) { - let route = wayfind::RouteBuilder::new().route(route).build().unwrap(); - router.insert(&route, true).unwrap(); + router.insert(route, true).unwrap(); } bencher.iter(|| { - for route in black_box(paths()) { - let request = wayfind::RequestBuilder::new().path(route).build().unwrap(); - let output = black_box(router.search(black_box(&request)).unwrap().unwrap()); + for path in black_box(paths()) { + let output = black_box(router.search(black_box(path)).unwrap().unwrap()); let _parameters: Vec<(&str, &str)> = - black_box(output.path.parameters.iter().map(|p| (p.0, p.1)).collect()); + black_box(output.parameters.iter().map(|p| (p.0, p.1)).collect()); } }); }); @@ -43,9 +41,8 @@ fn matchit_benchmark(criterion: &mut Criterion) { let router = router.finish(); bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = actix_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = actix_router::Path::new(path); black_box(router.recognize(black_box(&mut path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -60,9 +57,8 @@ fn matchit_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = black_box(router.at(black_box(&path)).unwrap()); + for path in black_box(paths()) { + let output = black_box(router.at(black_box(path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } @@ -77,9 +73,8 @@ fn matchit_benchmark(criterion: &mut Criterion) { let router = router.finish(); bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = ntex_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = ntex_router::Path::new(path); router.recognize(&mut path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -94,9 +89,8 @@ fn matchit_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.find(&path).unwrap(); + for path in black_box(paths()) { + let output = router.find(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.1.params_iter().map(|p| (p.0, p.1)).collect()); } @@ -110,9 +104,8 @@ fn matchit_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.recognize(&path).unwrap(); + for path in black_box(paths()) { + let output = router.recognize(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params().iter().map(|p| (p.0, p.1)).collect()); } @@ -126,9 +119,8 @@ fn matchit_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.best_match(&path).unwrap(); + for path in black_box(paths()) { + let output = router.best_match(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.captures().iter().map(|p| (p.0, p.1)).collect()); } @@ -142,9 +134,8 @@ fn matchit_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.at(&path).unwrap(); + for path in black_box(paths()) { + let output = router.at(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } diff --git a/benches/matchit_divan.rs b/benches/matchit_divan.rs index e4cf07e2..b6488f8b 100644 --- a/benches/matchit_divan.rs +++ b/benches/matchit_divan.rs @@ -1,10 +1,10 @@ //! Benches sourced from `matchit` (MIT AND BSD-3-Clause) //! +use std::hint::black_box; + use divan::AllocProfiler; use matchit_routes::paths; -use percent_encoding::percent_decode; -use std::hint::black_box; pub mod matchit_routes; @@ -19,16 +19,14 @@ fn main() { fn wayfind(bencher: divan::Bencher<'_, '_>) { let mut router = wayfind::Router::new(); for route in routes!(brackets) { - let route = wayfind::RouteBuilder::new().route(route).build().unwrap(); - router.insert(&route, true).unwrap(); + router.insert(route, true).unwrap(); } bencher.bench(|| { - for route in black_box(paths()) { - let request = wayfind::RequestBuilder::new().path(route).build().unwrap(); - let output = black_box(router.search(black_box(&request)).unwrap().unwrap()); + for path in black_box(paths()) { + let output = black_box(router.search(black_box(path)).unwrap().unwrap()); let _parameters: Vec<(&str, &str)> = - black_box(output.path.parameters.iter().map(|p| (p.0, p.1)).collect()); + black_box(output.parameters.iter().map(|p| (p.0, p.1)).collect()); } }); } @@ -42,9 +40,8 @@ fn actix_router(bencher: divan::Bencher<'_, '_>) { let router = router.finish(); bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = actix_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = actix_router::Path::new(path); black_box(router.recognize(black_box(&mut path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -60,9 +57,8 @@ fn matchit(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = black_box(router.at(black_box(&path)).unwrap()); + for path in black_box(paths()) { + let output = black_box(router.at(black_box(path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } @@ -78,9 +74,8 @@ fn ntex_router(bencher: divan::Bencher<'_, '_>) { let router = router.finish(); bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = ntex_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = ntex_router::Path::new(path); router.recognize(&mut path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -96,9 +91,8 @@ fn path_tree(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.find(&path).unwrap(); + for path in black_box(paths()) { + let output = router.find(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.1.params_iter().map(|p| (p.0, p.1)).collect()); } @@ -113,9 +107,8 @@ fn route_recognizer(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.recognize(&path).unwrap(); + for path in black_box(paths()) { + let output = router.recognize(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params().iter().map(|p| (p.0, p.1)).collect()); } @@ -130,9 +123,8 @@ fn routefinder(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.best_match(&path).unwrap(); + for path in black_box(paths()) { + let output = router.best_match(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.captures().iter().map(|p| (p.0, p.1)).collect()); } @@ -147,9 +139,8 @@ fn xitca_router(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.at(&path).unwrap(); + for path in black_box(paths()) { + let output = router.at(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } diff --git a/benches/path_tree_criterion.rs b/benches/path_tree_criterion.rs index 01ff44c9..481befb6 100644 --- a/benches/path_tree_criterion.rs +++ b/benches/path_tree_criterion.rs @@ -1,10 +1,10 @@ //! Benches sourced from `path-tree` (MIT OR Apache-2.0) //! +use std::hint::black_box; + use codspeed_criterion_compat::{criterion_group, criterion_main, Criterion}; use path_tree_routes::paths; -use percent_encoding::percent_decode; -use std::hint::black_box; pub mod path_tree_routes; @@ -21,31 +21,28 @@ fn path_tree_benchmark(criterion: &mut Criterion) { group.bench_function("path-tree benchmarks/wayfind", |bencher| { let mut router = wayfind::Router::new(); for (index, route) in routes!(brackets).iter().enumerate() { - let route = wayfind::RouteBuilder::new().route(route).build().unwrap(); - router.insert(&route, index).unwrap(); + router.insert(route, index).unwrap(); } bencher.iter(|| { - for route in black_box(paths()) { - let request = wayfind::RequestBuilder::new().path(route).build().unwrap(); - let output = black_box(router.search(black_box(&request)).unwrap().unwrap()); + for path in black_box(paths()) { + let output = black_box(router.search(black_box(path)).unwrap().unwrap()); let _parameters: Vec<(&str, &str)> = - black_box(output.path.parameters.iter().map(|p| (p.0, p.1)).collect()); + black_box(output.parameters.iter().map(|p| (p.0, p.1)).collect()); } }); }); group.bench_function("path-tree benchmarks/actix-router", |bencher| { - let mut router = actix_router::Router::::build(); - for (index, route) in routes!(brackets).iter().enumerate() { - router.path(*route, index); + let mut router = actix_router::Router::::build(); + for route in routes!(brackets) { + router.path(route, true); } let router = router.finish(); bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = actix_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = actix_router::Path::new(path); black_box(router.recognize(black_box(&mut path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -60,9 +57,8 @@ fn path_tree_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = black_box(router.at(black_box(&path)).unwrap()); + for path in black_box(paths()) { + let output = black_box(router.at(black_box(path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } @@ -70,16 +66,15 @@ fn path_tree_benchmark(criterion: &mut Criterion) { }); group.bench_function("path-tree benchmarks/ntex-router", |bencher| { - let mut router = ntex_router::Router::::build(); - for (index, route) in routes!(brackets).iter().enumerate() { - router.path(*route, index); + let mut router = ntex_router::Router::::build(); + for route in routes!(brackets) { + router.path(route, true); } let router = router.finish(); bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = ntex_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = ntex_router::Path::new(path); router.recognize(&mut path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -94,9 +89,8 @@ fn path_tree_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.find(&path).unwrap(); + for path in black_box(paths()) { + let output = router.find(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.1.params_iter().map(|p| (p.0, p.1)).collect()); } @@ -110,9 +104,8 @@ fn path_tree_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.recognize(&path).unwrap(); + for path in black_box(paths()) { + let output = router.recognize(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params().iter().map(|p| (p.0, p.1)).collect()); } @@ -126,9 +119,8 @@ fn path_tree_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.best_match(&path).unwrap(); + for path in black_box(paths()) { + let output = router.best_match(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.captures().iter().map(|p| (p.0, p.1)).collect()); } @@ -142,9 +134,8 @@ fn path_tree_benchmark(criterion: &mut Criterion) { } bencher.iter(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.at(&path).unwrap(); + for path in black_box(paths()) { + let output = router.at(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } diff --git a/benches/path_tree_divan.rs b/benches/path_tree_divan.rs index f453a548..598b3646 100644 --- a/benches/path_tree_divan.rs +++ b/benches/path_tree_divan.rs @@ -1,10 +1,10 @@ //! Benches sourced from `path-tree` (MIT OR Apache-2.0) //! +use std::hint::black_box; + use divan::AllocProfiler; use path_tree_routes::paths; -use percent_encoding::percent_decode; -use std::hint::black_box; pub mod path_tree_routes; @@ -19,32 +19,29 @@ fn main() { fn wayfind(bencher: divan::Bencher<'_, '_>) { let mut router = wayfind::Router::new(); for (index, route) in routes!(brackets).iter().enumerate() { - let route = wayfind::RouteBuilder::new().route(route).build().unwrap(); - router.insert(&route, index).unwrap(); + router.insert(route, index).unwrap(); } bencher.bench(|| { - for route in black_box(paths()) { - let request = wayfind::RequestBuilder::new().path(route).build().unwrap(); - let output = black_box(router.search(black_box(&request)).unwrap().unwrap()); + for path in black_box(paths()) { + let output = black_box(router.search(black_box(path)).unwrap().unwrap()); let _parameters: Vec<(&str, &str)> = - black_box(output.path.parameters.iter().map(|p| (p.0, p.1)).collect()); + black_box(output.parameters.iter().map(|p| (p.0, p.1)).collect()); } }); } #[divan::bench(name = "actix-router")] fn actix_router(bencher: divan::Bencher<'_, '_>) { - let mut router = actix_router::Router::::build(); - for (index, route) in routes!(brackets).iter().enumerate() { - router.path(*route, index); + let mut router = actix_router::Router::::build(); + for route in routes!(brackets) { + router.path(route, true); } let router = router.finish(); bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = actix_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = actix_router::Path::new(path); black_box(router.recognize(black_box(&mut path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -60,9 +57,8 @@ fn matchit(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let route = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = black_box(router.at(black_box(&route)).unwrap()); + for path in black_box(paths()) { + let output = black_box(router.at(black_box(path)).unwrap()); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } @@ -71,16 +67,15 @@ fn matchit(bencher: divan::Bencher<'_, '_>) { #[divan::bench(name = "ntex-router")] fn ntex_router(bencher: divan::Bencher<'_, '_>) { - let mut router = ntex_router::Router::::build(); - for (index, route) in routes!(brackets).iter().enumerate() { - router.path(*route, index); + let mut router = ntex_router::Router::::build(); + for route in routes!(brackets) { + router.path(route, true); } let router = router.finish(); bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let mut path = ntex_router::Path::new(path.as_ref()); + for path in black_box(paths()) { + let mut path = ntex_router::Path::new(path); router.recognize(&mut path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(path.iter().map(|p| (p.0, p.1)).collect()); @@ -96,9 +91,8 @@ fn path_tree(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.find(&path).unwrap(); + for path in black_box(paths()) { + let output = router.find(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.1.params_iter().map(|p| (p.0, p.1)).collect()); } @@ -113,9 +107,8 @@ fn route_recognizer(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.recognize(&path).unwrap(); + for path in black_box(paths()) { + let output = router.recognize(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params().iter().map(|p| (p.0, p.1)).collect()); } @@ -130,9 +123,8 @@ fn routefinder(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.best_match(&path).unwrap(); + for path in black_box(paths()) { + let output = router.best_match(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.captures().iter().map(|p| (p.0, p.1)).collect()); } @@ -147,9 +139,8 @@ fn xitca_router(bencher: divan::Bencher<'_, '_>) { } bencher.bench(|| { - for route in black_box(paths()) { - let path = percent_decode(route.as_bytes()).decode_utf8().unwrap(); - let output = router.at(&path).unwrap(); + for path in black_box(paths()) { + let output = router.at(path).unwrap(); let _parameters: Vec<(&str, &str)> = black_box(output.params.iter().map(|p| (p.0, p.1)).collect()); } diff --git a/crates/authority/Cargo.toml b/crates/authority/Cargo.toml deleted file mode 100644 index 18a74f3f..00000000 --- a/crates/authority/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -# https://doc.rust-lang.org/cargo/reference/manifest.html -[package] -name = "wayfind-authority" -description = "Authority router for `wayfind`." -publish = false - -version.workspace = true -authors.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lints] -workspace = true - -[dependencies] -smallvec = { workspace = true } - -[dev-dependencies] -insta = { workspace = true } -similar-asserts = { workspace = true } diff --git a/crates/authority/src/constraints.rs b/crates/authority/src/constraints.rs deleted file mode 100644 index 2022185b..00000000 --- a/crates/authority/src/constraints.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub trait AuthorityConstraint: Send + Sync { - const NAME: &'static str; - - fn check(segment: &str) -> bool; -} diff --git a/crates/authority/src/delete.rs b/crates/authority/src/delete.rs deleted file mode 100644 index 1a18f680..00000000 --- a/crates/authority/src/delete.rs +++ /dev/null @@ -1,142 +0,0 @@ -use super::{ - node::Node, - parser::{ParsedTemplate, Part}, - state::{State, StaticState}, -}; - -impl Node<'_, S> { - /// Deletes an authority route from the node tree. - /// - /// This method recursively traverses the tree to find and remove the specified authority. - /// Logic should match that used by the insert method. - /// - /// If the authority is found and deleted, we re-optimize the tree structure. - pub fn delete(&mut self, authority: &mut ParsedTemplate) { - if let Some(part) = authority.parts.pop() { - match part { - Part::Static { prefix } => self.delete_static(authority, &prefix), - Part::Dynamic { - name, constraint, .. - } => self.delete_dynamic(authority, &name, constraint.as_ref()), - Part::Wildcard { - name, constraint, .. - } if authority.parts.is_empty() => { - self.delete_end_wildcard(&name, constraint.as_ref()); - } - Part::Wildcard { - name, constraint, .. - } => self.delete_wildcard(authority, &name, constraint.as_ref()), - } - } else { - self.data.take(); - self.needs_optimization = true; - } - } - - fn delete_static(&mut self, authority: &mut ParsedTemplate, prefix: &[u8]) { - let Some(index) = self.static_children.iter().position(|child| { - prefix.len() >= child.state.prefix.len() - && child.state.prefix.iter().zip(prefix).all(|(a, b)| a == b) - }) else { - return; - }; - - let child = &mut self.static_children[index]; - child.needs_optimization = true; - - let remaining_prefix = &prefix[child.state.prefix.len()..]; - if remaining_prefix.is_empty() { - child.delete(authority); - } else { - child.delete_static(authority, remaining_prefix); - }; - - if child.is_empty() { - // Delete empty nodes. - self.static_children.remove(index); - self.needs_optimization = true; - } else if child.is_compressible() { - // Compress redundant nodes. - let merge = child.static_children.remove(0); - - let mut prefix = std::mem::take(&mut child.state.prefix); - prefix.extend(&merge.state.prefix); - - *child = Node { - state: StaticState::new(prefix), - needs_optimization: true, - ..merge - }; - } - } - - fn delete_dynamic( - &mut self, - authority: &mut ParsedTemplate, - name: &str, - constraint: Option<&String>, - ) { - let Some(index) = self.dynamic_children.iter().position(|child| { - child.state.name == name && child.state.constraint.as_ref() == constraint - }) else { - return; - }; - - let child = &mut self.dynamic_children[index]; - child.delete(authority); - - if child.is_empty() { - self.dynamic_children.remove(index); - self.needs_optimization = true; - } - } - - fn delete_wildcard( - &mut self, - authority: &mut ParsedTemplate, - name: &str, - constraint: Option<&String>, - ) { - let Some(index) = self.wildcard_children.iter().position(|child| { - child.state.name == name && child.state.constraint.as_ref() == constraint - }) else { - return; - }; - - let child = &mut self.wildcard_children[index]; - child.delete(authority); - - if child.is_empty() { - self.wildcard_children.remove(index); - self.needs_optimization = true; - } - } - - fn delete_end_wildcard(&mut self, name: &str, constraint: Option<&String>) { - let Some(index) = self.end_wildcard_children.iter().position(|child| { - child.state.name == name && child.state.constraint.as_ref() == constraint - }) else { - return; - }; - - let mut child = self.end_wildcard_children.remove(index); - child.data.take(); - self.needs_optimization = true; - } - - fn is_empty(&self) -> bool { - self.data.is_none() - && self.static_children.is_empty() - && self.dynamic_children.is_empty() - && self.wildcard_children.is_empty() - && self.end_wildcard_children.is_empty() - } - - fn is_compressible(&self) -> bool { - self.data.is_none() - && self.static_children.len() == 1 - && self.dynamic_children.is_empty() - && self.wildcard_children.is_empty() - && self.end_wildcard_children.is_empty() - } -} diff --git a/crates/authority/src/display.rs b/crates/authority/src/display.rs deleted file mode 100644 index c3197882..00000000 --- a/crates/authority/src/display.rs +++ /dev/null @@ -1,103 +0,0 @@ -use crate::{node::Node, state::State}; -use std::fmt::{Display, Write}; - -impl Display for Node<'_, S> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - fn debug_node( - output: &mut String, - node: &Node<'_, S>, - padding: &str, - is_top: bool, - is_last: bool, - ) -> std::fmt::Result { - let key = node.state.key(); - - if is_top { - if let Some(data) = node.data.as_ref() { - writeln!(output, "{key} [{}]", data.id)?; - } else { - writeln!(output, "{key}")?; - } - } else { - let branch = if is_last { "╰─" } else { "├─" }; - if let Some(data) = node.data.as_ref() { - writeln!(output, "{padding}{branch} {key} [{}]", data.id)?; - } else { - writeln!(output, "{padding}{branch} {key}")?; - } - } - - let new_prefix = if is_top { - padding.to_owned() - } else if is_last { - format!("{padding} ") - } else { - format!("{padding}│ ") - }; - - let mut total_children = node.static_children.len() - + node.dynamic_children.len() - + node.wildcard_children.len() - + node.end_wildcard_children.len(); - - for child in node.static_children.iter() { - total_children -= 1; - debug_node(output, child, &new_prefix, false, total_children == 0)?; - } - - for child in node.dynamic_children.iter() { - total_children -= 1; - debug_node(output, child, &new_prefix, false, total_children == 0)?; - } - - for child in node.wildcard_children.iter() { - total_children -= 1; - debug_node(output, child, &new_prefix, false, total_children == 0)?; - } - - for child in node.end_wildcard_children.iter() { - total_children -= 1; - debug_node(output, child, &new_prefix, false, total_children == 0)?; - } - - Ok(()) - } - - let mut output = String::new(); - let padding = " ".repeat(self.state.padding()); - - // Handle root node manually - if self.state.key().is_empty() { - let total_children = self.static_children.len() - + self.dynamic_children.len() - + self.wildcard_children.len() - + self.end_wildcard_children.len(); - - let mut remaining = total_children; - - for child in self.static_children.iter() { - remaining -= 1; - debug_node(&mut output, child, "", true, remaining == 0)?; - } - - for child in self.dynamic_children.iter() { - remaining -= 1; - debug_node(&mut output, child, "", true, remaining == 0)?; - } - - for child in self.wildcard_children.iter() { - remaining -= 1; - debug_node(&mut output, child, "", true, remaining == 0)?; - } - - for child in self.end_wildcard_children.iter() { - remaining -= 1; - debug_node(&mut output, child, "", true, remaining == 0)?; - } - } else { - debug_node(&mut output, self, &padding, true, true)?; - } - - write!(f, "{}", output.trim_end()) - } -} diff --git a/crates/authority/src/errors.rs b/crates/authority/src/errors.rs deleted file mode 100644 index 0a8bcada..00000000 --- a/crates/authority/src/errors.rs +++ /dev/null @@ -1,17 +0,0 @@ -pub mod constraint; -pub use constraint::ConstraintError; - -pub mod delete; -pub use delete::DeleteError; - -pub mod encoding; -pub use encoding::EncodingError; - -pub mod insert; -pub use insert::InsertError; - -pub mod search; -pub use search::SearchError; - -pub mod template; -pub use template::TemplateError; diff --git a/crates/authority/src/errors/constraint.rs b/crates/authority/src/errors/constraint.rs deleted file mode 100644 index 13746a54..00000000 --- a/crates/authority/src/errors/constraint.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum ConstraintError { - DuplicateName { - name: &'static str, - existing_type: &'static str, - new_type: &'static str, - }, -} - -impl Error for ConstraintError {} - -impl Display for ConstraintError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::DuplicateName { - name, - existing_type, - new_type, - } => write!( - f, - "duplicate constraint name - -The constraint name '{name}' is already in use: - - existing constraint type: '{existing_type}' - - new constraint type: '{new_type}' - -help: each constraint must have a unique name - -try: - - Check if you have accidentally added the same constraint twice - - Ensure different constraints have different names", - ), - } - } -} diff --git a/crates/authority/src/errors/delete.rs b/crates/authority/src/errors/delete.rs deleted file mode 100644 index 4f29a61e..00000000 --- a/crates/authority/src/errors/delete.rs +++ /dev/null @@ -1,54 +0,0 @@ -use super::TemplateError; -use crate::errors::EncodingError; -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum DeleteError { - Encoding(EncodingError), - Template(TemplateError), - NotFound { authority: String }, - Mismatch { authority: String, inserted: String }, -} - -impl Error for DeleteError {} - -impl Display for DeleteError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Encoding(error) => error.fmt(f), - Self::Template(error) => error.fmt(f), - Self::NotFound { authority } => write!( - f, - r"not found - - Authority: {authority} - -The specified authority does not exist in the router" - ), - Self::Mismatch { - authority, - inserted, - } => write!( - f, - r"delete mismatch - - Authority: {authority} - Inserted: {inserted} - -The authority must be deleted using the same format as was inserted" - ), - } - } -} - -impl From for DeleteError { - fn from(error: EncodingError) -> Self { - Self::Encoding(error) - } -} - -impl From for DeleteError { - fn from(error: TemplateError) -> Self { - Self::Template(error) - } -} diff --git a/crates/authority/src/errors/encoding.rs b/crates/authority/src/errors/encoding.rs deleted file mode 100644 index 58f4ed12..00000000 --- a/crates/authority/src/errors/encoding.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::{error::Error, fmt::Display}; - -/// Errors relating to attempting to decode strings. -#[derive(Debug, PartialEq, Eq)] -pub enum EncodingError { - /// Invalid UTF-8 sequence encountered. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::EncodingError; - /// - /// let error = EncodingError::Utf8Error { - /// input: "hello�world".to_string(), - /// }; - /// - /// let display = " - /// invalid UTF-8 sequence - /// - /// Input: hello�world - /// - /// Expected: valid UTF-8 characters - /// Found: invalid byte sequence - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - Utf8Error { - /// The invalid input. - /// This will contain UTF-8 replacement symbols. - input: String, - }, -} - -impl Error for EncodingError {} - -impl Display for EncodingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Utf8Error { input } => { - write!( - f, - "invalid UTF-8 sequence - - Input: {input} - -Expected: valid UTF-8 characters - Found: invalid byte sequence", - ) - } - } - } -} diff --git a/crates/authority/src/errors/insert.rs b/crates/authority/src/errors/insert.rs deleted file mode 100644 index d8e4e176..00000000 --- a/crates/authority/src/errors/insert.rs +++ /dev/null @@ -1,35 +0,0 @@ -use super::TemplateError; -use crate::AuthorityId; -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum InsertError { - TemplateError(TemplateError), - Overlapping { ids: Vec }, - UnknownConstraint { constraint: String }, -} - -impl Error for InsertError {} - -impl Display for InsertError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::TemplateError(error) => error.fmt(f), - Self::Overlapping { ids } => write!(f, r"overlapping authorities {ids:?}"), - Self::UnknownConstraint { constraint } => write!( - f, - r"unknown constraint - - Constraint: {constraint} - -The router doesn't recognize this constraint" - ), - } - } -} - -impl From for InsertError { - fn from(error: TemplateError) -> Self { - Self::TemplateError(error) - } -} diff --git a/crates/authority/src/errors/search.rs b/crates/authority/src/errors/search.rs deleted file mode 100644 index 5c6f3117..00000000 --- a/crates/authority/src/errors/search.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::errors::EncodingError; -use std::{error::Error, fmt::Display}; - -/// Errors relating to attempting to search for a match in a [`Router`](crate::Router). -#[derive(Debug, PartialEq, Eq)] -pub enum SearchError { - /// A [`EncodingError`] that occurred during the search. - Encoding(EncodingError), -} - -impl Error for SearchError {} - -impl Display for SearchError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Encoding(error) => error.fmt(f), - } - } -} - -impl From for SearchError { - fn from(error: EncodingError) -> Self { - Self::Encoding(error) - } -} diff --git a/crates/authority/src/errors/template.rs b/crates/authority/src/errors/template.rs deleted file mode 100644 index db0a0ab6..00000000 --- a/crates/authority/src/errors/template.rs +++ /dev/null @@ -1,483 +0,0 @@ -use crate::errors::EncodingError; -use std::{error::Error, fmt::Display}; - -/// Errors relating to malformed authorities. -#[derive(Debug, PartialEq, Eq)] -pub enum TemplateError { - /// A [`EncodingError`] that occurred during the decoding. - Encoding(EncodingError), - - /// The authority is empty. - Empty, - - /// Empty braces were found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::EmptyBraces { - /// authority: "{}".to_string(), - /// position: 0, - /// }; - /// - /// let display = " - /// empty braces - /// - /// Authority: {} - /// ^^ - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - EmptyBraces { - /// The authority containing empty braces. - authority: String, - /// The position of the first empty brace. - position: usize, - }, - - /// An unbalanced brace was found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::UnbalancedBrace { - /// authority: "{".to_string(), - /// position: 0, - /// }; - /// - /// let display = " - /// unbalanced brace - /// - /// Authority: { - /// ^ - /// - /// tip: Use '\\{' and '\\}' to represent literal '{' and '}' characters in the authority - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - UnbalancedBrace { - /// The authority containing an unbalanced brace. - authority: String, - /// The position of the unbalanced brace. - position: usize, - }, - - /// An empty parameter name was found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::EmptyParameter { - /// authority: "{:}".to_string(), - /// start: 0, - /// length: 3, - /// }; - /// - /// let display = " - /// empty parameter name - /// - /// Authority: {:} - /// ^^^ - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - EmptyParameter { - /// The authority containing an empty parameter. - authority: String, - /// The position of the opening brace of the empty name parameter. - start: usize, - /// The length of the parameter (including braces). - length: usize, - }, - - /// An invalid parameter name was found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::InvalidParameter { - /// authority: "{a.b}".to_string(), - /// name: "a.b".to_string(), - /// start: 0, - /// length: 5, - /// }; - /// - /// let display = " - /// invalid parameter name - /// - /// Authority: {a.b} - /// ^^^^^ - /// - /// tip: Parameter names must not contain the characters: ':', '*', '{', '}', '.' - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - InvalidParameter { - /// The authority containing an invalid parameter. - authority: String, - /// The invalid parameter name. - name: String, - /// The position of the opening brace of the invalid name parameter. - start: usize, - /// The length of the parameter (including braces). - length: usize, - }, - - /// A duplicate parameter name was found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::DuplicateParameter { - /// authority: "{id}.{id}".to_string(), - /// name: "id".to_string(), - /// first: 0, - /// first_length: 4, - /// second: 5, - /// second_length: 4, - /// }; - /// - /// let display = " - /// duplicate parameter name: 'id' - /// - /// Authority: {id}.{id} - /// ^^^^ ^^^^ - /// - /// tip: Parameter names must be unique within an authority - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - DuplicateParameter { - /// The authority containing duplicate parameters. - authority: String, - /// The duplicated parameter name. - name: String, - /// The position of the opening brace of the first occurrence. - first: usize, - /// The length of the first parameter (including braces). - first_length: usize, - /// The position of the opening brace of the second occurrence. - second: usize, - /// The length of the second parameter (including braces). - second_length: usize, - }, - - /// A wildcard parameter with no name was found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::EmptyWildcard { - /// authority: "{*}".to_string(), - /// start: 0, - /// length: 3, - /// }; - /// - /// let display = " - /// empty wildcard name - /// - /// Authority: {*} - /// ^^^ - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - EmptyWildcard { - /// The authority containing an empty wildcard parameter. - authority: String, - /// The position of the opening brace of the empty wildcard parameter. - start: usize, - /// The length of the parameter (including braces). - length: usize, - }, - - /// An empty constraint name was found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::EmptyConstraint { - /// authority: "{a:}".to_string(), - /// start: 0, - /// length: 4, - /// }; - /// - /// let display = " - /// empty constraint name - /// - /// Authority: {a:} - /// ^^^^ - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - EmptyConstraint { - /// The authority containing an empty constraint. - authority: String, - /// The position of the opening brace of the empty constraint parameter. - start: usize, - /// The length of the parameter (including braces). - length: usize, - }, - - /// An invalid constraint name was found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::InvalidConstraint { - /// authority: "{a:b/c}".to_string(), - /// name: "b/c".to_string(), - /// start: 0, - /// length: 7, - /// }; - /// - /// let display = " - /// invalid constraint name - /// - /// Authority: {a:b/c} - /// ^^^^^^^ - /// - /// tip: Constraint names must not contain the characters: ':', '*', '{', '}', '.' - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - InvalidConstraint { - /// The authority containing an invalid constraint. - authority: String, - /// The invalid constraint name. - name: String, - /// The position of the opening brace of the invalid constraint parameter. - start: usize, - /// The length of the parameter (including braces). - length: usize, - }, - - /// Two parameters side by side were found in the authority. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_authority::errors::TemplateError; - /// - /// let error = TemplateError::TouchingParameters { - /// authority: "{a}{b}".to_string(), - /// start: 0, - /// length: 6, - /// }; - /// - /// let display = " - /// touching parameters - /// - /// Authority: {a}{b} - /// ^^^^^^ - /// - /// tip: Touching parameters are not supported - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - TouchingParameters { - /// The authority containing touching parameters. - authority: String, - /// The position of the first opening brace. - start: usize, - /// The combined length of both parameters (including braces). - length: usize, - }, -} - -impl Error for TemplateError {} - -impl Display for TemplateError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Encoding(error) => error.fmt(f), - Self::Empty => write!(f, "empty authority"), - - Self::EmptyBraces { - authority, - position, - } => { - let arrow = " ".repeat(*position) + "^^"; - write!( - f, - r"empty braces - - Authority: {authority} - {arrow}" - ) - } - - Self::UnbalancedBrace { - authority, - position, - } => { - let arrow = " ".repeat(*position) + "^"; - write!( - f, - r"unbalanced brace - - Authority: {authority} - {arrow} - -tip: Use '\{{' and '\}}' to represent literal '{{' and '}}' characters in the authority" - ) - } - - Self::EmptyParameter { - authority, - start, - length, - } => { - let arrow = " ".repeat(*start) + &"^".repeat(*length); - write!( - f, - r"empty parameter name - - Authority: {authority} - {arrow}" - ) - } - - Self::InvalidParameter { - authority, - start, - length, - .. - } => { - let arrow = " ".repeat(*start) + &"^".repeat(*length); - write!( - f, - r"invalid parameter name - - Authority: {authority} - {arrow} - -tip: Parameter names must not contain the characters: ':', '*', '{{', '}}', '.'" - ) - } - - Self::DuplicateParameter { - authority, - name, - first, - first_length, - second, - second_length, - } => { - let mut arrow = " ".repeat(authority.len()); - - arrow.replace_range(*first..(*first + *first_length), &"^".repeat(*first_length)); - - arrow.replace_range( - *second..(*second + *second_length), - &"^".repeat(*second_length), - ); - - write!( - f, - r"duplicate parameter name: '{name}' - - Authority: {authority} - {arrow} - -tip: Parameter names must be unique within an authority" - ) - } - - Self::EmptyWildcard { - authority, - start, - length, - } => { - let arrow = " ".repeat(*start) + &"^".repeat(*length); - write!( - f, - r"empty wildcard name - - Authority: {authority} - {arrow}" - ) - } - - Self::EmptyConstraint { - authority, - start, - length, - } => { - let arrow = " ".repeat(*start) + &"^".repeat(*length); - write!( - f, - r"empty constraint name - - Authority: {authority} - {arrow}" - ) - } - - Self::InvalidConstraint { - authority, - start, - length, - .. - } => { - let arrow = " ".repeat(*start) + &"^".repeat(*length); - write!( - f, - r"invalid constraint name - - Authority: {authority} - {arrow} - -tip: Constraint names must not contain the characters: ':', '*', '{{', '}}', '.'" - ) - } - - Self::TouchingParameters { - authority, - start, - length, - } => { - let arrow = " ".repeat(*start) + &"^".repeat(*length); - write!( - f, - r"touching parameters - - Authority: {authority} - {arrow} - -tip: Touching parameters are not supported" - ) - } - } - } -} - -impl From for TemplateError { - fn from(error: EncodingError) -> Self { - Self::Encoding(error) - } -} diff --git a/crates/authority/src/find.rs b/crates/authority/src/find.rs deleted file mode 100644 index 46895e3f..00000000 --- a/crates/authority/src/find.rs +++ /dev/null @@ -1,111 +0,0 @@ -use super::{ - node::Node, - parser::{ParsedTemplate, Part}, - state::State, - AuthorityData, -}; - -impl<'r, S: State> Node<'r, S> { - pub(crate) fn find(&'r self, authority: &mut ParsedTemplate) -> Option<&'r AuthorityData<'r>> { - if authority.parts.is_empty() { - return self.data.as_ref(); - } - - if let Some(part) = authority.parts.pop() { - return match part { - Part::Static { prefix } => self.find_static(authority, &prefix), - Part::Dynamic { name, constraint } => { - self.find_dynamic(authority, &name, constraint.as_deref()) - } - Part::Wildcard { name, constraint } if authority.parts.is_empty() => { - self.find_end_wildcard(authority, &name, constraint.as_deref()) - } - Part::Wildcard { name, constraint } => { - self.find_wildcard(authority, &name, constraint.as_deref()) - } - }; - } - - None - } - - fn find_static( - &'r self, - authority: &mut ParsedTemplate, - prefix: &[u8], - ) -> Option<&'r AuthorityData<'r>> { - for child in self.static_children.iter() { - if !child.state.prefix.is_empty() && child.state.prefix[0] == prefix[0] { - let common_prefix = prefix - .iter() - .zip(&child.state.prefix) - .take_while(|&(x, y)| x == y) - .count(); - - if common_prefix >= child.state.prefix.len() { - if common_prefix >= prefix.len() { - return child.find(authority); - } - - let remaining = prefix[common_prefix..].to_vec(); - if !remaining.is_empty() { - let mut new_authority = ParsedTemplate { - parts: authority.parts.clone(), - ..authority.clone() - }; - - new_authority.parts.push(Part::Static { prefix: remaining }); - return child.find(&mut new_authority); - } - } - } - } - - None - } - - fn find_dynamic( - &'r self, - authority: &mut ParsedTemplate, - name: &str, - constraint: Option<&str>, - ) -> Option<&'r AuthorityData<'r>> { - for child in self.dynamic_children.iter() { - if child.state.name == name && child.state.constraint.as_deref() == constraint { - return child.find(authority); - } - } - - None - } - - fn find_end_wildcard( - &'r self, - authority: &mut ParsedTemplate, - name: &str, - constraint: Option<&str>, - ) -> Option<&'r AuthorityData<'r>> { - for child in self.end_wildcard_children.iter() { - if child.state.name == name && child.state.constraint.as_deref() == constraint { - return child.find(authority); - } - } - - None - } - - fn find_wildcard( - &'r self, - authority: &mut ParsedTemplate, - name: &str, - constraint: Option<&str>, - ) -> Option<&'r AuthorityData<'r>> { - for child in self.wildcard_children.iter() { - if child.state.name == name && child.state.constraint.as_deref() == constraint { - return child.find(authority); - } - } - - None - } -} diff --git a/crates/authority/src/id.rs b/crates/authority/src/id.rs deleted file mode 100644 index e3ff2331..00000000 --- a/crates/authority/src/id.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::fmt::Display; - -#[derive(Clone, Default)] -pub struct AuthorityIdGenerator { - id: usize, -} - -impl AuthorityIdGenerator { - pub fn generate(&mut self) -> AuthorityId { - self.id += 1; - AuthorityId(Some(self.id)) - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct AuthorityId(pub Option); - -impl Display for AuthorityId { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(id) = self.0 { - write!(f, "{id}") - } else { - write!(f, "*") - } - } -} diff --git a/crates/authority/src/insert.rs b/crates/authority/src/insert.rs deleted file mode 100644 index 0589808e..00000000 --- a/crates/authority/src/insert.rs +++ /dev/null @@ -1,239 +0,0 @@ -use super::{ - node::Node, - parser::{ParsedTemplate, Part}, - state::{DynamicState, EndWildcardState, State, StaticState, WildcardState}, - AuthorityData, -}; -use crate::vec::SortedVec; - -impl<'r, S: State> Node<'r, S> { - /// Inserts a new authority route into the node tree with associated data. - /// Recursively traverses the node tree, creating new nodes as necessary. - pub fn insert(&mut self, authority: &mut ParsedTemplate, data: AuthorityData<'r>) { - if let Some(part) = authority.parts.pop() { - match part { - Part::Static { prefix } => self.insert_static(authority, data, &prefix), - Part::Dynamic { - name, constraint, .. - } => { - self.insert_dynamic(authority, data, name, constraint); - } - Part::Wildcard { - name, constraint, .. - } if authority.parts.is_empty() => { - self.insert_end_wildcard(data, name, constraint); - } - Part::Wildcard { - name, constraint, .. - } => { - self.insert_wildcard(authority, data, name, constraint); - } - }; - } else { - self.data = Some(data); - self.needs_optimization = true; - } - } - - fn insert_static( - &mut self, - authority: &mut ParsedTemplate, - data: AuthorityData<'r>, - prefix: &[u8], - ) { - let Some(child) = self - .static_children - .iter_mut() - .find(|child| child.state.prefix[0] == prefix[0]) - else { - self.static_children.push({ - let mut new_child = Node { - state: StaticState::new(prefix.to_vec()), - data: None, - - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), - dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), - wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), - - priority: 0, - needs_optimization: false, - }; - - new_child.insert(authority, data); - new_child - }); - - self.needs_optimization = true; - return; - }; - - let common_prefix = prefix - .iter() - .zip::<&[u8]>(child.state.prefix.as_ref()) - .take_while(|&(x, y)| x == y) - .count(); - - if common_prefix >= child.state.prefix.len() { - if common_prefix >= prefix.len() { - child.insert(authority, data); - } else { - child.insert_static(authority, data, &prefix[common_prefix..]); - } - - self.needs_optimization = true; - return; - } - - let new_child_a = Node { - state: StaticState::new(child.state.prefix[common_prefix..].to_vec()), - data: child.data.take(), - - static_children: std::mem::take(&mut child.static_children), - dynamic_children: std::mem::take(&mut child.dynamic_children), - dynamic_children_shortcut: child.dynamic_children_shortcut, - wildcard_children: std::mem::take(&mut child.wildcard_children), - wildcard_children_shortcut: child.wildcard_children_shortcut, - end_wildcard_children: std::mem::take(&mut child.end_wildcard_children), - - priority: child.priority, - needs_optimization: child.needs_optimization, - }; - - let new_child_b = Node { - state: StaticState::new(prefix[common_prefix..].to_vec()), - data: None, - - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), - dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), - wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), - - priority: 0, - needs_optimization: false, - }; - - child.state = StaticState::new(child.state.prefix[..common_prefix].to_vec()); - child.needs_optimization = true; - - if prefix[common_prefix..].is_empty() { - child.static_children = SortedVec::new(vec![new_child_a]); - child.insert(authority, data); - } else { - child.static_children = SortedVec::new(vec![new_child_a, new_child_b]); - child.static_children[1].insert(authority, data); - } - - self.needs_optimization = true; - } - - fn insert_dynamic( - &mut self, - authority: &mut ParsedTemplate, - data: AuthorityData<'r>, - name: String, - constraint: Option, - ) { - if let Some(child) = self - .dynamic_children - .find_mut(|child| child.state.name == name && child.state.constraint == constraint) - { - child.insert(authority, data); - } else { - self.dynamic_children.push({ - let mut new_child = Node { - state: DynamicState::new(name, constraint), - data: None, - - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), - dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), - wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), - - priority: 0, - needs_optimization: false, - }; - - new_child.insert(authority, data); - new_child - }); - } - - self.needs_optimization = true; - } - - fn insert_wildcard( - &mut self, - authority: &mut ParsedTemplate, - data: AuthorityData<'r>, - name: String, - constraint: Option, - ) { - if let Some(child) = self - .wildcard_children - .find_mut(|child| child.state.name == name && child.state.constraint == constraint) - { - child.insert(authority, data); - } else { - self.wildcard_children.push({ - let mut new_child = Node { - state: WildcardState::new(name, constraint), - data: None, - - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), - dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), - wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), - - priority: 0, - needs_optimization: false, - }; - - new_child.insert(authority, data); - new_child - }); - } - - self.needs_optimization = true; - } - - fn insert_end_wildcard( - &mut self, - data: AuthorityData<'r>, - name: String, - constraint: Option, - ) { - if self - .end_wildcard_children - .iter() - .any(|child| child.state.name == name && child.state.constraint == constraint) - { - return; - } - - self.end_wildcard_children.push(Node { - state: EndWildcardState::new(name, constraint), - data: Some(data), - - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), - dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), - wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), - - priority: 0, - needs_optimization: false, - }); - - self.needs_optimization = true; - } -} diff --git a/crates/authority/src/lib.rs b/crates/authority/src/lib.rs deleted file mode 100644 index ca0997cd..00000000 --- a/crates/authority/src/lib.rs +++ /dev/null @@ -1,222 +0,0 @@ -#![allow(clippy::missing_errors_doc, clippy::missing_panics_doc)] - -use crate::vec::SortedVec; -use errors::{ConstraintError, DeleteError, InsertError, SearchError}; -use id::AuthorityIdGenerator; -use node::Node; -use parser::{Parser, Part}; -use smallvec::{smallvec, SmallVec}; -use state::RootState; -use std::{collections::HashMap, fmt::Display}; - -pub mod constraints; -pub mod delete; -pub mod display; -pub mod errors; -pub mod find; -pub mod id; -pub mod insert; -pub mod node; -pub mod optimize; -pub mod parser; -pub mod search; -pub mod state; -pub mod vec; - -pub use constraints::AuthorityConstraint; -pub use id::AuthorityId; - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct AuthorityData<'r> { - pub id: AuthorityId, - pub authority: &'r str, -} - -#[derive(Debug, Eq, PartialEq)] -pub struct AuthorityMatch<'r, 'p> { - pub id: AuthorityId, - pub authority: &'r str, - pub parameters: AuthorityParameters<'r, 'p>, -} - -pub type AuthorityParameters<'r, 'p> = SmallVec<[(&'r str, &'p str); 4]>; - -#[derive(Clone)] -pub struct StoredConstraint { - pub type_name: &'static str, - pub check: fn(&str) -> bool, -} - -#[derive(Clone)] -pub struct AuthorityRouter<'r> { - pub root: Node<'r, RootState>, - pub constraints: HashMap<&'r str, StoredConstraint>, - pub id: AuthorityIdGenerator, -} - -impl<'r> AuthorityRouter<'r> { - #[must_use] - pub fn new() -> Self { - #[allow(unused_mut)] - let mut router = Self { - root: Node { - state: RootState::new(), - data: None, - - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), - dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), - wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), - - priority: 0, - needs_optimization: false, - }, - constraints: HashMap::default(), - id: AuthorityIdGenerator::default(), - }; - - // TODO - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - // router.constraint::().unwrap(); - - router - } - - pub fn constraint(&mut self) -> Result<(), ConstraintError> { - if let Some(existing) = self.constraints.get(C::NAME) { - return Err(ConstraintError::DuplicateName { - name: C::NAME, - existing_type: existing.type_name, - new_type: std::any::type_name::(), - }); - } - - self.constraints.insert( - C::NAME, - StoredConstraint { - type_name: std::any::type_name::(), - check: C::check, - }, - ); - - Ok(()) - } - - pub fn conflicts(&self, authority: &str) -> Result, DeleteError> { - let mut parsed = Parser::new(authority.as_bytes())?; - - if let Some(data) = self.root.find(&mut parsed.route) { - return Ok(Some(data.id)); - } - - Ok(None) - } - - pub fn insert(&mut self, authority: &'r str) -> Result { - let mut parsed = Parser::new(authority.as_bytes())?; - - // Check for invalid constraints - for part in &parsed.route.parts { - if let Part::Dynamic { - constraint: Some(name), - .. - } - | Part::Wildcard { - constraint: Some(name), - .. - } = part - { - if !self.constraints.contains_key(name.as_str()) { - return Err(InsertError::UnknownConstraint { - constraint: name.to_string(), - }); - } - } - } - - // Check for conflicts - if let Ok(Some(id)) = self.conflicts(authority) { - return Ok(id); - } - - // No conflicts, proceed with new insert - let id = self.id.generate(); - - self.root - .insert(&mut parsed.route, AuthorityData { id, authority }); - - self.root.optimize(); - Ok(id) - } - - pub fn find(&self, authority: &str) -> Result, DeleteError> { - let mut parsed = Parser::new(authority.as_bytes())?; - - if let Some(data) = self.root.find(&mut parsed.route) { - if data.authority != authority { - return Err(DeleteError::Mismatch { - authority: authority.to_owned(), - inserted: data.authority.to_owned(), - }); - } - Ok(Some(data.id)) - } else { - Ok(None) - } - } - - pub fn delete(&mut self, authority: &str) { - let Ok(mut parsed) = Parser::new(authority.as_bytes()) else { - return; - }; - - let Ok(Some(_)) = self.find(authority) else { - return; - }; - - self.root.delete(&mut parsed.route); - self.root.optimize(); - } - - pub fn search<'p>( - &'r self, - authority: &'p [u8], - ) -> Result>, SearchError> { - let mut parameters = smallvec![]; - let Some((data, _)) = self - .root - .search(authority, &mut parameters, &self.constraints)? - else { - return Ok(None); - }; - - Ok(Some(AuthorityMatch { - id: data.id, - authority: data.authority, - parameters, - })) - } -} - -impl Display for AuthorityRouter<'_> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.root) - } -} diff --git a/crates/authority/src/node.rs b/crates/authority/src/node.rs deleted file mode 100644 index 84d4b57e..00000000 --- a/crates/authority/src/node.rs +++ /dev/null @@ -1,44 +0,0 @@ -use super::{ - state::{DynamicState, EndWildcardState, State, StaticState, WildcardState}, - AuthorityData, -}; -use crate::vec::SortedVec; -use std::cmp::Ordering; - -/// Represents a node in the tree structure. -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct Node<'r, S: State> { - /// The type of Node, and associated structure data. - pub state: S, - - /// Optional data associated with this node. - /// The presence of this data is needed to successfully match a route. - pub data: Option>, - - pub static_children: SortedVec>, - pub dynamic_children: SortedVec>, - pub dynamic_children_shortcut: bool, - pub wildcard_children: SortedVec>, - pub wildcard_children_shortcut: bool, - pub end_wildcard_children: SortedVec>, - - /// Higher values indicate more specific matches. - pub priority: usize, - /// Flag indicating whether this node or its children need optimization. - pub needs_optimization: bool, -} - -impl PartialOrd for Node<'_, S> { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Node<'_, S> { - fn cmp(&self, other: &Self) -> Ordering { - other - .priority - .cmp(&self.priority) - .then_with(|| self.state.cmp(&other.state)) - } -} diff --git a/crates/authority/src/optimize.rs b/crates/authority/src/optimize.rs deleted file mode 100644 index 8552f44d..00000000 --- a/crates/authority/src/optimize.rs +++ /dev/null @@ -1,109 +0,0 @@ -use super::{node::Node, state::State, AuthorityData}; - -impl Node<'_, S> { - pub(crate) fn optimize(&mut self) { - self.optimize_inner(0); - } - - fn optimize_inner(&mut self, priority: usize) { - self.priority = priority + self.calculate_priority(); - - if !self.needs_optimization { - return; - } - - for child in self.static_children.iter_mut() { - child.optimize_inner(self.priority); - } - - for child in self.dynamic_children.iter_mut() { - child.optimize_inner(self.priority); - } - - for child in self.wildcard_children.iter_mut() { - child.optimize_inner(self.priority); - } - - for child in self.end_wildcard_children.iter_mut() { - child.optimize_inner(self.priority); - } - - self.static_children.sort(); - self.dynamic_children.sort(); - self.wildcard_children.sort(); - self.end_wildcard_children.sort(); - - self.update_dynamic_children_shortcut(); - self.update_wildcard_children_shortcut(); - - self.needs_optimization = false; - } - - fn calculate_priority(&self) -> usize { - let mut priority = self.state.priority(); - if self.data.is_some() { - priority += 1_000; - priority += match &self.data { - Some(AuthorityData { authority, .. }) => { - authority.len() + (authority.bytes().filter(|&b| b == b'.').count() * 100) - } - None => 0, - }; - } - - priority - } - - fn update_dynamic_children_shortcut(&mut self) { - self.dynamic_children_shortcut = self.dynamic_children.iter().all(|child| { - // Leading dot? - if child.state.name.as_bytes().first() == Some(&b'.') { - return true; - } - - // No children? - if child.static_children.is_empty() - && child.dynamic_children.is_empty() - && child.wildcard_children.is_empty() - && child.end_wildcard_children.is_empty() - { - return true; - } - - // All static children start with a dot? - if child - .static_children - .iter() - .all(|child| child.state.prefix.first() == Some(&b'.')) - { - return true; - } - - false - }); - } - - fn update_wildcard_children_shortcut(&mut self) { - self.wildcard_children_shortcut = self.wildcard_children.iter().all(|child| { - // No children? - if child.static_children.is_empty() - && child.dynamic_children.is_empty() - && child.wildcard_children.is_empty() - && child.end_wildcard_children.is_empty() - { - return true; - } - - // All static children start with a dot? - if child - .static_children - .iter() - .all(|child| child.state.prefix.first() == Some(&b'.')) - { - return true; - } - - false - }); - } -} diff --git a/crates/authority/src/parser.rs b/crates/authority/src/parser.rs deleted file mode 100644 index 4ace3263..00000000 --- a/crates/authority/src/parser.rs +++ /dev/null @@ -1,468 +0,0 @@ -use super::errors::TemplateError; -use crate::errors::EncodingError; -use smallvec::{smallvec, SmallVec}; - -/// Characters that are not allowed in parameter names or constraints. -const INVALID_PARAM_CHARS: [u8; 5] = [b':', b'*', b'{', b'}', b'.']; - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct ParsedTemplate { - pub input: Vec, - pub raw: Vec, - pub parts: Vec, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum Part { - Static { - prefix: Vec, - }, - Dynamic { - name: String, - constraint: Option, - }, - Wildcard { - name: String, - constraint: Option, - }, -} - -#[derive(Debug, PartialEq, Eq)] -pub struct Parser { - pub input: Vec, - pub route: ParsedTemplate, -} - -impl Parser { - pub fn new(input: &[u8]) -> Result { - if input.is_empty() { - return Err(TemplateError::Empty); - } - - let route = Self::parse_route(input)?; - - Ok(Self { - input: input.to_vec(), - route, - }) - } - - fn parse_route(input: &[u8]) -> Result { - let mut parts = vec![]; - let mut cursor = 0; - - // Parameters in order (name, start, length) - let mut seen_parameters: SmallVec<[(String, usize, usize); 4]> = smallvec![]; - - while cursor < input.len() { - match input[cursor] { - b'{' => { - let (part, next_cursor) = Self::parse_parameter_part(input, cursor)?; - - // Check for touching parameters. - if let Some((_, start, length)) = seen_parameters.last() { - if cursor == start + length { - return Err(TemplateError::TouchingParameters { - authority: String::from_utf8_lossy(input).to_string(), - start: *start, - length: next_cursor - start, - }); - } - } - - // Check for duplicate names. - if let Part::Dynamic { name, .. } | Part::Wildcard { name, .. } = &part { - if let Some((_, start, length)) = seen_parameters - .iter() - .find(|(existing, _, _)| existing == name) - { - return Err(TemplateError::DuplicateParameter { - authority: String::from_utf8_lossy(input).to_string(), - name: name.to_string(), - first: *start, - first_length: *length, - second: cursor, - second_length: next_cursor - cursor, - }); - } - - seen_parameters.push((name.clone(), cursor, next_cursor - cursor)); - } - - parts.push(part); - cursor = next_cursor; - } - b'}' => { - return Err(TemplateError::UnbalancedBrace { - authority: String::from_utf8_lossy(input).to_string(), - position: cursor, - }) - } - _ => { - let (part, next_cursor) = Self::parse_static_part(input, cursor); - parts.push(part); - cursor = next_cursor; - } - } - } - - parts.reverse(); - - Ok(ParsedTemplate { - input: input.to_vec(), - raw: input.to_vec(), - parts, - }) - } - - fn parse_static_part(input: &[u8], cursor: usize) -> (Part, usize) { - let mut prefix = vec![]; - - let mut end = cursor; - while end < input.len() { - match (input[end], input.get(end + 1)) { - (b'\\', Some(&next_char)) => { - prefix.push(next_char); - end += 2; - } - (b'\\', None) => { - prefix.push(b'\\'); - end += 1; - } - (b'{' | b'}', _) => break, - (char, _) => { - prefix.push(char); - end += 1; - } - } - } - - (Part::Static { prefix }, end) - } - - fn parse_parameter_part(input: &[u8], cursor: usize) -> Result<(Part, usize), TemplateError> { - let start = cursor + 1; - let mut end = start; - - let mut brace_count = 1; - while end < input.len() { - match input[end] { - b'{' => brace_count += 1, - b'}' => { - brace_count -= 1; - if brace_count == 0 { - break; - } - } - _ => {} - } - - end += 1; - } - - if brace_count != 0 { - return Err(TemplateError::UnbalancedBrace { - authority: String::from_utf8_lossy(input).to_string(), - position: cursor, - }); - } - - let content = &input[start..end]; - if content.is_empty() { - return Err(TemplateError::EmptyBraces { - authority: String::from_utf8_lossy(input).to_string(), - position: cursor, - }); - } - - let (name, constraint) = content - .iter() - .position(|&c| c == b':') - .map_or((content, None), |colon_pos| { - (&content[..colon_pos], Some(&content[colon_pos + 1..])) - }); - - if name.is_empty() { - return Err(TemplateError::EmptyParameter { - authority: String::from_utf8_lossy(input).to_string(), - start: cursor, - length: end - cursor + 1, - }); - } - - let is_wildcard = name.starts_with(b"*"); - let name = if is_wildcard { &name[1..] } else { name }; - - if is_wildcard && name.is_empty() { - return Err(TemplateError::EmptyWildcard { - authority: String::from_utf8_lossy(input).to_string(), - start: cursor, - length: end - cursor + 1, - }); - } - - if name.iter().any(|&c| INVALID_PARAM_CHARS.contains(&c)) { - return Err(TemplateError::InvalidParameter { - authority: String::from_utf8_lossy(input).to_string(), - name: String::from_utf8_lossy(name).to_string(), - start: cursor, - length: end - cursor + 1, - }); - } - - if let Some(constraint) = constraint { - if constraint.is_empty() { - return Err(TemplateError::EmptyConstraint { - authority: String::from_utf8_lossy(input).to_string(), - start: cursor, - length: end - cursor + 1, - }); - } - - if constraint.iter().any(|&c| INVALID_PARAM_CHARS.contains(&c)) { - return Err(TemplateError::InvalidConstraint { - authority: String::from_utf8_lossy(input).to_string(), - name: String::from_utf8_lossy(name).to_string(), - start: cursor, - length: end - cursor + 1, - }); - } - } - - let name = String::from_utf8(name.to_vec()).map_err(|_| EncodingError::Utf8Error { - input: String::from_utf8_lossy(name).to_string(), - })?; - - let constraint = if let Some(constraint) = constraint { - Some( - String::from_utf8(constraint.to_vec()).map_err(|_| EncodingError::Utf8Error { - input: String::from_utf8_lossy(constraint).to_string(), - })?, - ) - } else { - None - }; - - let part = if is_wildcard { - Part::Wildcard { name, constraint } - } else { - Part::Dynamic { name, constraint } - }; - - Ok((part, end + 1)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use similar_asserts::assert_eq; - - #[test] - fn test_parser_static_authority() { - assert_eq!( - Parser::new(b"example.com"), - Ok(Parser { - input: b"example.com".to_vec(), - route: ParsedTemplate { - input: b"example.com".to_vec(), - raw: b"example.com".to_vec(), - parts: vec![Part::Static { - prefix: b"example.com".to_vec() - }], - }, - }), - ); - } - - #[test] - fn test_parser_dynamic_authority() { - assert_eq!( - Parser::new(b"{subdomain}.example.com"), - Ok(Parser { - input: b"{subdomain}.example.com".to_vec(), - route: ParsedTemplate { - input: b"{subdomain}.example.com".to_vec(), - raw: b"{subdomain}.example.com".to_vec(), - parts: vec![ - Part::Static { - prefix: b".example.com".to_vec() - }, - Part::Dynamic { - name: "subdomain".to_owned(), - constraint: None - }, - ], - }, - }), - ); - } - - #[test] - fn test_parser_wildcard_authority() { - assert_eq!( - Parser::new(b"{*subdomains}.example.com"), - Ok(Parser { - input: b"{*subdomains}.example.com".to_vec(), - route: ParsedTemplate { - input: b"{*subdomains}.example.com".to_vec(), - raw: b"{*subdomains}.example.com".to_vec(), - parts: vec![ - Part::Static { - prefix: b".example.com".to_vec() - }, - Part::Wildcard { - name: "subdomains".to_owned(), - constraint: None - }, - ], - }, - }), - ); - } - - #[test] - fn test_parser_complex_authority() { - assert_eq!( - Parser::new(b"{*wildcard}.{param:alpha}.example.com"), - Ok(Parser { - input: b"{*wildcard}.{param:alpha}.example.com".to_vec(), - route: ParsedTemplate { - input: b"{*wildcard}.{param:alpha}.example.com".to_vec(), - raw: b"{*wildcard}.{param:alpha}.example.com".to_vec(), - parts: vec![ - Part::Static { - prefix: b".example.com".to_vec() - }, - Part::Dynamic { - name: "param".to_owned(), - constraint: Some("alpha".to_owned()) - }, - Part::Static { - prefix: b".".to_vec() - }, - Part::Wildcard { - name: "wildcard".to_owned(), - constraint: None - }, - ], - }, - }), - ); - } - - #[test] - fn test_parser_error_empty() { - let error = Parser::new(b"").unwrap_err(); - assert_eq!(error, TemplateError::Empty); - - insta::assert_snapshot!(error, @"empty authority"); - } - - #[test] - fn test_parser_error_empty_braces() { - let error = Parser::new(b"test.{}.com").unwrap_err(); - assert_eq!( - error, - TemplateError::EmptyBraces { - authority: "test.{}.com".to_owned(), - position: 5, - } - ); - - insta::assert_snapshot!(error, @r" - empty braces - - Authority: test.{}.com - ^^ - "); - } - - #[test] - fn test_parser_error_unbalanced_brace_opening() { - let error = Parser::new(b"test.{param.com").unwrap_err(); - assert_eq!( - error, - TemplateError::UnbalancedBrace { - authority: "test.{param.com".to_owned(), - position: 5, - } - ); - - insta::assert_snapshot!(error, @r" - unbalanced brace - - Authority: test.{param.com - ^ - - tip: Use '\{' and '\}' to represent literal '{' and '}' characters in the authority - "); - } - - #[test] - fn test_parser_error_empty_parameter() { - let error = Parser::new(b"test.{:constraint}.com").unwrap_err(); - assert_eq!( - error, - TemplateError::EmptyParameter { - authority: "test.{:constraint}.com".to_owned(), - start: 5, - length: 13, - } - ); - - insta::assert_snapshot!(error, @r" - empty parameter name - - Authority: test.{:constraint}.com - ^^^^^^^^^^^^^ - "); - } - - #[test] - fn test_parser_error_duplicate_parameter() { - let error = Parser::new(b"{param}.test.{param:alpha}.com").unwrap_err(); - assert_eq!( - error, - TemplateError::DuplicateParameter { - authority: "{param}.test.{param:alpha}.com".to_owned(), - name: "param".to_owned(), - first: 0, - first_length: 7, - second: 13, - second_length: 13, - } - ); - - insta::assert_snapshot!(error, @r" - duplicate parameter name: 'param' - - Authority: {param}.test.{param:alpha}.com - ^^^^^^^ ^^^^^^^^^^^^^ - - tip: Parameter names must be unique within an authority - "); - } - - #[test] - fn test_parser_error_touching_parameters() { - let error = Parser::new(b"{param1}{param2}.com").unwrap_err(); - assert_eq!( - error, - TemplateError::TouchingParameters { - authority: "{param1}{param2}.com".to_owned(), - start: 0, - length: 16, - } - ); - - insta::assert_snapshot!(error, @r" - touching parameters - - Authority: {param1}{param2}.com - ^^^^^^^^^^^^^^^^ - - tip: Touching parameters are not supported - "); - } -} diff --git a/crates/authority/src/search.rs b/crates/authority/src/search.rs deleted file mode 100644 index fd80734e..00000000 --- a/crates/authority/src/search.rs +++ /dev/null @@ -1,333 +0,0 @@ -use super::{node::Node, state::State, AuthorityData}; -use crate::{ - errors::{EncodingError, SearchError}, - AuthorityParameters, StoredConstraint, -}; -use smallvec::smallvec; -use std::collections::HashMap; - -impl<'r, S: State> Node<'r, S> { - pub fn search<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - if authority.is_empty() { - return Ok(self.data.as_ref().map(|data| (data, self.priority))); - } - - if let Some(search) = self.search_static(authority, parameters, constraints)? { - return Ok(Some(search)); - } - - if let Some(search) = self.search_dynamic(authority, parameters, constraints)? { - return Ok(Some(search)); - } - - if let Some(search) = self.search_wildcard(authority, parameters, constraints)? { - return Ok(Some(search)); - } - - if let Some(search) = self.search_end_wildcard(authority, parameters, constraints)? { - return Ok(Some(search)); - } - - Ok(None) - } - - fn search_static<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - for child in self.static_children.iter() { - if authority.len() >= child.state.prefix.len() - && child - .state - .prefix - .iter() - .zip(authority) - .all(|(a, b)| a == b) - { - let remaining = &authority[child.state.prefix.len()..]; - if let Some((data, priority)) = child.search(remaining, parameters, constraints)? { - return Ok(Some((data, priority))); - } - } - } - - Ok(None) - } - - fn search_dynamic<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - if self.dynamic_children_shortcut { - self.search_dynamic_segment(authority, parameters, constraints) - } else { - self.search_dynamic_inline(authority, parameters, constraints) - } - } - - fn search_dynamic_inline<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - for child in self.dynamic_children.iter() { - let mut consumed = 0; - - let mut best_match: Option<(&'r AuthorityData<'r>, usize)> = None; - let mut best_match_parameters = smallvec![]; - - while consumed < authority.len() { - if authority[consumed] == b'.' { - break; - } - - consumed += 1; - - let segment = &authority[..consumed]; - if !Self::check_constraint(child.state.constraint.as_ref(), segment, constraints) { - continue; - } - - let mut current_parameters = parameters.clone(); - current_parameters.push(( - &child.state.name, - std::str::from_utf8(segment).map_err(|_| EncodingError::Utf8Error { - input: String::from_utf8_lossy(segment).to_string(), - })?, - )); - - let Some((data, priority)) = - child.search(&authority[consumed..], &mut current_parameters, constraints)? - else { - continue; - }; - - if best_match.is_none_or(|(_, best_priority)| priority >= best_priority) { - best_match = Some((data, priority)); - best_match_parameters = current_parameters; - } - } - - if let Some(result) = best_match { - *parameters = best_match_parameters; - return Ok(Some(result)); - } - } - - Ok(None) - } - - fn search_dynamic_segment<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - for child in self.dynamic_children.iter() { - let segment_end = authority - .iter() - .position(|&b| b == b'.') - .unwrap_or(authority.len()); - - let segment = &authority[..segment_end]; - if !Self::check_constraint(child.state.constraint.as_ref(), segment, constraints) { - continue; - } - - parameters.push(( - &child.state.name, - std::str::from_utf8(segment).map_err(|_| EncodingError::Utf8Error { - input: String::from_utf8_lossy(segment).to_string(), - })?, - )); - - if let Some(result) = - child.search(&authority[segment_end..], parameters, constraints)? - { - return Ok(Some(result)); - } - - parameters.pop(); - } - - Ok(None) - } - - fn search_wildcard<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - if self.wildcard_children_shortcut { - self.search_wildcard_segment(authority, parameters, constraints) - } else { - self.search_wildcard_inline(authority, parameters, constraints) - } - } - - fn search_wildcard_inline<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - for child in self.wildcard_children.iter() { - let mut consumed = 0; - - let mut best_match: Option<(&'r AuthorityData<'r>, usize)> = None; - let mut best_match_parameters = smallvec![]; - - while consumed < authority.len() { - consumed += 1; - - let segment = &authority[..consumed]; - if !Self::check_constraint(child.state.constraint.as_ref(), segment, constraints) { - continue; - } - - let mut current_parameters = parameters.clone(); - current_parameters.push(( - &child.state.name, - std::str::from_utf8(segment).map_err(|_| EncodingError::Utf8Error { - input: String::from_utf8_lossy(segment).to_string(), - })?, - )); - - let Some((data, priority)) = - child.search(&authority[consumed..], &mut current_parameters, constraints)? - else { - continue; - }; - - if best_match.is_none_or(|(_, best_priority)| priority >= best_priority) { - best_match = Some((data, priority)); - best_match_parameters = current_parameters; - } - } - - if let Some(result) = best_match { - *parameters = best_match_parameters; - return Ok(Some(result)); - } - } - - Ok(None) - } - - fn search_wildcard_segment<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - for child in self.wildcard_children.iter() { - let mut consumed = 0; - let mut remaining = authority; - let mut section_end = false; - - while !remaining.is_empty() { - if section_end { - consumed += 1; - } - - let segment_end = remaining - .iter() - .position(|&b| b == b'.') - .unwrap_or(remaining.len()); - - if segment_end == 0 { - consumed += 1; - section_end = false; - } else { - consumed += segment_end; - section_end = true; - } - - let segment = if authority[..consumed].ends_with(b".") { - &authority[..consumed - 1] - } else { - &authority[..consumed] - }; - - if !Self::check_constraint(child.state.constraint.as_ref(), segment, constraints) { - break; - } - - parameters.push(( - &child.state.name, - std::str::from_utf8(segment).map_err(|_| EncodingError::Utf8Error { - input: String::from_utf8_lossy(segment).to_string(), - })?, - )); - - if let Some(result) = - child.search(&remaining[segment_end..], parameters, constraints)? - { - return Ok(Some(result)); - } - - parameters.pop(); - - if segment_end == remaining.len() { - break; - } - - remaining = &remaining[segment_end + 1..]; - } - } - - Ok(None) - } - - fn search_end_wildcard<'p>( - &'r self, - authority: &'p [u8], - parameters: &mut AuthorityParameters<'r, 'p>, - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { - for child in self.end_wildcard_children.iter() { - if !Self::check_constraint(child.state.constraint.as_ref(), authority, constraints) { - continue; - } - - parameters.push(( - &child.state.name, - std::str::from_utf8(authority).map_err(|_| EncodingError::Utf8Error { - input: String::from_utf8_lossy(authority).to_string(), - })?, - )); - - return Ok(child.data.as_ref().map(|data| (data, child.priority))); - } - - Ok(None) - } - - fn check_constraint( - constraint: Option<&String>, - segment: &[u8], - constraints: &HashMap<&'r str, StoredConstraint>, - ) -> bool { - let Some(constraint) = constraint else { - return true; - }; - - let constraint = constraints.get(constraint.as_str()).unwrap(); - let Ok(segment) = std::str::from_utf8(segment) else { - return false; - }; - - (constraint.check)(segment) - } -} diff --git a/crates/method/Cargo.toml b/crates/method/Cargo.toml deleted file mode 100644 index b4e5a041..00000000 --- a/crates/method/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -# https://doc.rust-lang.org/cargo/reference/manifest.html -[package] -name = "wayfind-method" -description = "Method router for `wayfind`." -publish = false - -version.workspace = true -authors.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lints] -workspace = true - -[dependencies] -smallvec = { workspace = true } - -[dev-dependencies] -insta = { workspace = true } -similar-asserts = { workspace = true } diff --git a/crates/method/src/display.rs b/crates/method/src/display.rs deleted file mode 100644 index 5f0ff7a4..00000000 --- a/crates/method/src/display.rs +++ /dev/null @@ -1,29 +0,0 @@ -use super::MethodRouter; -use std::fmt::{Display, Write}; - -impl Display for MethodRouter { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut output = String::new(); - let last_key = self.map.keys().last(); - - for key in self.map.keys() { - writeln!(output, "[{key}]")?; - - let method_map = &self.map[key]; - for (i, (method, id)) in method_map.iter().enumerate() { - let branch = if i == method_map.len() - 1 { - "╰─" - } else { - "├─" - }; - writeln!(output, "{branch} {method} [{id}]")?; - } - - if Some(key) != last_key { - writeln!(output)?; - } - } - - write!(f, "{}", output.trim_end()) - } -} diff --git a/crates/method/src/errors.rs b/crates/method/src/errors.rs deleted file mode 100644 index b070fff6..00000000 --- a/crates/method/src/errors.rs +++ /dev/null @@ -1,8 +0,0 @@ -pub mod delete; -pub use delete::DeleteError; - -pub mod insert; -pub use insert::InsertError; - -pub mod search; -pub use search::SearchError; diff --git a/crates/method/src/errors/delete.rs b/crates/method/src/errors/delete.rs deleted file mode 100644 index 6c94b8df..00000000 --- a/crates/method/src/errors/delete.rs +++ /dev/null @@ -1,15 +0,0 @@ -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum DeleteError { - NotFound, - Mismatch, -} - -impl Error for DeleteError {} - -impl Display for DeleteError { - fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - Ok(()) - } -} diff --git a/crates/method/src/errors/insert.rs b/crates/method/src/errors/insert.rs deleted file mode 100644 index 6d1a7b3e..00000000 --- a/crates/method/src/errors/insert.rs +++ /dev/null @@ -1,15 +0,0 @@ -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum InsertError { - Empty, - Conflict, -} - -impl Error for InsertError {} - -impl Display for InsertError { - fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - Ok(()) - } -} diff --git a/crates/method/src/errors/search.rs b/crates/method/src/errors/search.rs deleted file mode 100644 index 29925a37..00000000 --- a/crates/method/src/errors/search.rs +++ /dev/null @@ -1,14 +0,0 @@ -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum SearchError { - NotAllowed, -} - -impl Error for SearchError {} - -impl Display for SearchError { - fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - Ok(()) - } -} diff --git a/crates/method/src/id.rs b/crates/method/src/id.rs deleted file mode 100644 index 7e964b47..00000000 --- a/crates/method/src/id.rs +++ /dev/null @@ -1,26 +0,0 @@ -use std::fmt::Display; - -#[derive(Clone, Default)] -pub struct MethodIdGenerator { - id: usize, -} - -impl MethodIdGenerator { - pub fn generate(&mut self) -> MethodId { - self.id += 1; - MethodId(Some(self.id)) - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct MethodId(pub Option); - -impl Display for MethodId { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if let Some(id) = self.0 { - write!(f, "{id}") - } else { - write!(f, "*") - } - } -} diff --git a/crates/method/src/lib.rs b/crates/method/src/lib.rs deleted file mode 100644 index 41fd0f29..00000000 --- a/crates/method/src/lib.rs +++ /dev/null @@ -1,116 +0,0 @@ -#![allow(clippy::missing_errors_doc, clippy::missing_panics_doc)] - -use errors::{DeleteError, InsertError, SearchError}; -use id::MethodIdGenerator; -use std::collections::BTreeMap; - -pub mod display; -pub mod errors; -pub mod id; - -pub use id::MethodId; - -// FIXME: Make the key here impl based, so we can make custom keys. - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct MethodMatch<'r> { - pub id: MethodId, - pub method: Option<&'r str>, -} - -#[derive(Clone)] -pub struct MethodRouter { - pub map: BTreeMap>, - pub id: MethodIdGenerator, -} - -impl MethodRouter { - #[must_use] - pub fn new() -> Self { - Self { - map: BTreeMap::default(), - id: MethodIdGenerator::default(), - } - } - - pub fn insert(&mut self, path_id: usize, methods: &[&str]) -> Result { - if methods.is_empty() { - return Err(InsertError::Empty); - } - - let map = self.map.entry(path_id).or_default(); - - for method in methods { - if map.contains_key(*method) { - return Err(InsertError::Conflict); - } - } - - let id = self.id.generate(); - for method in methods { - map.insert((*method).to_owned(), id); - } - - Ok(id) - } - - pub fn search<'r>( - &self, - path_id: usize, - method: &'r str, - ) -> Result>, SearchError> { - if let Some(method_map) = self.map.get(&path_id) { - if let Some(id) = method_map.get(method) { - return Ok(Some(MethodMatch { - id: *id, - method: Some(method), - })); - } - - return Err(SearchError::NotAllowed); - } - - Ok(None) - } - - pub fn find(&self, path_id: usize, methods: &[&str]) -> Result { - if methods.is_empty() { - return Ok(MethodId(None)); - } - - let map = self.map.get(&path_id).ok_or(DeleteError::NotFound)?; - for method in methods { - if !map.contains_key(*method) { - return Err(DeleteError::Mismatch); - } - } - - let first_id = map.get(methods[0]).unwrap(); - for method in methods { - match map.get(*method) { - Some(id) if id == first_id => continue, - _ => { - return Err(DeleteError::Mismatch); - } - } - } - - if map - .iter() - .any(|(method, id)| id == first_id && !methods.contains(&method.as_str())) - { - return Err(DeleteError::Mismatch); - } - - Ok(*first_id) - } - - pub fn delete(&mut self, path_id: usize, method_id: MethodId) { - if let Some(map) = self.map.get_mut(&path_id) { - map.retain(|_, id| id != &method_id); - if map.is_empty() { - self.map.remove(&path_id); - } - } - } -} diff --git a/crates/path/Cargo.toml b/crates/path/Cargo.toml deleted file mode 100644 index 59299695..00000000 --- a/crates/path/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -# https://doc.rust-lang.org/cargo/reference/manifest.html -[package] -name = "wayfind-path" -description = "Path router for `wayfind`." -publish = false - -version.workspace = true -authors.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lints] -workspace = true - -[dependencies] -smallvec = { workspace = true } - -[dev-dependencies] -insta = { workspace = true } -similar-asserts = { workspace = true } diff --git a/crates/path/src/errors.rs b/crates/path/src/errors.rs deleted file mode 100644 index 0a8bcada..00000000 --- a/crates/path/src/errors.rs +++ /dev/null @@ -1,17 +0,0 @@ -pub mod constraint; -pub use constraint::ConstraintError; - -pub mod delete; -pub use delete::DeleteError; - -pub mod encoding; -pub use encoding::EncodingError; - -pub mod insert; -pub use insert::InsertError; - -pub mod search; -pub use search::SearchError; - -pub mod template; -pub use template::TemplateError; diff --git a/crates/path/src/errors/delete.rs b/crates/path/src/errors/delete.rs deleted file mode 100644 index 0798973e..00000000 --- a/crates/path/src/errors/delete.rs +++ /dev/null @@ -1,109 +0,0 @@ -use super::TemplateError; -use crate::errors::EncodingError; -use std::{error::Error, fmt::Display}; - -/// Errors relating to attempting to delete a route from a [`Router`](crate::Router). -#[derive(Debug, PartialEq, Eq)] -pub enum DeleteError { - /// A [`EncodingError`] that occurred during the decoding. - Encoding(EncodingError), - - /// A [`TemplateError`] that occurred during the delete. - Template(TemplateError), - - /// Route to be deleted was not found in the router. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_path::errors::DeleteError; - /// - /// let error = DeleteError::NotFound { - /// route: "/not_found".to_string(), - /// }; - /// - /// let display = " - /// not found - /// - /// Route: /not_found - /// - /// The specified route does not exist in the router - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - NotFound { - /// The route that was not found in the router. - route: String, - }, - - /// Tried to delete a route using a format that doesn't match how it was inserted. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_path::errors::DeleteError; - /// - /// let error = DeleteError::Mismatch { - /// route: "/users/{id}/".to_string(), - /// inserted: "/users/{id}(/)".to_string(), - /// }; - /// - /// let display = " - /// delete mismatch - /// - /// Route: /users/{id}/ - /// Inserted: /users/{id}(/) - /// - /// The route must be deleted using the same format as was inserted - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - Mismatch { - /// The route that was attempted to be deleted. - route: String, - /// The route stored as stored in the router. - inserted: String, - }, -} - -impl Error for DeleteError {} - -impl Display for DeleteError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Encoding(error) => error.fmt(f), - Self::Template(error) => error.fmt(f), - Self::NotFound { route } => write!( - f, - r"not found - - Route: {route} - -The specified route does not exist in the router" - ), - Self::Mismatch { route, inserted } => write!( - f, - r"delete mismatch - - Route: {route} - Inserted: {inserted} - -The route must be deleted using the same format as was inserted" - ), - } - } -} - -impl From for DeleteError { - fn from(error: EncodingError) -> Self { - Self::Encoding(error) - } -} - -impl From for DeleteError { - fn from(error: TemplateError) -> Self { - Self::Template(error) - } -} diff --git a/crates/path/src/errors/encoding.rs b/crates/path/src/errors/encoding.rs deleted file mode 100644 index 6590acd8..00000000 --- a/crates/path/src/errors/encoding.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::{error::Error, fmt::Display}; - -/// Errors relating to attempting to decode strings. -#[derive(Debug, PartialEq, Eq)] -pub enum EncodingError { - /// Invalid UTF-8 sequence encountered. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_path::errors::EncodingError; - /// - /// let error = EncodingError::Utf8Error { - /// input: "hello�world".to_string(), - /// }; - /// - /// let display = " - /// invalid UTF-8 sequence - /// - /// Input: hello�world - /// - /// Expected: valid UTF-8 characters - /// Found: invalid byte sequence - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - Utf8Error { - /// The invalid input. - /// This will contain UTF-8 replacement symbols. - input: String, - }, -} - -impl Error for EncodingError {} - -impl Display for EncodingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Utf8Error { input } => { - write!( - f, - "invalid UTF-8 sequence - - Input: {input} - -Expected: valid UTF-8 characters - Found: invalid byte sequence", - ) - } - } - } -} diff --git a/crates/path/src/errors/insert.rs b/crates/path/src/errors/insert.rs deleted file mode 100644 index 1018bfe1..00000000 --- a/crates/path/src/errors/insert.rs +++ /dev/null @@ -1,64 +0,0 @@ -use super::TemplateError; -use crate::PathId; -use std::{error::Error, fmt::Display}; - -/// Errors relating to attempting to insert a route into a [`Router`](crate::Router). -#[derive(Debug, PartialEq, Eq)] -pub enum InsertError { - /// A [`TemplateError`] that occurred during the insert operation. - Template(TemplateError), - - /// TODO - OverlappingRoutes { ids: Vec }, - - /// The constraint specified in the route is not recognized by the router. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_path::errors::InsertError; - /// - /// let error = InsertError::UnknownConstraint { - /// constraint: "unknown_constraint".to_string(), - /// }; - /// - /// let display = " - /// unknown constraint - /// - /// Constraint: unknown_constraint - /// - /// The router doesn't recognize this constraint - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - UnknownConstraint { - /// The name of the unrecognized constraint. - constraint: String, - }, -} - -impl Error for InsertError {} - -impl Display for InsertError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Template(error) => error.fmt(f), - Self::OverlappingRoutes { ids } => write!(f, r"overlapping routes {ids:?}"), - Self::UnknownConstraint { constraint } => write!( - f, - r"unknown constraint - - Constraint: {constraint} - -The router doesn't recognize this constraint" - ), - } - } -} - -impl From for InsertError { - fn from(error: TemplateError) -> Self { - Self::Template(error) - } -} diff --git a/crates/path/src/errors/search.rs b/crates/path/src/errors/search.rs deleted file mode 100644 index 5c6f3117..00000000 --- a/crates/path/src/errors/search.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::errors::EncodingError; -use std::{error::Error, fmt::Display}; - -/// Errors relating to attempting to search for a match in a [`Router`](crate::Router). -#[derive(Debug, PartialEq, Eq)] -pub enum SearchError { - /// A [`EncodingError`] that occurred during the search. - Encoding(EncodingError), -} - -impl Error for SearchError {} - -impl Display for SearchError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Encoding(error) => error.fmt(f), - } - } -} - -impl From for SearchError { - fn from(error: EncodingError) -> Self { - Self::Encoding(error) - } -} diff --git a/crates/path/src/find.rs b/crates/path/src/find.rs deleted file mode 100644 index 10d90593..00000000 --- a/crates/path/src/find.rs +++ /dev/null @@ -1,111 +0,0 @@ -use super::{ - node::Node, - parser::{ParsedTemplate, Part}, - state::State, - PathData, -}; - -impl<'r, S: State> Node<'r, S> { - pub(crate) fn find(&'r self, route: &mut ParsedTemplate) -> Option<&'r PathData<'r>> { - if route.parts.is_empty() { - return self.data.as_ref(); - } - - if let Some(part) = route.parts.pop() { - return match part { - Part::Static { prefix } => self.find_static(route, &prefix), - Part::Dynamic { name, constraint } => { - self.find_dynamic(route, &name, constraint.as_deref()) - } - Part::Wildcard { name, constraint } if route.parts.is_empty() => { - self.find_end_wildcard(route, &name, constraint.as_deref()) - } - Part::Wildcard { name, constraint } => { - self.find_wildcard(route, &name, constraint.as_deref()) - } - }; - } - - None - } - - fn find_static( - &'r self, - route: &mut ParsedTemplate, - prefix: &[u8], - ) -> Option<&'r PathData<'r>> { - for child in self.static_children.iter() { - if !child.state.prefix.is_empty() && child.state.prefix[0] == prefix[0] { - let common_prefix = prefix - .iter() - .zip(&child.state.prefix) - .take_while(|&(x, y)| x == y) - .count(); - - if common_prefix >= child.state.prefix.len() { - if common_prefix >= prefix.len() { - return child.find(route); - } - - let remaining = prefix[common_prefix..].to_vec(); - if !remaining.is_empty() { - let mut new_route = ParsedTemplate { - parts: route.parts.clone(), - ..route.clone() - }; - - new_route.parts.push(Part::Static { prefix: remaining }); - return child.find(&mut new_route); - } - } - } - } - - None - } - - fn find_dynamic( - &'r self, - route: &mut ParsedTemplate, - name: &str, - constraint: Option<&str>, - ) -> Option<&'r PathData<'r>> { - for child in self.dynamic_children.iter() { - if child.state.name == name && child.state.constraint.as_deref() == constraint { - return child.find(route); - } - } - - None - } - - fn find_end_wildcard( - &'r self, - route: &mut ParsedTemplate, - name: &str, - constraint: Option<&str>, - ) -> Option<&'r PathData<'r>> { - for child in self.end_wildcard_children.iter() { - if child.state.name == name && child.state.constraint.as_deref() == constraint { - return child.find(route); - } - } - - None - } - - fn find_wildcard( - &'r self, - route: &mut ParsedTemplate, - name: &str, - constraint: Option<&str>, - ) -> Option<&'r PathData<'r>> { - for child in self.wildcard_children.iter() { - if child.state.name == name && child.state.constraint.as_deref() == constraint { - return child.find(route); - } - } - - None - } -} diff --git a/crates/path/src/id.rs b/crates/path/src/id.rs deleted file mode 100644 index dd63b99d..00000000 --- a/crates/path/src/id.rs +++ /dev/null @@ -1,22 +0,0 @@ -use std::fmt::Display; - -#[derive(Clone, Default)] -pub struct PathIdGenerator { - id: usize, -} - -impl PathIdGenerator { - pub fn generate(&mut self) -> PathId { - self.id += 1; - PathId(self.id) - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct PathId(pub usize); - -impl Display for PathId { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.0) - } -} diff --git a/crates/path/src/lib.rs b/crates/path/src/lib.rs deleted file mode 100644 index abda9b80..00000000 --- a/crates/path/src/lib.rs +++ /dev/null @@ -1,304 +0,0 @@ -#![allow(clippy::missing_errors_doc, clippy::missing_panics_doc)] - -use crate::vec::SortedVec; -use errors::{constraint::ConstraintError, DeleteError, InsertError, SearchError}; -use id::PathIdGenerator; -use node::Node; -use parser::{Parser, Part}; -use smallvec::{smallvec, SmallVec}; -use state::RootState; -use std::{ - collections::HashMap, - fmt::Display, - net::{Ipv4Addr, Ipv6Addr}, - sync::Arc, -}; - -// FIXME: Actually make use of key, like in method router. - -pub mod constraints; -pub mod delete; -pub mod display; -pub mod errors; -pub mod find; -pub mod id; -pub mod insert; -pub mod node; -pub mod optimize; -pub mod parser; -pub mod search; -pub mod state; -pub mod vec; - -pub use constraints::PathConstraint; -pub use id::PathId; - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct PathData<'r> { - pub id: PathId, - pub route: &'r str, - pub expanded: Option>, -} - -#[derive(Debug, Eq, PartialEq)] -pub struct PathMatch<'r, 'p> { - pub id: PathId, - pub route: &'r str, - pub expanded: Option<&'r str>, - pub parameters: PathParameters<'r, 'p>, -} - -pub type PathParameters<'r, 'p> = SmallVec<[(&'r str, &'p str); 4]>; - -#[derive(Clone)] -pub struct StoredConstraint { - pub type_name: &'static str, - pub check: fn(&str) -> bool, -} - -#[derive(Clone)] -pub struct PathRouter<'r> { - pub root: Node<'r, RootState>, - pub constraints: HashMap<&'r str, StoredConstraint>, - pub id: PathIdGenerator, -} - -impl<'r> PathRouter<'r> { - #[must_use] - pub fn new() -> Self { - let mut router = Self { - root: Node { - state: RootState::new(), - data: None, - - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), - dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), - wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), - - priority: 0, - needs_optimization: false, - }, - constraints: HashMap::default(), - id: PathIdGenerator::default(), - }; - - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - router.constraint::().unwrap(); - - router - } - - pub fn constraint(&mut self) -> Result<(), ConstraintError> { - if let Some(existing) = self.constraints.get(C::NAME) { - return Err(ConstraintError::DuplicateName { - name: C::NAME, - existing_type: existing.type_name, - new_type: std::any::type_name::(), - }); - } - - self.constraints.insert( - C::NAME, - StoredConstraint { - type_name: std::any::type_name::(), - check: C::check, - }, - ); - - Ok(()) - } - - pub fn conflicts(&self, route: &str) -> Result, DeleteError> { - let parsed = Parser::new(route.as_bytes())?; - - // Check if any expansion conflicts - for mut route_variant in parsed.routes { - if let Some(data) = self.root.find(&mut route_variant) { - return Ok(Some(data.id)); - } - } - - Ok(None) - } - - pub fn insert(&mut self, route: &'r str) -> Result { - let mut parsed = Parser::new(route.as_bytes())?; - - // Check for invalid constraints. - for route in &parsed.routes { - for part in &route.parts { - if let Part::Dynamic { - constraint: Some(name), - .. - } - | Part::Wildcard { - constraint: Some(name), - .. - } = part - { - if !self.constraints.contains_key(name.as_str()) { - return Err(InsertError::UnknownConstraint { - constraint: name.to_string(), - }); - } - } - } - } - - // Check for conflicts. - let mut ids = vec![]; - for route in &parsed.routes { - let raw = String::from_utf8_lossy(&route.raw); - - let Ok(Some(found)) = self.conflicts(&raw) else { - continue; - }; - - ids.push(found); - } - - ids.sort(); - ids.dedup(); - - if !ids.is_empty() { - let Some(first) = ids.first() else { - unreachable!() - }; - - if ids.iter().any(|id| id != first) { - return Err(InsertError::OverlappingRoutes { ids }); - } - - return Ok(*first); - } - - // No conflicts, proceed with new insert. - let id = self.id.generate(); - - if parsed.routes.len() > 1 { - for mut parsed_route in parsed.routes { - let expanded = Arc::from(String::from_utf8_lossy(&parsed_route.raw)); - self.root.insert( - &mut parsed_route, - PathData { - id, - route, - expanded: Some(expanded), - }, - ); - } - } else if let Some(parsed_route) = parsed.routes.first_mut() { - self.root.insert( - parsed_route, - PathData { - id, - route, - expanded: None, - }, - ); - }; - - self.root.optimize(); - Ok(id) - } - - pub fn find(&self, route: &str) -> Result, DeleteError> { - let parsed = Parser::new(route.as_bytes())?; - - let mut id = None; - let mut mismatch = None; - let mut missing = false; - - for mut route_variant in parsed.routes { - if let Some(data) = self.root.find(&mut route_variant) { - if data.route != route { - mismatch = Some(data.route.to_owned()); - } - - if let Some(existing_id) = id { - if existing_id != data.id { - return Err(DeleteError::Mismatch { - route: route.to_owned(), - inserted: data.route.to_owned(), - }); - } - } else { - id = Some(data.id); - } - } else { - missing = true; - } - } - - if let Some(inserted) = mismatch { - return Err(DeleteError::Mismatch { - route: route.to_owned(), - inserted, - }); - } - - if missing { - return Ok(None); - } - - Ok(id) - } - - pub fn delete(&mut self, route: &str) { - let Ok(parsed) = Parser::new(route.as_bytes()) else { - return; - }; - - let Ok(data) = self.find(route) else { - return; - }; - - if data.is_none() { - return; - } - - for mut expanded_route in parsed.routes { - self.root.delete(&mut expanded_route); - } - - self.root.optimize(); - } - - pub fn search<'p>(&'r self, path: &'p [u8]) -> Result>, SearchError> { - let mut parameters = smallvec![]; - let Some((data, _)) = self.root.search(path, &mut parameters, &self.constraints)? else { - return Ok(None); - }; - - Ok(Some(PathMatch { - id: data.id, - route: data.route, - expanded: data.expanded.as_deref(), - parameters, - })) - } -} - -impl Display for PathRouter<'_> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.root) - } -} diff --git a/crates/path/src/node.rs b/crates/path/src/node.rs deleted file mode 100644 index dbdf8500..00000000 --- a/crates/path/src/node.rs +++ /dev/null @@ -1,44 +0,0 @@ -use super::{ - state::{DynamicState, EndWildcardState, State, StaticState, WildcardState}, - PathData, -}; -use crate::vec::SortedVec; -use std::cmp::Ordering; - -/// Represents a node in the tree structure. -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct Node<'r, S: State> { - /// The type of Node, and associated structure data. - pub state: S, - - /// Optional data associated with this node. - /// The presence of this data is needed to successfully match a route. - pub data: Option>, - - pub static_children: SortedVec>, - pub dynamic_children: SortedVec>, - pub dynamic_children_shortcut: bool, - pub wildcard_children: SortedVec>, - pub wildcard_children_shortcut: bool, - pub end_wildcard_children: SortedVec>, - - /// Higher values indicate more specific matches. - pub priority: usize, - /// Flag indicating whether this node or its children need optimization. - pub needs_optimization: bool, -} - -impl PartialOrd for Node<'_, S> { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Node<'_, S> { - fn cmp(&self, other: &Self) -> Ordering { - other - .priority - .cmp(&self.priority) - .then_with(|| self.state.cmp(&other.state)) - } -} diff --git a/crates/path/src/state.rs b/crates/path/src/state.rs deleted file mode 100644 index 10494f30..00000000 --- a/crates/path/src/state.rs +++ /dev/null @@ -1,284 +0,0 @@ -use std::cmp::Ordering; - -pub trait State: Ord { - fn priority(&self) -> usize; - fn padding(&self) -> usize; - fn key(&self) -> &str; -} - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct RootState { - priority: usize, - padding: usize, - key: String, -} - -impl RootState { - #[must_use] - pub const fn new() -> Self { - Self { - priority: 0, - padding: 0, - key: String::new(), - } - } -} - -impl State for RootState { - fn priority(&self) -> usize { - self.priority - } - - fn padding(&self) -> usize { - self.padding - } - - fn key(&self) -> &str { - &self.key - } -} - -impl Ord for RootState { - fn cmp(&self, _: &Self) -> Ordering { - unreachable!() - } -} - -impl PartialOrd for RootState { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct StaticState { - pub prefix: Vec, - priority: usize, - padding: usize, - key: String, -} - -impl StaticState { - #[must_use] - pub fn new(prefix: Vec) -> Self { - let priority = prefix.len(); - let padding = prefix.len().saturating_sub(1); - let key = String::from_utf8_lossy(&prefix).into_owned(); - - Self { - prefix, - priority, - padding, - key, - } - } -} - -impl State for StaticState { - fn priority(&self) -> usize { - self.priority - } - - fn padding(&self) -> usize { - self.padding - } - - fn key(&self) -> &str { - &self.key - } -} - -impl Ord for StaticState { - fn cmp(&self, other: &Self) -> Ordering { - self.prefix.cmp(&other.prefix) - } -} - -impl PartialOrd for StaticState { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct DynamicState { - pub name: String, - pub constraint: Option, - priority: usize, - padding: usize, - key: String, -} - -impl DynamicState { - #[must_use] - pub fn new(name: String, constraint: Option) -> Self { - let mut priority = name.len(); - if constraint.is_some() { - priority += 10_000; - } - - let padding = name.len().saturating_sub(1); - let key = constraint.as_ref().map_or_else( - || format!("{{{name}}}"), - |constraint| format!("{{{name}:{constraint}}}"), - ); - - Self { - name, - constraint, - priority, - padding, - key, - } - } -} - -impl State for DynamicState { - fn priority(&self) -> usize { - self.priority - } - - fn padding(&self) -> usize { - self.padding - } - - fn key(&self) -> &str { - &self.key - } -} - -impl Ord for DynamicState { - fn cmp(&self, other: &Self) -> Ordering { - self.name - .cmp(&other.name) - .then_with(|| self.constraint.cmp(&other.constraint)) - } -} - -impl PartialOrd for DynamicState { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct WildcardState { - pub name: String, - pub constraint: Option, - priority: usize, - padding: usize, - key: String, -} - -impl WildcardState { - #[must_use] - pub fn new(name: String, constraint: Option) -> Self { - let mut priority = name.len(); - if constraint.is_some() { - priority += 10_000; - } - - let padding = name.len().saturating_sub(1); - let key = constraint.as_ref().map_or_else( - || format!("{{*{name}}}"), - |constraint| format!("{{*{name}:{constraint}}}"), - ); - - Self { - name, - constraint, - priority, - padding, - key, - } - } -} - -impl State for WildcardState { - fn priority(&self) -> usize { - self.priority - } - - fn padding(&self) -> usize { - self.padding - } - - fn key(&self) -> &str { - &self.key - } -} - -impl Ord for WildcardState { - fn cmp(&self, other: &Self) -> Ordering { - self.name - .cmp(&other.name) - .then_with(|| self.constraint.cmp(&other.constraint)) - } -} - -impl PartialOrd for WildcardState { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct EndWildcardState { - pub name: String, - pub constraint: Option, - priority: usize, - padding: usize, - key: String, -} - -impl EndWildcardState { - #[must_use] - pub fn new(name: String, constraint: Option) -> Self { - let mut priority = name.len(); - if constraint.is_some() { - priority += 10_000; - } - - let padding = name.len().saturating_sub(1); - let key = constraint.as_ref().map_or_else( - || format!("{{*{name}}}"), - |constraint| format!("{{*{name}:{constraint}}}"), - ); - - Self { - name, - constraint, - priority, - padding, - key, - } - } -} - -impl State for EndWildcardState { - fn priority(&self) -> usize { - self.priority - } - - fn padding(&self) -> usize { - self.padding - } - - fn key(&self) -> &str { - &self.key - } -} - -impl Ord for EndWildcardState { - fn cmp(&self, other: &Self) -> Ordering { - self.name - .cmp(&other.name) - .then_with(|| self.constraint.cmp(&other.constraint)) - } -} - -impl PartialOrd for EndWildcardState { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} diff --git a/crates/path/src/vec.rs b/crates/path/src/vec.rs deleted file mode 100644 index 035b7254..00000000 --- a/crates/path/src/vec.rs +++ /dev/null @@ -1,82 +0,0 @@ -use std::ops::{Index, IndexMut}; - -/// A `vec` which caches its sort state. -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct SortedVec { - vec: Vec, - sorted: bool, -} - -impl SortedVec { - #[must_use] - pub const fn new(vec: Vec) -> Self { - Self { vec, sorted: false } - } - - pub fn push(&mut self, value: T) { - self.vec.push(value); - self.sorted = false; - } - - pub fn remove(&mut self, index: usize) -> T { - self.vec.remove(index) - } - - #[inline] - #[must_use] - pub fn len(&self) -> usize { - self.vec.len() - } - - #[must_use] - pub fn is_empty(&self) -> bool { - self.vec.is_empty() - } - - pub fn find_mut(&mut self, predicate: F) -> Option<&mut T> - where - F: Fn(&T) -> bool, - { - self.vec.iter_mut().find(|item| predicate(item)) - } - - pub fn iter(&self) -> impl Iterator { - self.vec.iter() - } - - pub fn iter_mut(&mut self) -> impl Iterator { - self.vec.iter_mut() - } - - pub fn sort(&mut self) { - if self.sorted { - return; - } - - self.vec.sort(); - self.sorted = true; - } -} - -impl Default for SortedVec { - fn default() -> Self { - Self { - vec: vec![], - sorted: false, - } - } -} - -impl Index for SortedVec { - type Output = T; - - fn index(&self, index: usize) -> &Self::Output { - &self.vec[index] - } -} - -impl IndexMut for SortedVec { - fn index_mut(&mut self, index: usize) -> &mut Self::Output { - &mut self.vec[index] - } -} diff --git a/crates/percent/Cargo.toml b/crates/percent/Cargo.toml deleted file mode 100644 index b2847493..00000000 --- a/crates/percent/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -# https://doc.rust-lang.org/cargo/reference/manifest.html -[package] -name = "wayfind-percent" -description = "Percent decoder for `wayfind`." -publish = false - -version.workspace = true -authors.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lints] -workspace = true - -[dev-dependencies] -insta = { workspace = true } diff --git a/crates/percent/src/errors.rs b/crates/percent/src/errors.rs deleted file mode 100644 index 225d2fe6..00000000 --- a/crates/percent/src/errors.rs +++ /dev/null @@ -1,66 +0,0 @@ -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum DecodingError { - /// Invalid percent-encoding character encountered. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_percent::errors::DecodingError; - /// - /// let error = DecodingError::InvalidCharacter { - /// input: "/hello%GGworld".to_string(), - /// position: 6, - /// character: vec![b'%', b'G', b'G'], - /// }; - /// - /// let display = " - /// invalid character - /// - /// Input: /hello%GGworld - /// ^^^ - /// - /// Expected: '%' followed by two hexadecimal digits (a-F, 0-9) - /// Found: '%GG' - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - InvalidCharacter { - /// The unaltered input string. - input: String, - /// The position in the input where the invalid encoding was found. - position: usize, - /// The invalid character sequence. - character: Vec, - }, -} - -impl Error for DecodingError {} - -impl Display for DecodingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::InvalidCharacter { - input, - position, - character, - } => { - let character = String::from_utf8_lossy(character); - let arrow = " ".repeat(*position) + &"^".repeat(character.len()); - - write!( - f, - "invalid character - - Input: {input} - {arrow} - -Expected: '%' followed by two hexadecimal digits (a-F, 0-9) - Found: '{character}'", - ) - } - } - } -} diff --git a/crates/percent/src/lib.rs b/crates/percent/src/lib.rs deleted file mode 100644 index 55969289..00000000 --- a/crates/percent/src/lib.rs +++ /dev/null @@ -1,273 +0,0 @@ -//! - -#![allow(clippy::missing_errors_doc)] - -use errors::DecodingError; -use std::borrow::Cow; - -pub mod errors; - -/// Try and percent-decode input bytes. -/// Does not do any sort of normalization, simply decodes hex characters. -pub fn percent_decode(input: &[u8]) -> Result, DecodingError> { - if !input.contains(&b'%') { - return Ok(Cow::Borrowed(input)); - } - - let mut output = Vec::with_capacity(input.len()); - let mut i = 0; - let len = input.len(); - - while i < len { - match input[i] { - b'%' if i + 2 >= len => { - return Err(DecodingError::InvalidCharacter { - input: String::from_utf8_lossy(input).to_string(), - position: i, - character: input[i..].to_vec(), - }); - } - b'%' => { - let a = input[i + 1]; - let b = input[i + 2]; - - if let Some(decoded) = decode_hex(a, b) { - output.push(decoded); - } else { - return Err(DecodingError::InvalidCharacter { - input: String::from_utf8_lossy(input).to_string(), - position: i, - character: vec![b'%', a, b], - }); - } - - i += 3; - } - byte => { - output.push(byte); - i += 1; - } - } - } - - Ok(Cow::Owned(output)) -} - -#[inline] -const fn decode_hex(a: u8, b: u8) -> Option { - let high = match a { - b'0'..=b'9' => a - b'0', - b'A'..=b'F' => a - b'A' + 10, - b'a'..=b'f' => a - b'a' + 10, - _ => return None, - }; - - let low = match b { - b'0'..=b'9' => b - b'0', - b'A'..=b'F' => b - b'A' + 10, - b'a'..=b'f' => b - b'a' + 10, - _ => return None, - }; - - Some((high << 4) | low) -} - -#[cfg(test)] -mod tests { - use super::*; - - /// - #[test] - fn test_percent_empty_input() { - let input = b""; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"")); - } - - /// - #[test] - fn test_percent_no_decode_needed() { - let input = b"abc"; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"abc")); - } - - /// - #[test] - fn test_percent_simple_hex_decode() { - let input = b"1%41"; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"1A")); - } - - /// - #[test] - fn test_percent_multiple_hex_decode() { - let input = b"1%41%42%43"; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"1ABC")); - } - - /// - #[test] - fn test_percent_hex_decode_lowercase() { - let input = b"%4a"; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"J")); - } - - /// - #[test] - fn test_percent_hex_decode_uppercase() { - let input = b"%6F"; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"o")); - } - - /// - #[test] - fn test_percent_incomplete_percent() { - let input = b"%"; - let result = percent_decode(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid character - - Input: % - ^ - - Expected: '%' followed by two hexadecimal digits (a-F, 0-9) - Found: '%' - "); - - assert_eq!( - result, - DecodingError::InvalidCharacter { - input: String::from_utf8_lossy(input).to_string(), - position: 0, - character: vec![b'%'], - } - ); - } - - /// - #[test] - fn test_percent_incomplete_hex_digit() { - let input = b"%a"; - let result = percent_decode(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid character - - Input: %a - ^^ - - Expected: '%' followed by two hexadecimal digits (a-F, 0-9) - Found: '%a' - "); - - assert_eq!( - result, - DecodingError::InvalidCharacter { - input: String::from_utf8_lossy(input).to_string(), - position: 0, - character: vec![b'%', b'a'], - } - ); - } - - /// - #[test] - fn test_percent_incomplete_second_hex_digit() { - let input = b"%1"; - let result = percent_decode(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid character - - Input: %1 - ^^ - - Expected: '%' followed by two hexadecimal digits (a-F, 0-9) - Found: '%1' - "); - - assert_eq!( - result, - DecodingError::InvalidCharacter { - input: String::from_utf8_lossy(input).to_string(), - position: 0, - character: vec![b'%', b'1'], - } - ); - } - - /// - #[test] - fn test_percent_trailing_incomplete_percent() { - let input = b"123%45%6"; - let result = percent_decode(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid character - - Input: 123%45%6 - ^^ - - Expected: '%' followed by two hexadecimal digits (a-F, 0-9) - Found: '%6' - "); - - assert_eq!( - result, - DecodingError::InvalidCharacter { - input: String::from_utf8_lossy(input).to_string(), - position: 6, - character: vec![b'%', b'6'], - } - ); - } - - /// - #[test] - fn test_percent_invalid_hex_digits() { - let input = b"%zzzzz"; - let result = percent_decode(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid character - - Input: %zzzzz - ^^^ - - Expected: '%' followed by two hexadecimal digits (a-F, 0-9) - Found: '%zz' - "); - - assert_eq!( - result, - DecodingError::InvalidCharacter { - input: String::from_utf8_lossy(input).to_string(), - position: 0, - character: vec![b'%', b'z', b'z'], - } - ); - } - - /// - #[test] - fn test_percent_space_encoding_1() { - let input = b"a%20b"; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"a b")); - } - - /// - #[test] - #[ignore = "we don't support '+' in paths"] - fn test_percent_space_encoding_2() { - let input = b"a+b"; - let result = percent_decode(input).unwrap(); - assert_eq!(result, Cow::Borrowed(b"a b")); - } -} diff --git a/crates/punycode/Cargo.toml b/crates/punycode/Cargo.toml deleted file mode 100644 index 23dffa26..00000000 --- a/crates/punycode/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -# https://doc.rust-lang.org/cargo/reference/manifest.html -[package] -name = "wayfind-punycode" -description = "Punycode decoder for `wayfind`." -publish = false - -version.workspace = true -authors.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lints] -workspace = true - -[dev-dependencies] -insta = { workspace = true } diff --git a/crates/punycode/src/errors.rs b/crates/punycode/src/errors.rs deleted file mode 100644 index 31920d87..00000000 --- a/crates/punycode/src/errors.rs +++ /dev/null @@ -1,257 +0,0 @@ -use std::{error::Error, fmt::Display}; - -#[derive(Debug, PartialEq, Eq)] -pub enum DecodingError { - /// Invalid basic code point encountered (non-ASCII character). - /// - /// # Examples - /// - /// ```rust - /// use wayfind_punycode::errors::DecodingError; - /// - /// let error = DecodingError::InvalidBasicCodePoint { - /// input: "hello²world".to_string(), - /// position: 5, - /// character: vec![0xC2, 0xB2], - /// }; - /// - /// let display = " - /// invalid basic code point - /// - /// Input: hello²world - /// ^ - /// - /// Expected: ASCII character (0-127) - /// Found: '²' - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - InvalidBasicCodePoint { - /// The unaltered input string. - input: String, - /// The position in the input where the invalid code point was found. - position: usize, - /// The invalid character sequence. - character: Vec, - }, - - /// Invalid digit encountered during Punycode decoding. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_punycode::errors::DecodingError; - /// - /// let error = DecodingError::InvalidDigit { - /// input: "hello-@world".to_string(), - /// position: 6, - /// character: b'@', - /// }; - /// - /// let display = " - /// invalid punycode digit - /// - /// Input: hello-@world - /// ^ - /// - /// Expected: letter (a-z, A-Z) or digit (0-9) - /// Found: '@' - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - InvalidDigit { - /// The unaltered input string. - input: String, - /// The position in the input where the invalid digit was found. - position: usize, - /// The invalid character. - character: u8, - }, - - /// Unexpected end of input during Punycode decoding. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_punycode::errors::DecodingError; - /// - /// let error = DecodingError::UnexpectedEnd { - /// input: "hello-a".to_string(), - /// position: 7, - /// }; - /// - /// let display = " - /// unexpected end of input - /// - /// Input: hello-a - /// ^ - /// - /// Expected: more punycode digits - /// Found: end of input - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - UnexpectedEnd { - /// The unaltered input string. - input: String, - /// The position where the input ended unexpectedly. - position: usize, - }, - - /// Numeric overflow during Punycode decoding. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_punycode::errors::DecodingError; - /// - /// let error = DecodingError::Overflow { - /// input: "hello-9999999999a".to_string(), - /// position: 7, - /// }; - /// - /// let display = " - /// numeric overflow - /// - /// Input: hello-9999999999a - /// ^ - /// - /// Overflow occurred while decoding punycode digits - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - Overflow { - /// The unaltered input string. - input: String, - /// The position where the overflow occurred. - position: usize, - }, - - /// Invalid Unicode code point generated during decoding. - /// - /// # Examples - /// - /// ```rust - /// use wayfind_punycode::errors::DecodingError; - /// - /// let error = DecodingError::InvalidCodePoint { - /// input: "hello-99999a".to_string(), - /// position: 11, - /// value: 0x0048A841, - /// }; - /// - /// let display = " - /// invalid code point - /// - /// Input: hello-99999a - /// ^ - /// - /// Cannot convert value 4761665 to valid Unicode character - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - InvalidCodePoint { - /// The unaltered input string. - input: String, - /// The position where the invalid code point was generated. - position: usize, - /// The invalid code point value. - value: u32, - }, -} - -impl Error for DecodingError {} - -impl Display for DecodingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::InvalidBasicCodePoint { - input, - position, - character, - } => { - let character = String::from_utf8_lossy(character); - let arrow = " ".repeat(*position) + "^"; - - write!( - f, - "invalid basic code point - - Input: {input} - {arrow} - -Expected: ASCII character (0-127) - Found: '{character}'" - ) - } - Self::InvalidDigit { - input, - position, - character, - } => { - let arrow = " ".repeat(*position) + "^"; - let char = *character as char; - - write!( - f, - "invalid punycode digit - - Input: {input} - {arrow} - -Expected: letter (a-z, A-Z) or digit (0-9) - Found: '{char}'" - ) - } - Self::UnexpectedEnd { input, position } => { - let arrow = " ".repeat(*position) + "^"; - - write!( - f, - "unexpected end of input - - Input: {input} - {arrow} - -Expected: more punycode digits - Found: end of input" - ) - } - Self::Overflow { input, position } => { - let arrow = " ".repeat(*position) + "^"; - - write!( - f, - "numeric overflow - - Input: {input} - {arrow} - -Overflow occurred while decoding punycode digits" - ) - } - Self::InvalidCodePoint { - input, - position, - value, - } => { - let arrow = " ".repeat(*position) + "^"; - - write!( - f, - "invalid code point - - Input: {input} - {arrow} - -Cannot convert value {value} to valid Unicode character" - ) - } - } - } -} diff --git a/crates/punycode/src/lib.rs b/crates/punycode/src/lib.rs deleted file mode 100644 index 5174217a..00000000 --- a/crates/punycode/src/lib.rs +++ /dev/null @@ -1,663 +0,0 @@ -//! - -#![allow(clippy::many_single_char_names)] -#![allow(clippy::missing_errors_doc)] -#![allow(clippy::cast_possible_truncation)] - -use errors::DecodingError; -use std::borrow::Cow; - -pub mod errors; - -/// -const BASE: u32 = 36; -const TMIN: u32 = 1; -const TMAX: u32 = 26; -const SKEW: u32 = 38; -const DAMP: u32 = 700; -const INITIAL_BIAS: u32 = 72; -const INITIAL_N: u32 = 128; - -pub fn punycode_decode(input: &[u8]) -> Result, DecodingError> { - if input.is_empty() { - return Ok(String::from_utf8_lossy(input)); - } - - let mut parts = vec![]; - let mut start = 0; - - for (i, &byte) in input.iter().enumerate() { - if byte == b'.' { - if start != i { - parts.push(&input[start..i]); - } - - parts.push(&input[i..=i]); - start = i + 1; - } - } - - if start < input.len() { - parts.push(&input[start..]); - } - - let mut result = String::with_capacity(input.len()); - for part in parts { - if part == b"." { - result.push('.'); - continue; - } - - if part.starts_with(b"xn--") { - let decoded = punycode_decode_part(&part[4..])?; - result.push_str(&decoded); - } else { - let string = String::from_utf8_lossy(part); - if string.contains(|c: char| c.is_ascii_control()) { - return Err(DecodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: part.iter().position(|&x| x < 32).unwrap_or(0), - character: vec![], - }); - } - - result.push_str(&string); - } - } - - Ok(Cow::Owned(result)) -} - -/// TODO: I'd like to understand this better, and maybe enforce certain restirctions to improve performance/remove error cases. -/// -fn punycode_decode_part(input: &[u8]) -> Result { - if input == b"-" { - return Err(DecodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: 0, - }); - } - - let mut output = Vec::with_capacity(input.len()); - - let mut n: u32 = INITIAL_N; - let mut i: u32 = 0; - let mut bias: u32 = INITIAL_BIAS; - - let last_delimiter = input.iter().rposition(|&x| x == b'-').unwrap_or(0); - for &byte in &input[..last_delimiter] { - output.push(byte as char); - } - - let mut position = last_delimiter; - if last_delimiter > 0 { - position += 1; - } - - while position < input.len() { - let old_i: u32 = i; - let mut w: u32 = 1; - let mut k: u32 = BASE; - - loop { - if position >= input.len() { - return Err(DecodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: position - 1, - }); - } - - let byte = input[position]; - if !is_valid_punycode_digit(byte) { - return Err(DecodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position, - character: vec![], - }); - } - - let digit = decode_digit(byte).unwrap(); - - if k > u32::MAX - BASE { - return Err(DecodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position, - }); - } - - i = i - .checked_add( - digit - .checked_mul(w) - .ok_or_else(|| DecodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position, - })?, - ) - .ok_or_else(|| DecodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position, - })?; - - let t: u32 = if k <= bias { - TMIN - } else if k >= bias + TMAX { - TMAX - } else { - k - bias - }; - - if digit < t { - break; - } - - w = w - .checked_mul(BASE - t) - .ok_or_else(|| DecodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position, - })?; - - k += BASE; - position += 1; - } - - bias = adapt(i - old_i, output.len() as u32 + 1, old_i == 0); - - n = n - .checked_add(i / (output.len() as u32 + 1)) - .ok_or_else(|| DecodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position, - })?; - - if n > 0x0010_FFFF { - return Err(DecodingError::InvalidCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position, - value: n, - }); - } - - i %= output.len() as u32 + 1; - - if n < 128 { - return Err(DecodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position, - character: vec![], - }); - } - - let code_point = char::from_u32(n).ok_or_else(|| DecodingError::InvalidCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position, - value: n, - })?; - - output.insert(i as usize, code_point); - i += 1; - position += 1; - } - - Ok(output.into_iter().collect()) -} - -const fn is_valid_punycode_digit(cp: u8) -> bool { - matches!(cp, b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9') -} - -const fn decode_digit(cp: u8) -> Option { - match cp { - b'A'..=b'Z' => Some(cp as u32 - b'A' as u32), - b'a'..=b'z' => Some(cp as u32 - b'a' as u32), - b'0'..=b'9' => Some(cp as u32 - b'0' as u32 + 26), - _ => None, - } -} - -const fn adapt(delta: u32, num_points: u32, first_time: bool) -> u32 { - let mut delta = if first_time { delta / DAMP } else { delta >> 1 }; - - delta += delta / num_points; - - let mut k = 0; - let base_minus_tmin = BASE - TMIN; - - while delta > ((base_minus_tmin * TMAX) >> 1) { - delta /= base_minus_tmin; - k += BASE; - } - - k + (((base_minus_tmin + 1) * delta) / (delta + SKEW)) -} - -#[cfg(test)] -mod tests { - use super::*; - - /// - #[test] - fn test_punycode_rfc_arabic() { - let input = b"egbpdaj6bu4bxfgehfvwxn"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "ليهمابتكلموشعربي؟"); - } - - /// - #[test] - fn test_punycode_rfc_chinese_simplified() { - let input = b"ihqwcrb4cv8a8dqg056pqjye"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "他们为什么不说中文"); - } - - /// - #[test] - fn test_punycode_rfc_chinese_traditional() { - let input = b"ihqwctvzc91f659drss3x8bo0yb"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "他們爲什麽不說中文"); - } - - /// - #[test] - fn test_punycode_rfc_czech() { - let input = b"Proprostnemluvesky-uyb24dma41a"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "Pročprostěnemluvíčesky"); - } - - /// - #[test] - fn test_punycode_rfc_hebrew() { - let input = b"4dbcagdahymbxekheh6e0a7fei0b"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "למההםפשוטלאמדבריםעברית"); - } - - /// - #[test] - fn test_punycode_rfc_hindi() { - let input = b"i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "यहलोगहिन्दीक्योंनहींबोलसकतेहैं"); - } - - /// - #[test] - fn test_punycode_rfc_japanese() { - let input = b"n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "なぜみんな日本語を話してくれないのか"); - } - - /// - #[test] - fn test_punycode_rfc_korean() { - let input = b"989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "세계의모든사람들이한국어를이해한다면얼마나좋을까"); - } - - /// - #[test] - fn test_punycode_rfc_russian() { - let input = b"b1abfaaepdrnnbgefbaDotcwatmq2g4l"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "почемужеонинеговорятпорусски"); - } - - /// - #[test] - fn test_punycode_rfc_spanish() { - let input = b"PorqunopuedensimplementehablarenEspaol-fmd56a"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "PorquénopuedensimplementehablarenEspañol"); - } - - /// - #[test] - fn test_punycode_rfc_vietnamese() { - let input = b"TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "TạisaohọkhôngthểchỉnóitiếngViệt"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_1() { - let input = b"3B-ww4c5e180e575a65lsy2b"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "3年B組金八先生"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_2() { - let input = b"-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "安室奈美恵-with-SUPER-MONKEYS"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_3() { - let input = b"Hello-Another-Way--fc4qua05auwb3674vfr0b"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "Hello-Another-Way-それぞれの場所"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_4() { - let input = b"2-u9tlzr9756bt3uc0v"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "ひとつ屋根の下2"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_5() { - let input = b"MajiKoi5-783gue6qz075azm5e"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "MajiでKoiする5秒前"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_6() { - let input = b"de-jg4avhby1noc0d"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "パフィーdeルンバ"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_7() { - let input = b"d9juau41awczczp"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "そのスピードで"); - } - - /// - #[test] - fn test_punycode_rfc_ascii() { - let input = b"-> $1.00 <--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-> $1.00 <-"); - } - - /// - #[test] - fn test_punycode_empty_string() { - let input = b""; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, ""); - } - - /// - #[test] - fn test_punycode_hyphen() { - let input = b"--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-"); - } - - /// - #[test] - fn test_punycode_hyphen_a() { - let input = b"-a-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-a"); - } - - /// - #[test] - fn test_punycode_hyphen_a_hyphen() { - let input = b"-a--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-a-"); - } - - /// - #[test] - fn test_punycode_a() { - let input = b"a-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "a"); - } - - /// - #[test] - fn test_punycode_a_hyphen() { - let input = b"a--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "a-"); - } - - /// - #[test] - fn test_punycode_a_b() { - let input = b"a-b-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "a-b"); - } - - /// - #[test] - fn test_punycode_books() { - let input = b"books-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "books"); - } - - /// - #[test] - fn test_punycode_german() { - let input = b"bcher-kva"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "bücher"); - } - - /// - #[test] - fn test_punycode_chinese() { - let input = b"Hello-ck1hg65u"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "Hello世界"); - } - - /// - #[test] - fn test_punycode_umlaut() { - let input = b"tda"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "ü"); - } - - /// - #[test] - fn test_punycode_two_special() { - let input = b"tdac"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "üý"); - } - - /// - #[test] - fn test_punycode_error_single_hyphen() { - let input = b"-"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - unexpected end of input - - Input: - - ^ - - Expected: more punycode digits - Found: end of input - "); - - assert_eq!( - result, - DecodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: 0 - } - ); - } - - /// - #[test] - fn test_punycode_error_null_byte() { - let input = b"foo\0bar"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid basic code point - - Input: foobar - ^ - - Expected: ASCII character (0-127) - Found: '' - "); - - assert_eq!( - result, - DecodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 3, - character: vec![], - } - ); - } - - /// - #[test] - fn test_punycode_error_hash() { - let input = b"foo#bar"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid basic code point - - Input: foo#bar - ^ - - Expected: ASCII character (0-127) - Found: '' - "); - - assert_eq!( - result, - DecodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 3, - character: vec![], - } - ); - } - - /// - #[test] - fn test_punycode_error_pound_symbol() { - let input = b"foo\xC2\xA3bar"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid basic code point - - Input: foo£bar - ^ - - Expected: ASCII character (0-127) - Found: '' - "); - - assert_eq!( - result, - DecodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 3, - character: vec![], - } - ); - } - - /// - #[test] - fn test_punycode_error_truncated() { - let input = b"9"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - unexpected end of input - - Input: 9 - ^ - - Expected: more punycode digits - Found: end of input - "); - - assert_eq!( - result, - DecodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: 0 - } - ); - } - - /// - #[test] - fn test_punycode_error_code_point_too_large() { - let input = b"99999a"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid code point - - Input: 99999a - ^ - - Cannot convert value 4760513 to valid Unicode character - "); - - assert_eq!( - result, - DecodingError::InvalidCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 5, - value: 0x0048_A3C1, - } - ); - } - - /// - #[test] - fn test_punycode_error_overflow() { - let input = b"9999999999a"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - numeric overflow - - Input: 9999999999a - ^ - - Overflow occurred while decoding punycode digits - "); - - assert_eq!( - result, - DecodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position: 7, - } - ); - } -} diff --git a/crates/rails-macro/Cargo.toml b/crates/rails-macro/Cargo.toml deleted file mode 100644 index babab9d1..00000000 --- a/crates/rails-macro/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -# https://doc.rust-lang.org/cargo/reference/manifest.html -[package] -name = "wayfind-rails-macro" -description = "Macros for `wayfind` with Rails routes." -publish = false - -version.workspace = true -authors.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lints] -workspace = true - -[lib] -proc-macro = true - -[dependencies] -wayfind = { path = "../.." } - -# Macro -syn = "2.0" -quote = "1.0" -proc-macro2 = "1.0" - -# Serde -serde_json = "1.0" diff --git a/crates/rails-macro/src/lib.rs b/crates/rails-macro/src/lib.rs deleted file mode 100644 index e96e6666..00000000 --- a/crates/rails-macro/src/lib.rs +++ /dev/null @@ -1,60 +0,0 @@ -use proc_macro::TokenStream; -use proc_macro2::Span; -use quote::quote; -use serde_json::Value; -use syn::{parse_macro_input, Ident, LitStr}; - -#[proc_macro] -#[allow(clippy::missing_panics_doc)] -pub fn generate_constraints(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as LitStr); - let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); - let path = std::path::Path::new(&manifest_dir).join(input.value()); - let json_str = std::fs::read_to_string(path).unwrap(); - let json: Value = serde_json::from_str(&json_str).unwrap(); - - let constraints = json["constraints"].as_object().unwrap(); - let generated = constraints.iter().map(|(pattern, id)| { - let id = id.as_u64().unwrap().to_string(); - let struct_name = Ident::new(&format!("Constraint{id}"), Span::call_site()); - let pattern = pattern.to_string(); - - quote! { - pub struct #struct_name; - impl PathConstraint for #struct_name { - const NAME: &'static str = #id; - - fn check(segment: &str) -> bool { - static REGEX: LazyLock = LazyLock::new(|| { - Regex::new(#pattern).unwrap() - }); - - REGEX.is_match(segment).unwrap_or(false) - } - } - } - }); - - let constraint_structs: Vec<_> = constraints - .iter() - .map(|(_, id)| { - let id = id.as_u64().unwrap(); - Ident::new(&format!("Constraint{id}"), Span::call_site()) - }) - .collect(); - - let constraints_fn = quote! { - pub fn constraints(router: &mut Router) { - #( - router.path.constraint::<#constraint_structs>().unwrap(); - )* - } - }; - - let expanded = quote! { - #(#generated)* - #constraints_fn - }; - - TokenStream::from(expanded) -} diff --git a/crates/rails/Cargo.toml b/crates/rails/Cargo.toml deleted file mode 100644 index fadee1df..00000000 --- a/crates/rails/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -# https://doc.rust-lang.org/cargo/reference/manifest.html -[package] -name = "wayfind-rails" -description = "Rails route parser for `wayfind`." -publish = false - -version.workspace = true -authors.workspace = true -edition.workspace = true -repository.workspace = true -license.workspace = true -keywords.workspace = true -categories.workspace = true - -[lints] -workspace = true - -[dependencies] -wayfind = { path = "../.." } - -# Serde -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" - -# Regex -fancy-regex = "0.14" - -[dev-dependencies] -# Testing -# NOTE: Keep in sync with `cargo-insta` Nix package. -insta = { version = "=1.41.1", features = ["json"] } diff --git a/crates/rails/README.md b/crates/rails/README.md deleted file mode 100644 index 90201c91..00000000 --- a/crates/rails/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# `rails` - -A tool to convert Rails routes to Wayfind routes. - -```sh -cargo run --release -- input/routes.txt | tee output/routes.json -``` - -## routes.txt - -This was extracted via running `rails routes --expanded` from within the [GitLab Gitpod Env](https://docs.gitlab.com/ee/development/contributing/first_contribution/configure-dev-env-gitpod.html). - -Some manual changes are needed, since our router is stricter than Rails. - -### Calendar - -The following routes are only meant to handle `ics`. - -- Route 558 -- Route 1121 -- Route 1635 - -### JSON - -The following routes are only meant to handle `json`. - -- Route 752 -- Route 1701 -- Route 1702 -- Route 1704 -- Route 1713 -- Route 1738 -- Route 1739 - -### Feature Flags - -These routes are alternative implementations that are only usable via a feature flag. -Delete them. - -- Route 1711 -- Route 1844 - -### Route 2079 - -This route is provided by the `health_check` gem. -It conflicts with GitLab's own internal health check endpoint (Route 66). - -Rails allows conflicting routes, we don't. -Delete this route. - -``` ---[ Route 2079 ]---------------------------------------------------------------- -Prefix | -Verb | GET|POST -URI | /health_check(/:checks)(.:format) -Controller#Action | health_check/health_check#index {:format=>"txt"} -``` diff --git a/crates/rails/input/routes.txt b/crates/rails/input/routes.txt deleted file mode 100644 index 5eec8cca..00000000 --- a/crates/rails/input/routes.txt +++ /dev/null @@ -1,10510 +0,0 @@ ---[ Route 1 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /favicon.png(.:format) -Controller#Action | redirect(301) ---[ Route 2 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /favicon.ico(.:format) -Controller#Action | redirect(301) ---[ Route 3 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /rails/mailers(.:format) -Controller#Action | rails/mailers#index ---[ Route 4 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /rails/mailers/:path(.:format) -Controller#Action | rails/mailers#preview ---[ Route 5 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /rails/info/properties(.:format) -Controller#Action | rails/info#properties ---[ Route 6 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /rails/info/routes(.:format) -Controller#Action | rails/info#routes ---[ Route 7 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /rails/info(.:format) -Controller#Action | rails/info#index ---[ Route 8 ]------------------------------------------------------------------- -Prefix | letter_opener_web -Verb | -URI | /rails/letter_opener -Controller#Action | LetterOpenerWeb::Engine ---[ Route 9 ]------------------------------------------------------------------- -Prefix | lookbook -Verb | -URI | /rails/lookbook -Controller#Action | Lookbook::Engine ---[ Route 10 ]------------------------------------------------------------------ -Prefix | toogle -Verb | -URI | /rails/features -Controller#Action | Toogle::Engine ---[ Route 11 ]------------------------------------------------------------------ -Prefix | native_oauth_authorization -Verb | GET -URI | /oauth/authorize/native(.:format) -Controller#Action | oauth/authorizations#show ---[ Route 12 ]------------------------------------------------------------------ -Prefix | oauth_authorization -Verb | GET -URI | /oauth/authorize(.:format) -Controller#Action | oauth/authorizations#new ---[ Route 13 ]------------------------------------------------------------------ -Prefix | -Verb | DELETE -URI | /oauth/authorize(.:format) -Controller#Action | oauth/authorizations#destroy ---[ Route 14 ]------------------------------------------------------------------ -Prefix | -Verb | POST -URI | /oauth/authorize(.:format) -Controller#Action | oauth/authorizations#create ---[ Route 15 ]------------------------------------------------------------------ -Prefix | oauth_token -Verb | POST -URI | /oauth/token(.:format) -Controller#Action | oauth/tokens#create ---[ Route 16 ]------------------------------------------------------------------ -Prefix | oauth_revoke -Verb | POST -URI | /oauth/revoke(.:format) -Controller#Action | oauth/tokens#revoke ---[ Route 17 ]------------------------------------------------------------------ -Prefix | oauth_introspect -Verb | POST -URI | /oauth/introspect(.:format) -Controller#Action | oauth/tokens#introspect ---[ Route 18 ]------------------------------------------------------------------ -Prefix | oauth_applications -Verb | GET -URI | /oauth/applications(.:format) -Controller#Action | oauth/applications#index ---[ Route 19 ]------------------------------------------------------------------ -Prefix | -Verb | POST -URI | /oauth/applications(.:format) -Controller#Action | oauth/applications#create ---[ Route 20 ]------------------------------------------------------------------ -Prefix | new_oauth_application -Verb | GET -URI | /oauth/applications/new(.:format) -Controller#Action | oauth/applications#new ---[ Route 21 ]------------------------------------------------------------------ -Prefix | edit_oauth_application -Verb | GET -URI | /oauth/applications/:id/edit(.:format) -Controller#Action | oauth/applications#edit ---[ Route 22 ]------------------------------------------------------------------ -Prefix | oauth_application -Verb | GET -URI | /oauth/applications/:id(.:format) -Controller#Action | oauth/applications#show ---[ Route 23 ]------------------------------------------------------------------ -Prefix | -Verb | PATCH -URI | /oauth/applications/:id(.:format) -Controller#Action | oauth/applications#update ---[ Route 24 ]------------------------------------------------------------------ -Prefix | -Verb | PUT -URI | /oauth/applications/:id(.:format) -Controller#Action | oauth/applications#update ---[ Route 25 ]------------------------------------------------------------------ -Prefix | -Verb | DELETE -URI | /oauth/applications/:id(.:format) -Controller#Action | oauth/applications#destroy ---[ Route 26 ]------------------------------------------------------------------ -Prefix | oauth_authorized_applications -Verb | GET -URI | /oauth/authorized_applications(.:format) -Controller#Action | oauth/authorized_applications#index ---[ Route 27 ]------------------------------------------------------------------ -Prefix | oauth_authorized_application -Verb | DELETE -URI | /oauth/authorized_applications/:id(.:format) -Controller#Action | oauth/authorized_applications#destroy ---[ Route 28 ]------------------------------------------------------------------ -Prefix | oauth_token_info -Verb | GET -URI | /oauth/token/info(.:format) -Controller#Action | oauth/token_info#show ---[ Route 29 ]------------------------------------------------------------------ -Prefix | renew_oauth_application -Verb | PUT -URI | /oauth/applications/:id/renew(.:format) -Controller#Action | oauth/applications#renew ---[ Route 30 ]------------------------------------------------------------------ -Prefix | oauth_geo_auth -Verb | GET -URI | /oauth/geo/auth(.:format) -Controller#Action | oauth/geo_auth#auth ---[ Route 31 ]------------------------------------------------------------------ -Prefix | oauth_geo_callback -Verb | GET -URI | /oauth/geo/callback(.:format) -Controller#Action | oauth/geo_auth#callback ---[ Route 32 ]------------------------------------------------------------------ -Prefix | oauth_geo_logout -Verb | GET -URI | /oauth/geo/logout(.:format) -Controller#Action | oauth/geo_auth#logout ---[ Route 33 ]------------------------------------------------------------------ -Prefix | oauth_userinfo -Verb | GET -URI | /oauth/userinfo(.:format) -Controller#Action | doorkeeper/openid_connect/userinfo#show ---[ Route 34 ]------------------------------------------------------------------ -Prefix | -Verb | POST -URI | /oauth/userinfo(.:format) -Controller#Action | doorkeeper/openid_connect/userinfo#show ---[ Route 35 ]------------------------------------------------------------------ -Prefix | oauth_discovery_keys -Verb | GET -URI | /oauth/discovery/keys(.:format) -Controller#Action | jwks#keys ---[ Route 36 ]------------------------------------------------------------------ -Prefix | oauth_discovery_provider -Verb | GET -URI | /.well-known/openid-configuration(.:format) -Controller#Action | jwks#provider ---[ Route 37 ]------------------------------------------------------------------ -Prefix | -Verb | GET -URI | /.well-known/oauth-authorization-server(.:format) -Controller#Action | jwks#provider ---[ Route 38 ]------------------------------------------------------------------ -Prefix | oauth_discovery_webfinger -Verb | GET -URI | /.well-known/webfinger(.:format) -Controller#Action | jwks#webfinger ---[ Route 39 ]------------------------------------------------------------------ -Prefix | oauth_device_codes_create -Verb | POST -URI | /oauth/authorize_device(.:format) -Controller#Action | oauth/device_codes#create ---[ Route 40 ]------------------------------------------------------------------ -Prefix | oauth_device_authorizations_index -Verb | GET -URI | /oauth/device(.:format) -Controller#Action | oauth/device_authorizations#index ---[ Route 41 ]------------------------------------------------------------------ -Prefix | oauth_device_authorizations_authorize -Verb | POST -URI | /oauth/device(.:format) -Controller#Action | oauth/device_authorizations#authorize ---[ Route 42 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /oauth/userinfo(.:format) -Controller#Action | doorkeeper/openid_connect/userinfo#show ---[ Route 43 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /oauth/discovery/keys(.:format) -Controller#Action | jwks#keys ---[ Route 44 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /.well-known/openid-configuration(.:format) -Controller#Action | jwks#provider ---[ Route 45 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /.well-known/webfinger(.:format) -Controller#Action | jwks#webfinger ---[ Route 46 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /oauth/token(.:format) -Controller#Action | oauth/tokens#create ---[ Route 47 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /oauth/revoke(.:format) -Controller#Action | oauth/tokens#revoke ---[ Route 48 ]------------------------------------------------------------------ -Prefix | __jira_connect_oauth_application_id -Verb | OPTIONS -URI | /-/jira_connect/oauth_application_id(.:format) -Controller#Action | jira_connect/oauth_application_ids#show ---[ Route 49 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /-/jira_connect/subscriptions(.:format) -Controller#Action | jira_connect/subscriptions#index ---[ Route 50 ]------------------------------------------------------------------ -Prefix | -Verb | OPTIONS -URI | /-/jira_connect/subscriptions/:id(.:format) -Controller#Action | jira_connect/subscriptions#delete ---[ Route 51 ]------------------------------------------------------------------ -Prefix | users_sign_up_welcome -Verb | GET -URI | /users/sign_up/welcome(.:format) -Controller#Action | registrations/welcome#show ---[ Route 52 ]------------------------------------------------------------------ -Prefix | -Verb | PATCH -URI | /users/sign_up/welcome(.:format) -Controller#Action | registrations/welcome#update ---[ Route 53 ]------------------------------------------------------------------ -Prefix | -Verb | PUT -URI | /users/sign_up/welcome(.:format) -Controller#Action | registrations/welcome#update ---[ Route 54 ]------------------------------------------------------------------ -Prefix | new_users_sign_up_company -Verb | GET -URI | /users/sign_up/company/new(.:format) -Controller#Action | registrations/company#new ---[ Route 55 ]------------------------------------------------------------------ -Prefix | users_sign_up_company -Verb | POST -URI | /users/sign_up/company(.:format) -Controller#Action | registrations/company#create ---[ Route 56 ]------------------------------------------------------------------ -Prefix | users_sign_up_groups -Verb | POST -URI | /users/sign_up/groups(.:format) -Controller#Action | registrations/groups#create ---[ Route 57 ]------------------------------------------------------------------ -Prefix | new_users_sign_up_group -Verb | GET -URI | /users/sign_up/groups/new(.:format) -Controller#Action | registrations/groups#new ---[ Route 58 ]------------------------------------------------------------------ -Prefix | search -Verb | GET -URI | /search(.:format) -Controller#Action | search#show ---[ Route 59 ]------------------------------------------------------------------ -Prefix | search_autocomplete -Verb | GET -URI | /search/autocomplete(.:format) -Controller#Action | search#autocomplete ---[ Route 60 ]------------------------------------------------------------------ -Prefix | search_settings -Verb | GET -URI | /search/settings(.:format) -Controller#Action | search#settings ---[ Route 61 ]------------------------------------------------------------------ -Prefix | search_count -Verb | GET -URI | /search/count(.:format) -Controller#Action | search#count ---[ Route 62 ]------------------------------------------------------------------ -Prefix | search_opensearch -Verb | GET -URI | /search/opensearch(.:format) -Controller#Action | search#opensearch ---[ Route 63 ]------------------------------------------------------------------ -Prefix | search_aggregations -Verb | GET -URI | /search/aggregations(.:format) -Controller#Action | search#aggregations ---[ Route 64 ]------------------------------------------------------------------ -Prefix | jwt_auth -Verb | GET -URI | /jwt/auth(.:format) -Controller#Action | jwt#auth ---[ Route 65 ]------------------------------------------------------------------ -Prefix | -Verb | POST -URI | /jwt/auth(.:format) -Controller#Action | # ---[ Route 66 ]------------------------------------------------------------------ -Prefix | health_check -Verb | GET -URI | /health_check(/:checks)(.:format) -Controller#Action | health_check#index ---[ Route 67 ]------------------------------------------------------------------ -Prefix | terraform_services -Verb | GET -URI | /.well-known/terraform.json(.:format) -Controller#Action | terraform/services#index ---[ Route 68 ]------------------------------------------------------------------ -Prefix | autocomplete_users -Verb | GET -URI | /-/autocomplete/users(.:format) -Controller#Action | autocomplete#users ---[ Route 69 ]------------------------------------------------------------------ -Prefix | -Verb | GET -URI | /-/autocomplete/users/:id(.:format) -Controller#Action | autocomplete#user ---[ Route 70 ]------------------------------------------------------------------ -Prefix | autocomplete_projects -Verb | GET -URI | /-/autocomplete/projects(.:format) -Controller#Action | autocomplete#projects ---[ Route 71 ]------------------------------------------------------------------ -Prefix | autocomplete_award_emojis -Verb | GET -URI | /-/autocomplete/award_emojis(.:format) -Controller#Action | autocomplete#award_emojis ---[ Route 72 ]------------------------------------------------------------------ -Prefix | autocomplete_merge_request_target_branches -Verb | GET -URI | /-/autocomplete/merge_request_target_branches(.:format) -Controller#Action | autocomplete#merge_request_target_branches ---[ Route 73 ]------------------------------------------------------------------ -Prefix | autocomplete_merge_request_source_branches -Verb | GET -URI | /-/autocomplete/merge_request_source_branches(.:format) -Controller#Action | autocomplete#merge_request_source_branches ---[ Route 74 ]------------------------------------------------------------------ -Prefix | autocomplete_deploy_keys_with_owners -Verb | GET -URI | /-/autocomplete/deploy_keys_with_owners(.:format) -Controller#Action | autocomplete#deploy_keys_with_owners ---[ Route 75 ]------------------------------------------------------------------ -Prefix | autocomplete_project_groups -Verb | GET -URI | /-/autocomplete/project_groups(.:format) -Controller#Action | autocomplete#project_groups ---[ Route 76 ]------------------------------------------------------------------ -Prefix | autocomplete_project_routes -Verb | GET -URI | /-/autocomplete/project_routes(.:format) -Controller#Action | autocomplete#project_routes ---[ Route 77 ]------------------------------------------------------------------ -Prefix | autocomplete_namespace_routes -Verb | GET -URI | /-/autocomplete/namespace_routes(.:format) -Controller#Action | autocomplete#namespace_routes ---[ Route 78 ]------------------------------------------------------------------ -Prefix | autocomplete_group_subgroups -Verb | GET -URI | /-/autocomplete/group_subgroups(.:format) -Controller#Action | autocomplete#group_subgroups ---[ Route 79 ]------------------------------------------------------------------ -Prefix | sandbox_mermaid -Verb | GET -URI | /-/sandbox/mermaid(.:format) -Controller#Action | sandbox#mermaid ---[ Route 80 ]------------------------------------------------------------------ -Prefix | sandbox_swagger -Verb | GET -URI | /-/sandbox/swagger(.:format) -Controller#Action | sandbox#swagger ---[ Route 81 ]------------------------------------------------------------------ -Prefix | banzai_upload -Verb | GET -URI | /-/:model/:model_id/uploads/:secret/:filename(.:format) -Controller#Action | banzai/uploads#show {:model=>/project|group/, :filename=>/[^\/]+/} ---[ Route 82 ]------------------------------------------------------------------ -Prefix | whats_new -Verb | GET -URI | /-/whats_new(.:format) -Controller#Action | whats_new#index ---[ Route 83 ]------------------------------------------------------------------ -Prefix | offline -Verb | GET -URI | /-/offline(.:format) -Controller#Action | pwa#offline ---[ Route 84 ]------------------------------------------------------------------ -Prefix | manifest -Verb | GET -URI | /-/manifest(.:format) -Controller#Action | pwa#manifest ---[ Route 85 ]------------------------------------------------------------------ -Prefix | kubernetes_dashboard_index -Verb | GET -URI | /-/kubernetes(.:format) -Controller#Action | clusters/agents/dashboard#index ---[ Route 86 ]------------------------------------------------------------------ -Prefix | kubernetes_dashboard -Verb | GET -URI | /-/kubernetes/:agent_id(/*vueroute)(.:format) -Controller#Action | clusters/agents/dashboard#show ---[ Route 87 ]------------------------------------------------------------------ -Prefix | http_router_version -Verb | -URI | /-/http_router/version(.:format) -Controller#Action | # ---[ Route 88 ]------------------------------------------------------------------ -Prefix | liveness -Verb | GET -URI | /-/liveness(.:format) -Controller#Action | health#liveness ---[ Route 89 ]------------------------------------------------------------------ -Prefix | readiness -Verb | GET -URI | /-/readiness(.:format) -Controller#Action | health#readiness ---[ Route 90 ]------------------------------------------------------------------ -Prefix | metrics -Verb | GET -URI | /-/metrics(.:format) -Controller#Action | metrics#index ---[ Route 91 ]------------------------------------------------------------------ -Prefix | metrics_system -Verb | GET -URI | /-/metrics/system(.:format) -Controller#Action | metrics#system ---[ Route 92 ]------------------------------------------------------------------ -Prefix | peek_routes -Verb | -URI | /-/peek -Controller#Action | Peek::Railtie ---[ Route 93 ]------------------------------------------------------------------ -Prefix | runner_setup_platforms -Verb | GET -URI | /-/runner_setup/platforms(.:format) -Controller#Action | runner_setup#platforms ---[ Route 94 ]------------------------------------------------------------------ -Prefix | acme_challenge -Verb | GET -URI | /-/acme-challenge(.:format) -Controller#Action | acme_challenges#show ---[ Route 95 ]------------------------------------------------------------------ -Prefix | ide -Verb | GET -URI | /-/ide -Controller#Action | ide#index ---[ Route 96 ]------------------------------------------------------------------ -Prefix | ide_project -Verb | GET -URI | /-/ide/project -Controller#Action | ide#index ---[ Route 97 ]------------------------------------------------------------------ -Prefix | ide_oauth_redirect -Verb | GET -URI | /-/ide/oauth_redirect -Controller#Action | ide#oauth_redirect ---[ Route 98 ]------------------------------------------------------------------ -Prefix | ide_project_edit -Verb | GET -URI | /-/ide/project/:project_id/edit -Controller#Action | ide#index {:project_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/\d+/} ---[ Route 111 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /-/ide/project/:project_id -Controller#Action | ide#index {:project_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(? ---[ Route 120 ]----------------------------------------------------------------- -Prefix | jira_connect_app_descriptor -Verb | GET -URI | /-/jira_connect/app_descriptor(.:format) -Controller#Action | jira_connect/app_descriptor#show ---[ Route 121 ]----------------------------------------------------------------- -Prefix | jira_connect_events_installed -Verb | POST -URI | /-/jira_connect/events/installed(.:format) -Controller#Action | jira_connect/events#installed ---[ Route 122 ]----------------------------------------------------------------- -Prefix | jira_connect_events_uninstalled -Verb | POST -URI | /-/jira_connect/events/uninstalled(.:format) -Controller#Action | jira_connect/events#uninstalled ---[ Route 123 ]----------------------------------------------------------------- -Prefix | jira_connect_subscriptions -Verb | GET -URI | /-/jira_connect/subscriptions(.:format) -Controller#Action | jira_connect/subscriptions#index ---[ Route 124 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /-/jira_connect/subscriptions(.:format) -Controller#Action | jira_connect/subscriptions#create ---[ Route 125 ]----------------------------------------------------------------- -Prefix | jira_connect_subscription -Verb | DELETE -URI | /-/jira_connect/subscriptions/:id(.:format) -Controller#Action | jira_connect/subscriptions#destroy ---[ Route 126 ]----------------------------------------------------------------- -Prefix | route_jira_connect_branches -Verb | GET -URI | /-/jira_connect/branches/route(.:format) -Controller#Action | jira_connect/branches#route ---[ Route 127 ]----------------------------------------------------------------- -Prefix | new_jira_connect_branch -Verb | GET -URI | /-/jira_connect/branches/new(.:format) -Controller#Action | jira_connect/branches#new ---[ Route 128 ]----------------------------------------------------------------- -Prefix | jira_connect_public_key -Verb | GET -URI | /-/jira_connect/public_keys/:id(.:format) -Controller#Action | jira_connect/public_keys#show ---[ Route 129 ]----------------------------------------------------------------- -Prefix | search_jira_connect_workspaces -Verb | GET -URI | /-/jira_connect/workspaces/search(.:format) -Controller#Action | jira_connect/workspaces#search ---[ Route 130 ]----------------------------------------------------------------- -Prefix | search_jira_connect_repositories -Verb | GET -URI | /-/jira_connect/repositories/search(.:format) -Controller#Action | jira_connect/repositories#search ---[ Route 131 ]----------------------------------------------------------------- -Prefix | associate_jira_connect_repositories -Verb | POST -URI | /-/jira_connect/repositories/associate(.:format) -Controller#Action | jira_connect/repositories#associate ---[ Route 132 ]----------------------------------------------------------------- -Prefix | jira_connect_installations -Verb | PUT -URI | /-/jira_connect/installations(.:format) -Controller#Action | jira_connect/installations#update ---[ Route 133 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /-/jira_connect/installations(.:format) -Controller#Action | jira_connect/installations#index ---[ Route 134 ]----------------------------------------------------------------- -Prefix | jira_connect_oauth_callbacks -Verb | GET -URI | /-/jira_connect/oauth_callbacks(.:format) -Controller#Action | jira_connect/oauth_callbacks#index ---[ Route 135 ]----------------------------------------------------------------- -Prefix | jira_connect_oauth_application_id -Verb | GET -URI | /-/jira_connect/oauth_application_id(.:format) -Controller#Action | jira_connect/oauth_application_ids#show ---[ Route 136 ]----------------------------------------------------------------- -Prefix | preview_markdown_organizations -Verb | POST -URI | /-/organizations/preview_markdown(.:format) -Controller#Action | organizations/organizations#preview_markdown ---[ Route 137 ]----------------------------------------------------------------- -Prefix | activity_organization -Verb | GET -URI | /-/organizations/:organization_path/activity(.:format) -Controller#Action | organizations/organizations#activity ---[ Route 138 ]----------------------------------------------------------------- -Prefix | groups_and_projects_organization -Verb | GET -URI | /-/organizations/:organization_path/groups_and_projects(.:format) -Controller#Action | organizations/organizations#groups_and_projects ---[ Route 139 ]----------------------------------------------------------------- -Prefix | users_organization -Verb | GET -URI | /-/organizations/:organization_path/users(.:format) -Controller#Action | organizations/organizations#users ---[ Route 140 ]----------------------------------------------------------------- -Prefix | general_settings_organization -Verb | GET -URI | /-/organizations/:organization_path/settings/general(.:format) -Controller#Action | organizations/settings#general ---[ Route 141 ]----------------------------------------------------------------- -Prefix | new_groups_organization -Verb | GET -URI | /-/organizations/:organization_path/groups/new(.:format) -Controller#Action | organizations/groups#new ---[ Route 142 ]----------------------------------------------------------------- -Prefix | groups_organization -Verb | DELETE -URI | /-/organizations/:organization_path/groups(.:format) -Controller#Action | organizations/groups#destroy ---[ Route 143 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /-/organizations/:organization_path/groups(.:format) -Controller#Action | organizations/groups#create ---[ Route 144 ]----------------------------------------------------------------- -Prefix | edit_groups_organization -Verb | GET -URI | /-/organizations/:organization_path/groups/*id/edit(.:format) -Controller#Action | organizations/groups#edit ---[ Route 145 ]----------------------------------------------------------------- -Prefix | edit_namespace_projects_organization -Verb | GET -URI | /-/organizations/:organization_path/projects/*namespace_id/:id/edit(.:format) -Controller#Action | organizations/projects#edit {:id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[a-f0-9]{64}/} ---[ Route 214 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /-/push_from_secondary/:geo_node_id/*repository_path/gitlab-lfs/objects/*oid/*size/authorize -Controller#Action | repositories/lfs_storage#upload_authorize {:repository_path=>/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[a-f0-9]{64}/, :size=>/[0-9]+/} ---[ Route 215 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /-/push_from_secondary/:geo_node_id/*repository_path/gitlab-lfs/objects/*oid/*size -Controller#Action | repositories/lfs_storage#upload_finalize {:repository_path=>/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[a-f0-9]{64}/, :size=>/[0-9]+/} ---[ Route 216 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /-/push_from_secondary/:geo_node_id/*repository_path -Controller#Action | redirect(301) {:repository_path=>/(?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[A-Za-z0-9_-]+/} ---[ Route 226 ]----------------------------------------------------------------- -Prefix | decline_invite -Verb | GET|POST -URI | /-/invites/:id/decline(.:format) -Controller#Action | invites#decline {:id=>/[A-Za-z0-9_-]+/} ---[ Route 227 ]----------------------------------------------------------------- -Prefix | invite -Verb | GET -URI | /-/invites/:id(.:format) -Controller#Action | invites#show {:id=>/[A-Za-z0-9_-]+/} ---[ Route 228 ]----------------------------------------------------------------- -Prefix | unsubscribe_sent_notification -Verb | GET|POST -URI | /-/sent_notifications/:id/unsubscribe(.:format) -Controller#Action | sent_notifications#unsubscribe {:id=>/\h{32}/} ---[ Route 229 ]----------------------------------------------------------------- -Prefix | add_category_abuse_reports -Verb | POST -URI | /-/abuse_reports/add_category(.:format) -Controller#Action | abuse_reports#add_category ---[ Route 230 ]----------------------------------------------------------------- -Prefix | abuse_reports -Verb | POST -URI | /-/abuse_reports(.:format) -Controller#Action | abuse_reports#create ---[ Route 231 ]----------------------------------------------------------------- -Prefix | jwks -Verb | GET -URI | /-/jwks(.:format) -Controller#Action | jwks#index ---[ Route 232 ]----------------------------------------------------------------- -Prefix | raw_snippet -Verb | GET -URI | /-/snippets/:id/raw(.:format) -Controller#Action | snippets#raw {:id=>/\d+/} ---[ Route 233 ]----------------------------------------------------------------- -Prefix | mark_as_spam_snippet -Verb | POST -URI | /-/snippets/:id/mark_as_spam(.:format) -Controller#Action | snippets#mark_as_spam {:id=>/\d+/} ---[ Route 234 ]----------------------------------------------------------------- -Prefix | preview_markdown_snippets -Verb | POST -URI | /-/snippets/preview_markdown(.:format) -Controller#Action | snippets#preview_markdown ---[ Route 235 ]----------------------------------------------------------------- -Prefix | delete_attachment_snippet_note -Verb | DELETE -URI | /-/snippets/:snippet_id/notes/:id/delete_attachment(.:format) -Controller#Action | snippets/notes#delete_attachment {:id=>/\d+/, :snippet_id=>/\d+/} ---[ Route 236 ]----------------------------------------------------------------- -Prefix | toggle_award_emoji_snippet_note -Verb | POST -URI | /-/snippets/:snippet_id/notes/:id/toggle_award_emoji(.:format) -Controller#Action | snippets/notes#toggle_award_emoji {:id=>/\d+/, :snippet_id=>/\d+/} ---[ Route 237 ]----------------------------------------------------------------- -Prefix | snippet_notes -Verb | GET -URI | /-/snippets/:snippet_id/notes(.:format) -Controller#Action | snippets/notes#index {:snippet_id=>/\d+/} ---[ Route 238 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /-/snippets/:snippet_id/notes(.:format) -Controller#Action | snippets/notes#create {:snippet_id=>/\d+/} ---[ Route 239 ]----------------------------------------------------------------- -Prefix | snippet_note -Verb | PATCH -URI | /-/snippets/:snippet_id/notes/:id(.:format) -Controller#Action | snippets/notes#update {:id=>/\d+/, :snippet_id=>/\d+/} ---[ Route 240 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /-/snippets/:snippet_id/notes/:id(.:format) -Controller#Action | snippets/notes#update {:id=>/\d+/, :snippet_id=>/\d+/} ---[ Route 241 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /-/snippets/:snippet_id/notes/:id(.:format) -Controller#Action | snippets/notes#destroy {:id=>/\d+/, :snippet_id=>/\d+/} ---[ Route 242 ]----------------------------------------------------------------- -Prefix | toggle_award_emoji_snippet -Verb | POST -URI | /-/snippets/:id/toggle_award_emoji(.:format) -Controller#Action | snippets#toggle_award_emoji {:id=>/\d+/} ---[ Route 243 ]----------------------------------------------------------------- -Prefix | snippets -Verb | GET -URI | /-/snippets(.:format) -Controller#Action | snippets#index ---[ Route 244 ]----------------------------------------------------------------- -Prefix | new_snippet -Verb | GET -URI | /-/snippets/new(.:format) -Controller#Action | snippets#new ---[ Route 245 ]----------------------------------------------------------------- -Prefix | edit_snippet -Verb | GET -URI | /-/snippets/:id/edit(.:format) -Controller#Action | snippets#edit {:id=>/\d+/} ---[ Route 246 ]----------------------------------------------------------------- -Prefix | snippet -Verb | GET -URI | /-/snippets/:id(.:format) -Controller#Action | snippets#show {:id=>/\d+/} ---[ Route 247 ]----------------------------------------------------------------- -Prefix | snippet_blob_raw -Verb | GET -URI | /-/snippets/:snippet_id/raw/:ref/*path -Controller#Action | snippets/blobs#raw {:snippet_id=>/\d+/} ---[ Route 248 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /-/s/:username(.:format) -Controller#Action | redirect(301, users/%{username}/snippets) {:username=>/[a-zA-Z.0-9_\-]+(?/(html|json)/, :id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(html|json)/, :id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[^\/]+/} ---[ Route 348 ]----------------------------------------------------------------- -Prefix | retry_auto_ssl_group_settings_domain_verification -Verb | POST -URI | /groups/*group_id/-/settings/domain_verification/:id/retry_auto_ssl(.:format) -Controller#Action | groups/settings/domain_verification#retry_auto_ssl {:id=>/[^\/]+/} ---[ Route 349 ]----------------------------------------------------------------- -Prefix | clean_certificate_group_settings_domain_verification -Verb | DELETE -URI | /groups/*group_id/-/settings/domain_verification/:id/clean_certificate(.:format) -Controller#Action | groups/settings/domain_verification#clean_certificate {:id=>/[^\/]+/} ---[ Route 350 ]----------------------------------------------------------------- -Prefix | group_settings_domain_verification_index -Verb | GET -URI | /groups/*group_id/-/settings/domain_verification(.:format) -Controller#Action | groups/settings/domain_verification#index ---[ Route 351 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/settings/domain_verification(.:format) -Controller#Action | groups/settings/domain_verification#create ---[ Route 352 ]----------------------------------------------------------------- -Prefix | new_group_settings_domain_verification -Verb | GET -URI | /groups/*group_id/-/settings/domain_verification/new(.:format) -Controller#Action | groups/settings/domain_verification#new ---[ Route 353 ]----------------------------------------------------------------- -Prefix | group_settings_domain_verification -Verb | GET -URI | /groups/*group_id/-/settings/domain_verification/:id(.:format) -Controller#Action | groups/settings/domain_verification#show {:id=>/[^\/]+/} ---[ Route 354 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/settings/domain_verification/:id(.:format) -Controller#Action | groups/settings/domain_verification#update {:id=>/[^\/]+/} ---[ Route 355 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/settings/domain_verification/:id(.:format) -Controller#Action | groups/settings/domain_verification#update {:id=>/[^\/]+/} ---[ Route 356 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/settings/domain_verification/:id(.:format) -Controller#Action | groups/settings/domain_verification#destroy {:id=>/[^\/]+/} ---[ Route 357 ]----------------------------------------------------------------- -Prefix | group_settings_merge_requests -Verb | PATCH -URI | /groups/*group_id/-/settings/merge_requests(.:format) -Controller#Action | groups/settings/merge_requests#update ---[ Route 358 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/settings/merge_requests(.:format) -Controller#Action | groups/settings/merge_requests#update ---[ Route 359 ]----------------------------------------------------------------- -Prefix | group_settings_roles_and_permissions -Verb | GET -URI | /groups/*group_id/-/settings/roles_and_permissions(.:format) -Controller#Action | groups/settings/roles_and_permissions#index ---[ Route 360 ]----------------------------------------------------------------- -Prefix | new_group_settings_roles_and_permission -Verb | GET -URI | /groups/*group_id/-/settings/roles_and_permissions/new(.:format) -Controller#Action | groups/settings/roles_and_permissions#new ---[ Route 361 ]----------------------------------------------------------------- -Prefix | edit_group_settings_roles_and_permission -Verb | GET -URI | /groups/*group_id/-/settings/roles_and_permissions/:id/edit(.:format) -Controller#Action | groups/settings/roles_and_permissions#edit ---[ Route 362 ]----------------------------------------------------------------- -Prefix | group_settings_roles_and_permission -Verb | GET -URI | /groups/*group_id/-/settings/roles_and_permissions/:id(.:format) -Controller#Action | groups/settings/roles_and_permissions#show ---[ Route 363 ]----------------------------------------------------------------- -Prefix | group_settings_analytics -Verb | GET -URI | /groups/*group_id/-/settings/analytics(.:format) -Controller#Action | groups/settings/analytics#show ---[ Route 364 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/settings/analytics(.:format) -Controller#Action | groups/settings/analytics#update ---[ Route 365 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/settings/analytics(.:format) -Controller#Action | groups/settings/analytics#update ---[ Route 366 ]----------------------------------------------------------------- -Prefix | group_settings_gitlab_duo -Verb | GET -URI | /groups/*group_id/-/settings/gitlab_duo(.:format) -Controller#Action | groups/settings/gitlab_duo#show ---[ Route 367 ]----------------------------------------------------------------- -Prefix | group_settings_gitlab_duo_seat_utilization_index -Verb | GET -URI | /groups/*group_id/-/settings/gitlab_duo/seat_utilization(.:format) -Controller#Action | groups/settings/gitlab_duo/seat_utilization#index ---[ Route 368 ]----------------------------------------------------------------- -Prefix | group_settings_gitlab_duo_configuration_index -Verb | GET -URI | /groups/*group_id/-/settings/gitlab_duo/configuration(.:format) -Controller#Action | groups/settings/gitlab_duo/configuration#index ---[ Route 369 ]----------------------------------------------------------------- -Prefix | group_settings_gitlab_duo_usage -Verb | GET -URI | /groups/*group_id/-/settings/gitlab_duo_usage(.:format) -Controller#Action | redirect(301, groups/%{group_id}/-/settings/gitlab_duo/seat_utilization) ---[ Route 370 ]----------------------------------------------------------------- -Prefix | group_settings_workspaces -Verb | GET -URI | /groups/*group_id/-/settings/workspaces(.:format) -Controller#Action | groups/settings/remote_development/workspaces#show ---[ Route 371 ]----------------------------------------------------------------- -Prefix | group_settings_issues -Verb | GET -URI | /groups/*group_id/-/settings/issues(.:format) -Controller#Action | groups/settings/work_items#show ---[ Route 372 ]----------------------------------------------------------------- -Prefix | group_early_access_opt_in -Verb | GET -URI | /groups/*group_id/-/early_access_opt_in(.:format) -Controller#Action | groups/early_access_opt_in#show ---[ Route 373 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/early_access_opt_in(.:format) -Controller#Action | groups/early_access_opt_in#create ---[ Route 374 ]----------------------------------------------------------------- -Prefix | override_group_group_member -Verb | PATCH -URI | /groups/*group_id/-/group_members/:id/override(.:format) -Controller#Action | groups/group_members#override ---[ Route 375 ]----------------------------------------------------------------- -Prefix | unban_group_group_member -Verb | PUT -URI | /groups/*group_id/-/group_members/:id/unban(.:format) -Controller#Action | groups/group_members#unban ---[ Route 376 ]----------------------------------------------------------------- -Prefix | ban_group_group_member -Verb | PUT -URI | /groups/*group_id/-/group_members/:id/ban(.:format) -Controller#Action | groups/group_members#ban ---[ Route 377 ]----------------------------------------------------------------- -Prefix | export_csv_group_group_members -Verb | GET -URI | /groups/*group_id/-/group_members/export_csv(.:format) -Controller#Action | groups/group_members#export_csv ---[ Route 378 ]----------------------------------------------------------------- -Prefix | request_access_group_group_members -Verb | GET -URI | /groups/*group_id/-/group_members/request_access(.:format) -Controller#Action | groups/group_members#request_access ---[ Route 379 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/group_members/request_access(.:format) -Controller#Action | groups/group_members#request_access ---[ Route 380 ]----------------------------------------------------------------- -Prefix | approve_access_request_group_group_member -Verb | POST -URI | /groups/*group_id/-/group_members/:id/approve_access_request(.:format) -Controller#Action | groups/group_members#approve_access_request ---[ Route 381 ]----------------------------------------------------------------- -Prefix | group_two_factor_auth -Verb | DELETE -URI | /groups/*group_id/-/two_factor_auth(.:format) -Controller#Action | groups/two_factor_auths#destroy ---[ Route 382 ]----------------------------------------------------------------- -Prefix | group_analytics -Verb | GET -URI | /groups/*group_id/-/analytics(.:format) -Controller#Action | redirect(301, groups/%{group_id}/-/analytics/value_stream_analytics) ---[ Route 383 ]----------------------------------------------------------------- -Prefix | group_contribution_analytics -Verb | GET -URI | /groups/*group_id/-/contribution_analytics(.:format) -Controller#Action | groups/contribution_analytics#show ---[ Route 384 ]----------------------------------------------------------------- -Prefix | group_analytics_ci_cd_analytics -Verb | GET -URI | /groups/*group_id/-/analytics/ci_cd(.:format) -Controller#Action | groups/analytics/ci_cd_analytics#show ---[ Route 385 ]----------------------------------------------------------------- -Prefix | group_analytics_dashboards -Verb | GET -URI | /groups/*group_id/-/analytics/dashboards(/*vueroute) -Controller#Action | groups/analytics/dashboards#index {:group_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?true} ---[ Route 416 ]----------------------------------------------------------------- -Prefix | group_insights -Verb | GET -URI | /groups/*group_id/-/insights(.:format) -Controller#Action | groups/insights#show {:trailing_slash=>true} ---[ Route 417 ]----------------------------------------------------------------- -Prefix | group_notification_setting -Verb | PATCH -URI | /groups/*group_id/-/notification_setting(.:format) -Controller#Action | groups/notification_settings#update ---[ Route 418 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/notification_setting(.:format) -Controller#Action | groups/notification_settings#update ---[ Route 419 ]----------------------------------------------------------------- -Prefix | group_ldap_group_links -Verb | GET -URI | /groups/*group_id/-/ldap_group_links(.:format) -Controller#Action | groups/ldap_group_links#index ---[ Route 420 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/ldap_group_links(.:format) -Controller#Action | groups/ldap_group_links#create ---[ Route 421 ]----------------------------------------------------------------- -Prefix | group_ldap_group_link -Verb | DELETE -URI | /groups/*group_id/-/ldap_group_links/:id(.:format) -Controller#Action | groups/ldap_group_links#destroy ---[ Route 422 ]----------------------------------------------------------------- -Prefix | group_saml_group_links -Verb | GET -URI | /groups/*group_id/-/saml_group_links(.:format) -Controller#Action | groups/saml_group_links#index ---[ Route 423 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/saml_group_links(.:format) -Controller#Action | groups/saml_group_links#create ---[ Route 424 ]----------------------------------------------------------------- -Prefix | group_saml_group_link -Verb | DELETE -URI | /groups/*group_id/-/saml_group_links/:id(.:format) -Controller#Action | groups/saml_group_links#destroy ---[ Route 425 ]----------------------------------------------------------------- -Prefix | group_audit_events -Verb | GET -URI | /groups/*group_id/-/audit_events(.:format) -Controller#Action | groups/audit_events#index ---[ Route 426 ]----------------------------------------------------------------- -Prefix | pending_members_group_usage_quotas -Verb | GET -URI | /groups/*group_id/-/usage_quotas/pending_members(.:format) -Controller#Action | groups/usage_quotas#pending_members ---[ Route 427 ]----------------------------------------------------------------- -Prefix | subscription_history_group_usage_quotas -Verb | GET -URI | /groups/*group_id/-/usage_quotas/subscription_history(.:format) -Controller#Action | groups/usage_quotas#subscription_history {:format=>"csv"} ---[ Route 428 ]----------------------------------------------------------------- -Prefix | group_usage_quotas -Verb | GET -URI | /groups/*group_id/-/usage_quotas(.:format) -Controller#Action | groups/usage_quotas#index ---[ Route 429 ]----------------------------------------------------------------- -Prefix | test_group_hook -Verb | POST -URI | /groups/*group_id/-/hooks/:id/test(.:format) -Controller#Action | groups/hooks#test {:id=>/\d+/} ---[ Route 430 ]----------------------------------------------------------------- -Prefix | retry_group_hook_hook_log -Verb | POST -URI | /groups/*group_id/-/hooks/:hook_id/hook_logs/:id/retry(.:format) -Controller#Action | groups/hook_logs#retry {:id=>/\d+/, :hook_id=>/\d+/} ---[ Route 431 ]----------------------------------------------------------------- -Prefix | group_hook_hook_log -Verb | GET -URI | /groups/*group_id/-/hooks/:hook_id/hook_logs/:id(.:format) -Controller#Action | groups/hook_logs#show {:id=>/\d+/, :hook_id=>/\d+/} ---[ Route 432 ]----------------------------------------------------------------- -Prefix | group_hooks -Verb | GET -URI | /groups/*group_id/-/hooks(.:format) -Controller#Action | groups/hooks#index ---[ Route 433 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/hooks(.:format) -Controller#Action | groups/hooks#create ---[ Route 434 ]----------------------------------------------------------------- -Prefix | edit_group_hook -Verb | GET -URI | /groups/*group_id/-/hooks/:id/edit(.:format) -Controller#Action | groups/hooks#edit {:id=>/\d+/} ---[ Route 435 ]----------------------------------------------------------------- -Prefix | group_hook -Verb | PATCH -URI | /groups/*group_id/-/hooks/:id(.:format) -Controller#Action | groups/hooks#update {:id=>/\d+/} ---[ Route 436 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/hooks/:id(.:format) -Controller#Action | groups/hooks#update {:id=>/\d+/} ---[ Route 437 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/hooks/:id(.:format) -Controller#Action | groups/hooks#destroy {:id=>/\d+/} ---[ Route 438 ]----------------------------------------------------------------- -Prefix | epics_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/epics(.:format) -Controller#Action | groups/autocomplete_sources#epics ---[ Route 439 ]----------------------------------------------------------------- -Prefix | iterations_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/iterations(.:format) -Controller#Action | groups/autocomplete_sources#iterations ---[ Route 440 ]----------------------------------------------------------------- -Prefix | vulnerabilities_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/vulnerabilities(.:format) -Controller#Action | groups/autocomplete_sources#vulnerabilities ---[ Route 441 ]----------------------------------------------------------------- -Prefix | wikis_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/wikis(.:format) -Controller#Action | groups/autocomplete_sources#wikis ---[ Route 442 ]----------------------------------------------------------------- -Prefix | refresh_seats_group_billings -Verb | POST -URI | /groups/*group_id/-/billings/refresh_seats(.:format) -Controller#Action | groups/billings#refresh_seats ---[ Route 443 ]----------------------------------------------------------------- -Prefix | group_billings -Verb | GET -URI | /groups/*group_id/-/billings(.:format) -Controller#Action | groups/billings#index ---[ Route 444 ]----------------------------------------------------------------- -Prefix | group_seat_usage -Verb | GET -URI | /groups/*group_id/-/seat_usage(.:format) -Controller#Action | groups/seat_usage#show ---[ Route 445 ]----------------------------------------------------------------- -Prefix | group_comment_templates -Verb | GET -URI | /groups/*group_id/-/comment_templates(.:format) -Controller#Action | groups/comment_templates#index ---[ Route 446 ]----------------------------------------------------------------- -Prefix | group_comment_template -Verb | GET -URI | /groups/*group_id/-/comment_templates/:id(.:format) -Controller#Action | groups/comment_templates#index ---[ Route 447 ]----------------------------------------------------------------- -Prefix | description_diff_group_epic -Verb | GET -URI | /groups/*group_id/-/epics/:id/descriptions/:version_id/diff(.:format) -Controller#Action | groups/epics#description_diff {:id=>/\d+/} ---[ Route 448 ]----------------------------------------------------------------- -Prefix | delete_description_version_group_epic -Verb | DELETE -URI | /groups/*group_id/-/epics/:id/descriptions/:version_id(.:format) -Controller#Action | groups/epics#delete_description_version {:id=>/\d+/} ---[ Route 449 ]----------------------------------------------------------------- -Prefix | discussions_group_epic -Verb | GET -URI | /groups/*group_id/-/epics/:id/discussions(.:format) -Controller#Action | groups/epics#discussions {:id=>/\d+/} ---[ Route 450 ]----------------------------------------------------------------- -Prefix | realtime_changes_group_epic -Verb | GET -URI | /groups/*group_id/-/epics/:id/realtime_changes(.:format) -Controller#Action | groups/epics#realtime_changes {:id=>/\d+/} ---[ Route 451 ]----------------------------------------------------------------- -Prefix | toggle_subscription_group_epic -Verb | POST -URI | /groups/*group_id/-/epics/:id/toggle_subscription(.:format) -Controller#Action | groups/epics#toggle_subscription {:id=>/\d+/} ---[ Route 452 ]----------------------------------------------------------------- -Prefix | group_epic_issues -Verb | GET -URI | /groups/*group_id/-/epics/:epic_id/issues(.:format) -Controller#Action | groups/epic_issues#index {:epic_id=>/\d+/} ---[ Route 453 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/epics/:epic_id/issues(.:format) -Controller#Action | groups/epic_issues#create {:epic_id=>/\d+/} ---[ Route 454 ]----------------------------------------------------------------- -Prefix | group_epic_issue -Verb | PATCH -URI | /groups/*group_id/-/epics/:epic_id/issues/:id(.:format) -Controller#Action | groups/epic_issues#update {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 455 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/epics/:epic_id/issues/:id(.:format) -Controller#Action | groups/epic_issues#update {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 456 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/epics/:epic_id/issues/:id(.:format) -Controller#Action | groups/epic_issues#destroy {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 457 ]----------------------------------------------------------------- -Prefix | toggle_award_emoji_group_epic_note -Verb | POST -URI | /groups/*group_id/-/epics/:epic_id/notes/:id/toggle_award_emoji(.:format) -Controller#Action | groups/epics/notes#toggle_award_emoji {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 458 ]----------------------------------------------------------------- -Prefix | group_epic_notes -Verb | GET -URI | /groups/*group_id/-/epics/:epic_id/notes(.:format) -Controller#Action | groups/epics/notes#index {:epic_id=>/\d+/} ---[ Route 459 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/epics/:epic_id/notes(.:format) -Controller#Action | groups/epics/notes#create {:epic_id=>/\d+/} ---[ Route 460 ]----------------------------------------------------------------- -Prefix | group_epic_note -Verb | PATCH -URI | /groups/*group_id/-/epics/:epic_id/notes/:id(.:format) -Controller#Action | groups/epics/notes#update {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 461 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/epics/:epic_id/notes/:id(.:format) -Controller#Action | groups/epics/notes#update {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 462 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/epics/:epic_id/notes/:id(.:format) -Controller#Action | groups/epics/notes#destroy {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 463 ]----------------------------------------------------------------- -Prefix | group_epic_links -Verb | GET -URI | /groups/*group_id/-/epics/:epic_id/links(.:format) -Controller#Action | groups/epics/epic_links#index {:epic_id=>/\d+/} ---[ Route 464 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/epics/:epic_id/links(.:format) -Controller#Action | groups/epics/epic_links#create {:epic_id=>/\d+/} ---[ Route 465 ]----------------------------------------------------------------- -Prefix | group_epic_link -Verb | PATCH -URI | /groups/*group_id/-/epics/:epic_id/links/:id(.:format) -Controller#Action | groups/epics/epic_links#update {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 466 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/epics/:epic_id/links/:id(.:format) -Controller#Action | groups/epics/epic_links#update {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 467 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/epics/:epic_id/links/:id(.:format) -Controller#Action | groups/epics/epic_links#destroy {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 468 ]----------------------------------------------------------------- -Prefix | group_epic_related_epic_links -Verb | GET -URI | /groups/*group_id/-/epics/:epic_id/related_epic_links(.:format) -Controller#Action | groups/epics/related_epic_links#index {:epic_id=>/\d+/} ---[ Route 469 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/epics/:epic_id/related_epic_links(.:format) -Controller#Action | groups/epics/related_epic_links#create {:epic_id=>/\d+/} ---[ Route 470 ]----------------------------------------------------------------- -Prefix | group_epic_related_epic_link -Verb | DELETE -URI | /groups/*group_id/-/epics/:epic_id/related_epic_links/:id(.:format) -Controller#Action | groups/epics/related_epic_links#destroy {:id=>/\d+/, :epic_id=>/\d+/} ---[ Route 471 ]----------------------------------------------------------------- -Prefix | bulk_update_group_epics -Verb | POST -URI | /groups/*group_id/-/epics/bulk_update(.:format) -Controller#Action | groups/epics#bulk_update ---[ Route 472 ]----------------------------------------------------------------- -Prefix | toggle_award_emoji_group_epic -Verb | POST -URI | /groups/*group_id/-/epics/:id/toggle_award_emoji(.:format) -Controller#Action | groups/epics#toggle_award_emoji {:id=>/\d+/} ---[ Route 473 ]----------------------------------------------------------------- -Prefix | group_epics -Verb | GET -URI | /groups/*group_id/-/epics(.:format) -Controller#Action | groups/epics#index ---[ Route 474 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/epics(.:format) -Controller#Action | groups/epics#create ---[ Route 475 ]----------------------------------------------------------------- -Prefix | new_group_epic -Verb | GET -URI | /groups/*group_id/-/epics/new(.:format) -Controller#Action | groups/epics#new ---[ Route 476 ]----------------------------------------------------------------- -Prefix | edit_group_epic -Verb | GET -URI | /groups/*group_id/-/epics/:id/edit(.:format) -Controller#Action | groups/epics#edit {:id=>/\d+/} ---[ Route 477 ]----------------------------------------------------------------- -Prefix | group_epic -Verb | GET -URI | /groups/*group_id/-/epics/:id(.:format) -Controller#Action | groups/epics#show {:id=>/\d+/} ---[ Route 478 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/epics/:id(.:format) -Controller#Action | groups/epics#update {:id=>/\d+/} ---[ Route 479 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/epics/:id(.:format) -Controller#Action | groups/epics#update {:id=>/\d+/} ---[ Route 480 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/epics/:id(.:format) -Controller#Action | groups/epics#destroy {:id=>/\d+/} ---[ Route 481 ]----------------------------------------------------------------- -Prefix | group_iterations -Verb | GET -URI | /groups/*group_id/-/iterations(.:format) -Controller#Action | groups/iterations#index ---[ Route 482 ]----------------------------------------------------------------- -Prefix | new_group_iteration -Verb | GET -URI | /groups/*group_id/-/iterations/new(.:format) -Controller#Action | groups/iterations#new ---[ Route 483 ]----------------------------------------------------------------- -Prefix | edit_group_iteration -Verb | GET -URI | /groups/*group_id/-/iterations/:id/edit(.:format) -Controller#Action | groups/iterations#edit {:id=>/\d+/} ---[ Route 484 ]----------------------------------------------------------------- -Prefix | group_iteration -Verb | GET -URI | /groups/*group_id/-/iterations/:id(.:format) -Controller#Action | groups/iterations#show {:id=>/\d+/} ---[ Route 485 ]----------------------------------------------------------------- -Prefix | group_iteration_cadence_iterations -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)/:iteration_cadence_id/iterations(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 486 ]----------------------------------------------------------------- -Prefix | new_group_iteration_cadence_iteration -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)/:iteration_cadence_id/iterations/new(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 487 ]----------------------------------------------------------------- -Prefix | edit_group_iteration_cadence_iteration -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)/:iteration_cadence_id/iterations/:id/edit(.:format) -Controller#Action | groups/iteration_cadences#index {:id=>/\d+/} ---[ Route 488 ]----------------------------------------------------------------- -Prefix | group_iteration_cadence_iteration -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)/:iteration_cadence_id/iterations/:id(.:format) -Controller#Action | groups/iteration_cadences#index {:id=>/\d+/} ---[ Route 489 ]----------------------------------------------------------------- -Prefix | group_iteration_cadences -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 490 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/cadences(/*vueroute)(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 491 ]----------------------------------------------------------------- -Prefix | new_group_iteration_cadence -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)/new(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 492 ]----------------------------------------------------------------- -Prefix | edit_group_iteration_cadence -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)/:id/edit(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 493 ]----------------------------------------------------------------- -Prefix | group_iteration_cadence -Verb | GET -URI | /groups/*group_id/-/cadences(/*vueroute)/:id(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 494 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/cadences(/*vueroute)/:id(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 495 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/cadences(/*vueroute)/:id(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 496 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/cadences(/*vueroute)/:id(.:format) -Controller#Action | groups/iteration_cadences#index ---[ Route 497 ]----------------------------------------------------------------- -Prefix | bulk_update_group_issues -Verb | POST -URI | /groups/*group_id/-/issues/bulk_update(.:format) -Controller#Action | groups/issues#bulk_update ---[ Route 498 ]----------------------------------------------------------------- -Prefix | bulk_update_group_merge_requests -Verb | POST -URI | /groups/*group_id/-/merge_requests/bulk_update(.:format) -Controller#Action | groups/merge_requests#bulk_update ---[ Route 499 ]----------------------------------------------------------------- -Prefix | group_todos -Verb | POST -URI | /groups/*group_id/-/todos(.:format) -Controller#Action | groups/todos#create ---[ Route 500 ]----------------------------------------------------------------- -Prefix | group_epic_boards -Verb | GET -URI | /groups/*group_id/-/epic_boards(.:format) -Controller#Action | groups/epic_boards#index ---[ Route 501 ]----------------------------------------------------------------- -Prefix | group_epic_board -Verb | GET -URI | /groups/*group_id/-/epic_boards/:id(.:format) -Controller#Action | groups/epic_boards#show ---[ Route 502 ]----------------------------------------------------------------- -Prefix | group_protected_environments -Verb | POST -URI | /groups/*group_id/-/protected_environments(.:format) -Controller#Action | groups/protected_environments#create ---[ Route 503 ]----------------------------------------------------------------- -Prefix | group_protected_environment -Verb | PATCH -URI | /groups/*group_id/-/protected_environments/:id(.:format) -Controller#Action | groups/protected_environments#update ---[ Route 504 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/protected_environments/:id(.:format) -Controller#Action | groups/protected_environments#update ---[ Route 505 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/protected_environments/:id(.:format) -Controller#Action | groups/protected_environments#destroy ---[ Route 506 ]----------------------------------------------------------------- -Prefix | group_security_dashboard -Verb | GET -URI | /groups/*group_id/-/security/dashboard(.:format) -Controller#Action | groups/security/dashboard#show ---[ Route 507 ]----------------------------------------------------------------- -Prefix | group_security_vulnerabilities -Verb | GET -URI | /groups/*group_id/-/security/vulnerabilities(.:format) -Controller#Action | groups/security/vulnerabilities#index ---[ Route 508 ]----------------------------------------------------------------- -Prefix | group_security_compliance_dashboard -Verb | GET -URI | /groups/*group_id/-/security/compliance_dashboard(/*vueroute)(.:format) -Controller#Action | groups/security/compliance_dashboards#show ---[ Route 509 ]----------------------------------------------------------------- -Prefix | group_security_discover -Verb | GET -URI | /groups/*group_id/-/security/discover(.:format) -Controller#Action | groups/security/discover#show ---[ Route 510 ]----------------------------------------------------------------- -Prefix | revoke_group_security_credential -Verb | PUT -URI | /groups/*group_id/-/security/credentials/:id/revoke(.:format) -Controller#Action | groups/security/credentials#revoke ---[ Route 511 ]----------------------------------------------------------------- -Prefix | group_security_credentials -Verb | GET -URI | /groups/*group_id/-/security/credentials(.:format) -Controller#Action | groups/security/credentials#index ---[ Route 512 ]----------------------------------------------------------------- -Prefix | group_security_credential -Verb | DELETE -URI | /groups/*group_id/-/security/credentials/:id(.:format) -Controller#Action | groups/security/credentials#destroy ---[ Route 513 ]----------------------------------------------------------------- -Prefix | schema_group_security_policies -Verb | GET -URI | /groups/*group_id/-/security/policies/schema(.:format) -Controller#Action | groups/security/policies#schema ---[ Route 514 ]----------------------------------------------------------------- -Prefix | group_security_policies -Verb | GET -URI | /groups/*group_id/-/security/policies(.:format) -Controller#Action | groups/security/policies#index ---[ Route 515 ]----------------------------------------------------------------- -Prefix | new_group_security_policy -Verb | GET -URI | /groups/*group_id/-/security/policies/new(.:format) -Controller#Action | groups/security/policies#new ---[ Route 516 ]----------------------------------------------------------------- -Prefix | edit_group_security_policy -Verb | GET -URI | /groups/*group_id/-/security/policies/:id/edit(.:format) -Controller#Action | groups/security/policies#edit {:id=>/[^\/]+/} ---[ Route 517 ]----------------------------------------------------------------- -Prefix | group_security_merge_commit_reports -Verb | GET -URI | /groups/*group_id/-/security/merge_commit_reports(.:format) -Controller#Action | groups/security/merge_commit_reports#index {:format=>:csv} ---[ Route 518 ]----------------------------------------------------------------- -Prefix | group_security_compliance_project_framework_reports -Verb | GET -URI | /groups/*group_id/-/security/compliance_project_framework_reports(.:format) -Controller#Action | groups/security/compliance_project_framework_reports#index {:format=>:csv} ---[ Route 519 ]----------------------------------------------------------------- -Prefix | group_security_compliance_violation_reports -Verb | GET -URI | /groups/*group_id/-/security/compliance_violation_reports(.:format) -Controller#Action | groups/security/compliance_violation_reports#index {:format=>:csv} ---[ Route 520 ]----------------------------------------------------------------- -Prefix | group_security_compliance_standards_adherence_reports -Verb | GET -URI | /groups/*group_id/-/security/compliance_standards_adherence_reports(.:format) -Controller#Action | groups/security/compliance_standards_adherence_reports#index {:format=>:csv} ---[ Route 521 ]----------------------------------------------------------------- -Prefix | group_security_compliance_framework_reports -Verb | GET -URI | /groups/*group_id/-/security/compliance_framework_reports(.:format) -Controller#Action | groups/security/compliance_framework_reports#index {:format=>:csv} ---[ Route 522 ]----------------------------------------------------------------- -Prefix | group_add_ons_discover_duo_pro -Verb | GET -URI | /groups/*group_id/-/add_ons/discover_duo_pro(.:format) -Controller#Action | groups/add_ons/discover_duo_pro#show ---[ Route 523 ]----------------------------------------------------------------- -Prefix | group_add_ons_discover_duo_enterprise -Verb | GET -URI | /groups/*group_id/-/add_ons/discover_duo_enterprise(.:format) -Controller#Action | groups/add_ons/discover_duo_enterprise#show ---[ Route 524 ]----------------------------------------------------------------- -Prefix | licenses_group_dependencies -Verb | GET -URI | /groups/*group_id/-/dependencies/licenses(.:format) -Controller#Action | groups/dependencies#licenses ---[ Route 525 ]----------------------------------------------------------------- -Prefix | locations_group_dependencies -Verb | GET -URI | /groups/*group_id/-/dependencies/locations(.:format) -Controller#Action | groups/dependencies#locations ---[ Route 526 ]----------------------------------------------------------------- -Prefix | group_dependencies -Verb | GET -URI | /groups/*group_id/-/dependencies(.:format) -Controller#Action | groups/dependencies#index ---[ Route 527 ]----------------------------------------------------------------- -Prefix | group_push_rules -Verb | PATCH -URI | /groups/*group_id/-/push_rules(.:format) -Controller#Action | groups/push_rules#update ---[ Route 528 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/push_rules(.:format) -Controller#Action | groups/push_rules#update ---[ Route 529 ]----------------------------------------------------------------- -Prefix | group_protected_branches -Verb | POST -URI | /groups/*group_id/-/protected_branches(.:format) -Controller#Action | groups/protected_branches#create ---[ Route 530 ]----------------------------------------------------------------- -Prefix | group_protected_branch -Verb | PATCH -URI | /groups/*group_id/-/protected_branches/:id(.:format) -Controller#Action | groups/protected_branches#update ---[ Route 531 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/protected_branches/:id(.:format) -Controller#Action | groups/protected_branches#update ---[ Route 532 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/protected_branches/:id(.:format) -Controller#Action | groups/protected_branches#destroy ---[ Route 533 ]----------------------------------------------------------------- -Prefix | callback_group_saml_providers -Verb | POST -URI | /groups/*group_id/-/saml/callback(.:format) -Controller#Action | groups/omniauth_callbacks#group_saml ---[ Route 534 ]----------------------------------------------------------------- -Prefix | sso_group_saml_providers -Verb | GET -URI | /groups/*group_id/-/saml/sso(.:format) -Controller#Action | groups/sso#saml ---[ Route 535 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/saml/sso(.:format) -Controller#Action | groups/sso#saml ---[ Route 536 ]----------------------------------------------------------------- -Prefix | unlink_group_saml_providers -Verb | DELETE -URI | /groups/*group_id/-/saml/unlink(.:format) -Controller#Action | groups/sso#unlink ---[ Route 537 ]----------------------------------------------------------------- -Prefix | update_microsoft_application_group_saml_providers -Verb | PUT -URI | /groups/*group_id/-/saml/update_microsoft_application(.:format) -Controller#Action | groups/saml_providers#update_microsoft_application ---[ Route 538 ]----------------------------------------------------------------- -Prefix | group_saml_providers -Verb | GET -URI | /groups/*group_id/-/saml(.:format) -Controller#Action | groups/saml_providers#show ---[ Route 539 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/saml(.:format) -Controller#Action | groups/saml_providers#update ---[ Route 540 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/saml(.:format) -Controller#Action | groups/saml_providers#update ---[ Route 541 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/saml(.:format) -Controller#Action | groups/saml_providers#create ---[ Route 542 ]----------------------------------------------------------------- -Prefix | group_scim_oauth -Verb | POST -URI | /groups/*group_id/-/scim_oauth(.:format) -Controller#Action | groups/scim_oauth#create ---[ Route 543 ]----------------------------------------------------------------- -Prefix | group_roadmap -Verb | GET -URI | /groups/*group_id/-/roadmap(.:format) -Controller#Action | groups/roadmap#show ---[ Route 544 ]----------------------------------------------------------------- -Prefix | group_restore -Verb | POST -URI | /groups/*group_id/-/restore(.:format) -Controller#Action | groups#restore ---[ Route 545 ]----------------------------------------------------------------- -Prefix | group_service_accounts -Verb | GET -URI | /groups/*group_id/-/service_accounts(/*vueroute)(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 546 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/service_accounts(/*vueroute)(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 547 ]----------------------------------------------------------------- -Prefix | new_group_service_account -Verb | GET -URI | /groups/*group_id/-/service_accounts(/*vueroute)/new(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 548 ]----------------------------------------------------------------- -Prefix | edit_group_service_account -Verb | GET -URI | /groups/*group_id/-/service_accounts(/*vueroute)/:id/edit(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 549 ]----------------------------------------------------------------- -Prefix | group_service_account -Verb | GET -URI | /groups/*group_id/-/service_accounts(/*vueroute)/:id(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 550 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/service_accounts(/*vueroute)/:id(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 551 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/service_accounts(/*vueroute)/:id(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 552 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/service_accounts(/*vueroute)/:id(.:format) -Controller#Action | groups/service_accounts#index ---[ Route 553 ]----------------------------------------------------------------- -Prefix | description_diff_group_work_item -Verb | GET -URI | /groups/*group_id/-/work_items/:iid/descriptions/:version_id/diff(.:format) -Controller#Action | groups/work_items#description_diff ---[ Route 554 ]----------------------------------------------------------------- -Prefix | delete_description_version_group_work_item -Verb | DELETE -URI | /groups/*group_id/-/work_items/:iid/descriptions/:version_id(.:format) -Controller#Action | groups/work_items#delete_description_version ---[ Route 555 ]----------------------------------------------------------------- -Prefix | group_discover -Verb | GET -URI | /groups/*group_id/-/discover(.:format) -Controller#Action | groups/discovers#show ---[ Route 556 ]----------------------------------------------------------------- -Prefix | dashboard_group_runners -Verb | GET -URI | /groups/*group_id/-/runners/dashboard(.:format) -Controller#Action | groups/runners#dashboard ---[ Route 557 ]----------------------------------------------------------------- -Prefix | edit_group -Verb | GET -URI | /groups/*id/-/edit(.:format) -Controller#Action | groups#edit {:format=>/(html|json|atom|ics)/} ---[ Route 558 ]----------------------------------------------------------------- -Prefix | issues_group_calendar -Verb | GET -URI | /groups/*id/-/issues.ics -Controller#Action | groups#issues_calendar ---[ Route 559 ]----------------------------------------------------------------- -Prefix | issues_group -Verb | GET -URI | /groups/*id/-/issues(.:format) -Controller#Action | groups#issues {:format=>/(html|json|atom|ics)/} ---[ Route 560 ]----------------------------------------------------------------- -Prefix | merge_requests_group -Verb | GET -URI | /groups/*id/-/merge_requests(.:format) -Controller#Action | groups#merge_requests {:format=>/(html|json|atom|ics)/} ---[ Route 561 ]----------------------------------------------------------------- -Prefix | projects_group -Verb | GET -URI | /groups/*id/-/projects(.:format) -Controller#Action | groups#projects {:format=>/(html|json|atom|ics)/} ---[ Route 562 ]----------------------------------------------------------------- -Prefix | details_group -Verb | GET -URI | /groups/*id/-/details(.:format) -Controller#Action | groups#details {:format=>/(html|json|atom|ics)/} ---[ Route 563 ]----------------------------------------------------------------- -Prefix | activity_group -Verb | GET -URI | /groups/*id/-/activity(.:format) -Controller#Action | groups#activity {:format=>/(html|json|atom|ics)/} ---[ Route 564 ]----------------------------------------------------------------- -Prefix | transfer_group -Verb | PUT -URI | /groups/*id/-/transfer(.:format) -Controller#Action | groups#transfer {:format=>/(html|json|atom|ics)/} ---[ Route 565 ]----------------------------------------------------------------- -Prefix | export_group -Verb | POST -URI | /groups/*id/-/export(.:format) -Controller#Action | groups#export {:format=>/(html|json|atom|ics)/} ---[ Route 566 ]----------------------------------------------------------------- -Prefix | download_export_group -Verb | GET -URI | /groups/*id/-/download_export(.:format) -Controller#Action | groups#download_export {:format=>/(html|json|atom|ics)/} ---[ Route 567 ]----------------------------------------------------------------- -Prefix | unfoldered_environment_names_group -Verb | GET -URI | /groups/*id/-/unfoldered_environment_names(.:format) -Controller#Action | groups#unfoldered_environment_names {:format=>/(html|json|atom|ics)/} ---[ Route 568 ]----------------------------------------------------------------- -Prefix | group_shared -Verb | GET -URI | /groups/*id/-/shared(.:format) -Controller#Action | groups#show {:format=>/(html|json|atom|ics)/} ---[ Route 569 ]----------------------------------------------------------------- -Prefix | group_inactive -Verb | GET -URI | /groups/*id/-/inactive(.:format) -Controller#Action | groups#show {:format=>/(html|json|atom|ics)/} ---[ Route 570 ]----------------------------------------------------------------- -Prefix | archived -Verb | GET -URI | /groups/*id/-/archived(.:format) -Controller#Action | redirect(301, groups/%{id}/-/inactive) {:format=>/(html|json|atom|ics)/} ---[ Route 571 ]----------------------------------------------------------------- -Prefix | group_canonical -Verb | GET -URI | /groups/*id(.:format) -Controller#Action | groups#show {:format=>/(html|json|atom|ics)/} ---[ Route 572 ]----------------------------------------------------------------- -Prefix | reset_registration_token_group_settings_ci_cd -Verb | PUT -URI | /groups/*group_id/-/settings/ci_cd/reset_registration_token(.:format) -Controller#Action | groups/settings/ci_cd#reset_registration_token ---[ Route 573 ]----------------------------------------------------------------- -Prefix | update_auto_devops_group_settings_ci_cd -Verb | PATCH -URI | /groups/*group_id/-/settings/ci_cd/update_auto_devops(.:format) -Controller#Action | groups/settings/ci_cd#update_auto_devops ---[ Route 574 ]----------------------------------------------------------------- -Prefix | create_deploy_token_group_settings_ci_cd -Verb | POST -URI | /groups/*group_id/-/settings/ci_cd/deploy_token/create(.:format) -Controller#Action | groups/settings/repository#create_deploy_token ---[ Route 575 ]----------------------------------------------------------------- -Prefix | runner_setup_scripts_group_settings_ci_cd -Verb | GET -URI | /groups/*group_id/-/settings/ci_cd/runner_setup_scripts(.:format) -Controller#Action | groups/settings/ci_cd#runner_setup_scripts ---[ Route 576 ]----------------------------------------------------------------- -Prefix | group_settings_ci_cd -Verb | GET -URI | /groups/*group_id/-/settings/ci_cd(.:format) -Controller#Action | groups/settings/ci_cd#show ---[ Route 577 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/settings/ci_cd(.:format) -Controller#Action | groups/settings/ci_cd#update ---[ Route 578 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/settings/ci_cd(.:format) -Controller#Action | groups/settings/ci_cd#update ---[ Route 579 ]----------------------------------------------------------------- -Prefix | create_deploy_token_group_settings_repository -Verb | POST -URI | /groups/*group_id/-/settings/repository/deploy_token/create(.:format) -Controller#Action | groups/settings/repository#create_deploy_token ---[ Route 580 ]----------------------------------------------------------------- -Prefix | group_settings_repository -Verb | GET -URI | /groups/*group_id/-/settings/repository(.:format) -Controller#Action | groups/settings/repository#show ---[ Route 581 ]----------------------------------------------------------------- -Prefix | revoke_group_settings_access_token -Verb | PUT -URI | /groups/*group_id/-/settings/access_tokens/:id/revoke(.:format) -Controller#Action | groups/settings/access_tokens#revoke ---[ Route 582 ]----------------------------------------------------------------- -Prefix | group_settings_access_tokens -Verb | GET -URI | /groups/*group_id/-/settings/access_tokens(.:format) -Controller#Action | groups/settings/access_tokens#index ---[ Route 583 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/settings/access_tokens(.:format) -Controller#Action | groups/settings/access_tokens#create ---[ Route 584 ]----------------------------------------------------------------- -Prefix | test_group_settings_integration -Verb | PUT -URI | /groups/*group_id/-/settings/integrations/:id/test(.:format) -Controller#Action | groups/settings/integrations#test ---[ Route 585 ]----------------------------------------------------------------- -Prefix | reset_group_settings_integration -Verb | POST -URI | /groups/*group_id/-/settings/integrations/:id/reset(.:format) -Controller#Action | groups/settings/integrations#reset ---[ Route 586 ]----------------------------------------------------------------- -Prefix | group_settings_integrations -Verb | GET -URI | /groups/*group_id/-/settings/integrations(.:format) -Controller#Action | groups/settings/integrations#index ---[ Route 587 ]----------------------------------------------------------------- -Prefix | edit_group_settings_integration -Verb | GET -URI | /groups/*group_id/-/settings/integrations/:id/edit(.:format) -Controller#Action | groups/settings/integrations#edit ---[ Route 588 ]----------------------------------------------------------------- -Prefix | group_settings_integration -Verb | PATCH -URI | /groups/*group_id/-/settings/integrations/:id(.:format) -Controller#Action | groups/settings/integrations#update ---[ Route 589 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/settings/integrations/:id(.:format) -Controller#Action | groups/settings/integrations#update ---[ Route 590 ]----------------------------------------------------------------- -Prefix | slack_auth_group_settings_slack -Verb | GET -URI | /groups/*group_id/-/settings/slack/slack_auth(.:format) -Controller#Action | groups/settings/slacks#slack_auth ---[ Route 591 ]----------------------------------------------------------------- -Prefix | group_settings_slack -Verb | DELETE -URI | /groups/*group_id/-/settings/slack(.:format) -Controller#Action | groups/settings/slacks#destroy ---[ Route 592 ]----------------------------------------------------------------- -Prefix | renew_group_settings_application -Verb | PUT -URI | /groups/*group_id/-/settings/applications/:id/renew(.:format) -Controller#Action | groups/settings/applications#renew ---[ Route 593 ]----------------------------------------------------------------- -Prefix | group_settings_applications -Verb | GET -URI | /groups/*group_id/-/settings/applications(.:format) -Controller#Action | groups/settings/applications#index ---[ Route 594 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/settings/applications(.:format) -Controller#Action | groups/settings/applications#create ---[ Route 595 ]----------------------------------------------------------------- -Prefix | new_group_settings_application -Verb | GET -URI | /groups/*group_id/-/settings/applications/new(.:format) -Controller#Action | groups/settings/applications#new ---[ Route 596 ]----------------------------------------------------------------- -Prefix | edit_group_settings_application -Verb | GET -URI | /groups/*group_id/-/settings/applications/:id/edit(.:format) -Controller#Action | groups/settings/applications#edit ---[ Route 597 ]----------------------------------------------------------------- -Prefix | group_settings_application -Verb | GET -URI | /groups/*group_id/-/settings/applications/:id(.:format) -Controller#Action | groups/settings/applications#show ---[ Route 598 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/settings/applications/:id(.:format) -Controller#Action | groups/settings/applications#update ---[ Route 599 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/settings/applications/:id(.:format) -Controller#Action | groups/settings/applications#update ---[ Route 600 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/settings/applications/:id(.:format) -Controller#Action | groups/settings/applications#destroy ---[ Route 601 ]----------------------------------------------------------------- -Prefix | group_settings_packages_and_registries -Verb | GET -URI | /groups/*group_id/-/settings/packages_and_registries(.:format) -Controller#Action | groups/settings/packages_and_registries#show ---[ Route 602 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /groups/*group_id/-/usage_quotas(.:format) -Controller#Action | groups/usage_quotas#index ---[ Route 603 ]----------------------------------------------------------------- -Prefix | group_variables -Verb | GET -URI | /groups/*group_id/-/variables(.:format) -Controller#Action | groups/variables#show ---[ Route 604 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/variables(.:format) -Controller#Action | groups/variables#update ---[ Route 605 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/variables(.:format) -Controller#Action | groups/variables#update ---[ Route 606 ]----------------------------------------------------------------- -Prefix | group_children -Verb | GET -URI | /groups/*group_id/-/children(.:format) -Controller#Action | groups/children#index ---[ Route 607 ]----------------------------------------------------------------- -Prefix | group_shared_projects -Verb | GET -URI | /groups/*group_id/-/shared_projects(.:format) -Controller#Action | groups/shared_projects#index ---[ Route 608 ]----------------------------------------------------------------- -Prefix | toggle_subscription_group_label -Verb | POST -URI | /groups/*group_id/-/labels/:id/toggle_subscription(.:format) -Controller#Action | groups/labels#toggle_subscription ---[ Route 609 ]----------------------------------------------------------------- -Prefix | group_labels -Verb | GET -URI | /groups/*group_id/-/labels(.:format) -Controller#Action | groups/labels#index ---[ Route 610 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/labels(.:format) -Controller#Action | groups/labels#create ---[ Route 611 ]----------------------------------------------------------------- -Prefix | new_group_label -Verb | GET -URI | /groups/*group_id/-/labels/new(.:format) -Controller#Action | groups/labels#new ---[ Route 612 ]----------------------------------------------------------------- -Prefix | edit_group_label -Verb | GET -URI | /groups/*group_id/-/labels/:id/edit(.:format) -Controller#Action | groups/labels#edit ---[ Route 613 ]----------------------------------------------------------------- -Prefix | group_label -Verb | PATCH -URI | /groups/*group_id/-/labels/:id(.:format) -Controller#Action | groups/labels#update ---[ Route 614 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/labels/:id(.:format) -Controller#Action | groups/labels#update ---[ Route 615 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/labels/:id(.:format) -Controller#Action | groups/labels#destroy ---[ Route 616 ]----------------------------------------------------------------- -Prefix | group_custom_emoji_index -Verb | GET -URI | /groups/*group_id/-/custom_emoji(.:format) -Controller#Action | groups/custom_emoji#index ---[ Route 617 ]----------------------------------------------------------------- -Prefix | new_group_custom_emoji -Verb | GET -URI | /groups/*group_id/-/custom_emoji/new(.:format) -Controller#Action | groups/custom_emoji#index ---[ Route 618 ]----------------------------------------------------------------- -Prefix | group_packages -Verb | GET -URI | /groups/*group_id/-/packages(.:format) -Controller#Action | groups/packages#index ---[ Route 619 ]----------------------------------------------------------------- -Prefix | group_package -Verb | GET -URI | /groups/*group_id/-/packages/:id(.:format) -Controller#Action | groups/packages#show ---[ Route 620 ]----------------------------------------------------------------- -Prefix | group_infrastructure_registry_index -Verb | GET -URI | /groups/*group_id/-/terraform_module_registry(.:format) -Controller#Action | groups/infrastructure_registry#index ---[ Route 621 ]----------------------------------------------------------------- -Prefix | group_infrastructure_registry -Verb | GET -URI | /groups/*group_id/-/infrastructure_registry(.:format) -Controller#Action | redirect(301, groups/%{group_id}/-/terraform_module_registry) ---[ Route 622 ]----------------------------------------------------------------- -Prefix | issues_group_milestone -Verb | GET -URI | /groups/*group_id/-/milestones/:id/issues(.:format) -Controller#Action | groups/milestones#issues {:id=>/[^\/]+/} ---[ Route 623 ]----------------------------------------------------------------- -Prefix | merge_requests_group_milestone -Verb | GET -URI | /groups/*group_id/-/milestones/:id/merge_requests(.:format) -Controller#Action | groups/milestones#merge_requests {:id=>/[^\/]+/} ---[ Route 624 ]----------------------------------------------------------------- -Prefix | participants_group_milestone -Verb | GET -URI | /groups/*group_id/-/milestones/:id/participants(.:format) -Controller#Action | groups/milestones#participants {:id=>/[^\/]+/} ---[ Route 625 ]----------------------------------------------------------------- -Prefix | labels_group_milestone -Verb | GET -URI | /groups/*group_id/-/milestones/:id/labels(.:format) -Controller#Action | groups/milestones#labels {:id=>/[^\/]+/} ---[ Route 626 ]----------------------------------------------------------------- -Prefix | group_milestones -Verb | GET -URI | /groups/*group_id/-/milestones(.:format) -Controller#Action | groups/milestones#index ---[ Route 627 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/milestones(.:format) -Controller#Action | groups/milestones#create ---[ Route 628 ]----------------------------------------------------------------- -Prefix | new_group_milestone -Verb | GET -URI | /groups/*group_id/-/milestones/new(.:format) -Controller#Action | groups/milestones#new ---[ Route 629 ]----------------------------------------------------------------- -Prefix | edit_group_milestone -Verb | GET -URI | /groups/*group_id/-/milestones/:id/edit(.:format) -Controller#Action | groups/milestones#edit {:id=>/[^\/]+/} ---[ Route 630 ]----------------------------------------------------------------- -Prefix | group_milestone -Verb | GET -URI | /groups/*group_id/-/milestones/:id(.:format) -Controller#Action | groups/milestones#show {:id=>/[^\/]+/} ---[ Route 631 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/milestones/:id(.:format) -Controller#Action | groups/milestones#update {:id=>/[^\/]+/} ---[ Route 632 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/milestones/:id(.:format) -Controller#Action | groups/milestones#update {:id=>/[^\/]+/} ---[ Route 633 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/milestones/:id(.:format) -Controller#Action | groups/milestones#destroy {:id=>/[^\/]+/} ---[ Route 634 ]----------------------------------------------------------------- -Prefix | group_releases -Verb | GET -URI | /groups/*group_id/-/releases(.:format) -Controller#Action | groups/releases#index ---[ Route 635 ]----------------------------------------------------------------- -Prefix | revoke_group_deploy_token -Verb | PUT -URI | /groups/*group_id/-/deploy_tokens/:id/revoke(.:format) -Controller#Action | groups/deploy_tokens#revoke {:id=>/\d+/} ---[ Route 636 ]----------------------------------------------------------------- -Prefix | group_avatar -Verb | DELETE -URI | /groups/*group_id/-/avatar(.:format) -Controller#Action | groups/avatars#destroy ---[ Route 637 ]----------------------------------------------------------------- -Prefix | group_import -Verb | GET -URI | /groups/*group_id/-/import(.:format) -Controller#Action | groups/imports#show ---[ Route 638 ]----------------------------------------------------------------- -Prefix | connect_group_clusters -Verb | GET -URI | /groups/*group_id/-/clusters/connect(.:format) -Controller#Action | groups/clusters#connect ---[ Route 639 ]----------------------------------------------------------------- -Prefix | new_cluster_docs_group_clusters -Verb | GET -URI | /groups/*group_id/-/clusters/new_cluster_docs(.:format) -Controller#Action | groups/clusters#new_cluster_docs ---[ Route 640 ]----------------------------------------------------------------- -Prefix | create_user_group_clusters -Verb | POST -URI | /groups/*group_id/-/clusters/create_user(.:format) -Controller#Action | groups/clusters#create_user ---[ Route 641 ]----------------------------------------------------------------- -Prefix | create_or_update_group_cluster_integration -Verb | POST -URI | /groups/*group_id/-/clusters/:cluster_id/integration/create_or_update(.:format) -Controller#Action | groups/clusters/integrations#create_or_update ---[ Route 642 ]----------------------------------------------------------------- -Prefix | metrics_group_cluster -Verb | GET -URI | /groups/*group_id/-/clusters/:id/metrics(.:format) -Controller#Action | groups/clusters#metrics ---[ Route 643 ]----------------------------------------------------------------- -Prefix | environments_group_cluster -Verb | GET -URI | /groups/*group_id/-/clusters/:id/environments(.:format) -Controller#Action | groups/clusters#environments ---[ Route 644 ]----------------------------------------------------------------- -Prefix | metrics_dashboard_group_cluster -Verb | GET -URI | /groups/*group_id/-/clusters/:id/metrics_dashboard(.:format) -Controller#Action | groups/clusters#metrics_dashboard ---[ Route 645 ]----------------------------------------------------------------- -Prefix | cluster_status_group_cluster -Verb | GET -URI | /groups/*group_id/-/clusters/:id/cluster_status(.:format) -Controller#Action | groups/clusters#cluster_status ---[ Route 646 ]----------------------------------------------------------------- -Prefix | clear_cache_group_cluster -Verb | DELETE -URI | /groups/*group_id/-/clusters/:id/clear_cache(.:format) -Controller#Action | groups/clusters#clear_cache ---[ Route 647 ]----------------------------------------------------------------- -Prefix | group_clusters -Verb | GET -URI | /groups/*group_id/-/clusters(.:format) -Controller#Action | groups/clusters#index ---[ Route 648 ]----------------------------------------------------------------- -Prefix | group_cluster -Verb | GET -URI | /groups/*group_id/-/clusters/:id(.:format) -Controller#Action | groups/clusters#show ---[ Route 649 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/clusters/:id(.:format) -Controller#Action | groups/clusters#update ---[ Route 650 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/clusters/:id(.:format) -Controller#Action | groups/clusters#update ---[ Route 651 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/clusters/:id(.:format) -Controller#Action | groups/clusters#destroy ---[ Route 652 ]----------------------------------------------------------------- -Prefix | resend_invite_group_group_member -Verb | POST -URI | /groups/*group_id/-/group_members/:id/resend_invite(.:format) -Controller#Action | groups/group_members#resend_invite ---[ Route 653 ]----------------------------------------------------------------- -Prefix | bulk_reassignment_file_group_group_members -Verb | GET -URI | /groups/*group_id/-/group_members/bulk_reassignment_file(.:format) -Controller#Action | groups/group_members#bulk_reassignment_file ---[ Route 654 ]----------------------------------------------------------------- -Prefix | leave_group_group_members -Verb | DELETE -URI | /groups/*group_id/-/group_members/leave(.:format) -Controller#Action | groups/group_members#leave ---[ Route 655 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /groups/*group_id/-/group_members/request_access(.:format) -Controller#Action | groups/group_members#request_access ---[ Route 656 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/group_members/request_access(.:format) -Controller#Action | groups/group_members#request_access ---[ Route 657 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /groups/*group_id/-/group_members/:id/approve_access_request(.:format) -Controller#Action | groups/group_members#approve_access_request ---[ Route 658 ]----------------------------------------------------------------- -Prefix | group_group_members -Verb | GET -URI | /groups/*group_id/-/group_members(.:format) -Controller#Action | groups/group_members#index ---[ Route 659 ]----------------------------------------------------------------- -Prefix | group_group_member -Verb | PATCH -URI | /groups/*group_id/-/group_members/:id(.:format) -Controller#Action | groups/group_members#update ---[ Route 660 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/group_members/:id(.:format) -Controller#Action | groups/group_members#update ---[ Route 661 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/group_members/:id(.:format) -Controller#Action | groups/group_members#destroy ---[ Route 662 ]----------------------------------------------------------------- -Prefix | group_group_link -Verb | PATCH -URI | /groups/*group_id/-/group_links/:id(.:format) -Controller#Action | groups/group_links#update {:id=>/\d+|:id/} ---[ Route 663 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/group_links/:id(.:format) -Controller#Action | groups/group_links#update {:id=>/\d+|:id/} ---[ Route 664 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/group_links/:id(.:format) -Controller#Action | groups/group_links#destroy {:id=>/\d+|:id/} ---[ Route 665 ]----------------------------------------------------------------- -Prefix | show_group_uploads -Verb | GET -URI | /groups/*group_id/-/uploads/:secret/:filename -Controller#Action | groups/uploads#show {:format=>nil, :group_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[^\/]+/} ---[ Route 666 ]----------------------------------------------------------------- -Prefix | authorize_group_uploads -Verb | POST -URI | /groups/*group_id/-/uploads/authorize(.:format) -Controller#Action | groups/uploads#authorize ---[ Route 667 ]----------------------------------------------------------------- -Prefix | group_uploads -Verb | POST -URI | /groups/*group_id/-/uploads(.:format) -Controller#Action | groups/uploads#create ---[ Route 668 ]----------------------------------------------------------------- -Prefix | group_boards -Verb | GET -URI | /groups/*group_id/-/boards(.:format) -Controller#Action | groups/boards#index ---[ Route 669 ]----------------------------------------------------------------- -Prefix | group_board -Verb | GET -URI | /groups/*group_id/-/boards/:id(.:format) -Controller#Action | groups/boards#show {:id=>/\d+/} ---[ Route 670 ]----------------------------------------------------------------- -Prefix | register_group_runner -Verb | GET -URI | /groups/*group_id/-/runners/:id/register(.:format) -Controller#Action | groups/runners#register ---[ Route 671 ]----------------------------------------------------------------- -Prefix | resume_group_runner -Verb | POST -URI | /groups/*group_id/-/runners/:id/resume(.:format) -Controller#Action | groups/runners#resume ---[ Route 672 ]----------------------------------------------------------------- -Prefix | pause_group_runner -Verb | POST -URI | /groups/*group_id/-/runners/:id/pause(.:format) -Controller#Action | groups/runners#pause ---[ Route 673 ]----------------------------------------------------------------- -Prefix | group_runners -Verb | GET -URI | /groups/*group_id/-/runners(.:format) -Controller#Action | groups/runners#index ---[ Route 674 ]----------------------------------------------------------------- -Prefix | new_group_runner -Verb | GET -URI | /groups/*group_id/-/runners/new(.:format) -Controller#Action | groups/runners#new ---[ Route 675 ]----------------------------------------------------------------- -Prefix | edit_group_runner -Verb | GET -URI | /groups/*group_id/-/runners/:id/edit(.:format) -Controller#Action | groups/runners#edit ---[ Route 676 ]----------------------------------------------------------------- -Prefix | group_runner -Verb | GET -URI | /groups/*group_id/-/runners/:id(.:format) -Controller#Action | groups/runners#show ---[ Route 677 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/runners/:id(.:format) -Controller#Action | groups/runners#update ---[ Route 678 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/runners/:id(.:format) -Controller#Action | groups/runners#update ---[ Route 679 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /groups/*group_id/-/runners/:id(.:format) -Controller#Action | groups/runners#destroy ---[ Route 680 ]----------------------------------------------------------------- -Prefix | group_container_registries -Verb | GET -URI | /groups/*group_id/-/container_registries(.:format) -Controller#Action | groups/registry/repositories#index ---[ Route 681 ]----------------------------------------------------------------- -Prefix | group_container_registry -Verb | GET -URI | /groups/*group_id/-/container_registries/:id(.:format) -Controller#Action | groups/registry/repositories#show ---[ Route 682 ]----------------------------------------------------------------- -Prefix | group_dependency_proxy -Verb | GET -URI | /groups/*group_id/-/dependency_proxy(.:format) -Controller#Action | groups/dependency_proxies#show ---[ Route 683 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /groups/*group_id/-/dependency_proxy(.:format) -Controller#Action | groups/dependency_proxies#update ---[ Route 684 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /groups/*group_id/-/dependency_proxy(.:format) -Controller#Action | groups/dependency_proxies#update ---[ Route 685 ]----------------------------------------------------------------- -Prefix | group_harbor_repository_artifact_tags -Verb | GET -URI | /groups/*group_id/-/harbor/repositories/:repository_id/artifacts/:artifact_id/tags(.:format) -Controller#Action | groups/harbor/tags#index {:repository_id=>/[a-zA-Z.\/:0-9_\-]+/, :artifact_id=>/[a-zA-Z.\/:0-9_\-]+/} ---[ Route 686 ]----------------------------------------------------------------- -Prefix | group_harbor_repository_artifacts -Verb | GET -URI | /groups/*group_id/-/harbor/repositories/:repository_id/artifacts(.:format) -Controller#Action | groups/harbor/artifacts#index {:repository_id=>/[a-zA-Z.\/:0-9_\-]+/} ---[ Route 687 ]----------------------------------------------------------------- -Prefix | group_harbor_repositories -Verb | GET -URI | /groups/*group_id/-/harbor/repositories(.:format) -Controller#Action | groups/harbor/repositories#index ---[ Route 688 ]----------------------------------------------------------------- -Prefix | group_harbor_repository -Verb | GET -URI | /groups/*group_id/-/harbor/repositories/:id(.:format) -Controller#Action | groups/harbor/repositories#show {:id=>/[a-zA-Z.\/:0-9_\-]+/} ---[ Route 689 ]----------------------------------------------------------------- -Prefix | members_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/members(.:format) -Controller#Action | groups/autocomplete_sources#members ---[ Route 690 ]----------------------------------------------------------------- -Prefix | issues_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/issues(.:format) -Controller#Action | groups/autocomplete_sources#issues ---[ Route 691 ]----------------------------------------------------------------- -Prefix | merge_requests_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/merge_requests(.:format) -Controller#Action | groups/autocomplete_sources#merge_requests ---[ Route 692 ]----------------------------------------------------------------- -Prefix | labels_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/labels(.:format) -Controller#Action | groups/autocomplete_sources#labels ---[ Route 693 ]----------------------------------------------------------------- -Prefix | commands_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/commands(.:format) -Controller#Action | groups/autocomplete_sources#commands ---[ Route 694 ]----------------------------------------------------------------- -Prefix | milestones_group_autocomplete_sources -Verb | GET -URI | /groups/*group_id/-/autocomplete_sources/milestones(.:format) -Controller#Action | groups/autocomplete_sources#milestones ---[ Route 695 ]----------------------------------------------------------------- -Prefix | group_crm_contacts -Verb | GET -URI | /groups/*group_id/-/crm/contacts(.:format) -Controller#Action | groups/crm/contacts#index ---[ Route 696 ]----------------------------------------------------------------- -Prefix | new_group_crm_contact -Verb | GET -URI | /groups/*group_id/-/crm/contacts/new(.:format) -Controller#Action | groups/crm/contacts#new ---[ Route 697 ]----------------------------------------------------------------- -Prefix | edit_group_crm_contact -Verb | GET -URI | /groups/*group_id/-/crm/contacts/:id/edit(.:format) -Controller#Action | groups/crm/contacts#edit ---[ Route 698 ]----------------------------------------------------------------- -Prefix | group_crm_organizations -Verb | GET -URI | /groups/*group_id/-/crm/organizations(.:format) -Controller#Action | groups/crm/organizations#index ---[ Route 699 ]----------------------------------------------------------------- -Prefix | new_group_crm_organization -Verb | GET -URI | /groups/*group_id/-/crm/organizations/new(.:format) -Controller#Action | groups/crm/organizations#new ---[ Route 700 ]----------------------------------------------------------------- -Prefix | edit_group_crm_organization -Verb | GET -URI | /groups/*group_id/-/crm/organizations/:id/edit(.:format) -Controller#Action | groups/crm/organizations#edit ---[ Route 701 ]----------------------------------------------------------------- -Prefix | group_achievements -Verb | GET -URI | /groups/*group_id/-/achievements(.:format) -Controller#Action | groups/achievements#index ---[ Route 702 ]----------------------------------------------------------------- -Prefix | new_group_achievement -Verb | GET -URI | /groups/*group_id/-/achievements/new(.:format) -Controller#Action | groups/achievements#new ---[ Route 703 ]----------------------------------------------------------------- -Prefix | edit_group_achievement -Verb | GET -URI | /groups/*group_id/-/achievements/:id/edit(.:format) -Controller#Action | groups/achievements#edit ---[ Route 704 ]----------------------------------------------------------------- -Prefix | group_work_items -Verb | GET -URI | /groups/*group_id/-/work_items(.:format) -Controller#Action | groups/work_items#index ---[ Route 705 ]----------------------------------------------------------------- -Prefix | group_work_item -Verb | GET -URI | /groups/*group_id/-/work_items/:iid(.:format) -Controller#Action | groups/work_items#show ---[ Route 706 ]----------------------------------------------------------------- -Prefix | group_preview_markdown -Verb | POST -URI | /groups/*group_id/-/preview_markdown(.:format) -Controller#Action | groups#preview_markdown ---[ Route 707 ]----------------------------------------------------------------- -Prefix | group -Verb | GET -URI | /*id(.:format) -Controller#Action | groups#show {:format=>/(html|json|atom)/} ---[ Route 708 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /*id(.:format) -Controller#Action | groups#update {:format=>/(html|json|atom)/} ---[ Route 709 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /*id(.:format) -Controller#Action | groups#update {:format=>/(html|json|atom)/} ---[ Route 710 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /*id(.:format) -Controller#Action | groups#destroy {:format=>/(html|json|atom)/} ---[ Route 711 ]----------------------------------------------------------------- -Prefix | v2 -Verb | GET -URI | /v2 -Controller#Action | groups/dependency_proxy_auth#authenticate ---[ Route 712 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /v2/*group_id/dependency_proxy/containers/*image/manifests/*tag -Controller#Action | groups/dependency_proxy_for_containers#manifest {:image=>/([\w\.-]+\/){0,4}[\w\.-]+/} ---[ Route 713 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /v2/*group_id/dependency_proxy/containers/*image/blobs/:sha -Controller#Action | groups/dependency_proxy_for_containers#blob {:image=>/([\w\.-]+\/){0,4}[\w\.-]+/, :sha=>/[\w+.-]+:?\w+/} ---[ Route 714 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /v2/*group_id/dependency_proxy/containers/*image/blobs/:sha/upload/authorize -Controller#Action | groups/dependency_proxy_for_containers#authorize_upload_blob {:image=>/([\w\.-]+\/){0,4}[\w\.-]+/, :sha=>/[\w+.-]+:?\w+/} ---[ Route 715 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /v2/*group_id/dependency_proxy/containers/*image/blobs/:sha/upload -Controller#Action | groups/dependency_proxy_for_containers#upload_blob {:image=>/([\w\.-]+\/){0,4}[\w\.-]+/, :sha=>/[\w+.-]+:?\w+/} ---[ Route 716 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /v2/*group_id/dependency_proxy/containers/*image/manifests/*tag/upload/authorize -Controller#Action | groups/dependency_proxy_for_containers#authorize_upload_manifest {:image=>/([\w\.-]+\/){0,4}[\w\.-]+/} ---[ Route 717 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /v2/*group_id/dependency_proxy/containers/*image/manifests/*tag/upload -Controller#Action | groups/dependency_proxy_for_containers#upload_manifest {:image=>/([\w\.-]+\/){0,4}[\w\.-]+/} ---[ Route 718 ]----------------------------------------------------------------- -Prefix | projects -Verb | GET -URI | /projects(.:format) -Controller#Action | projects#index ---[ Route 719 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /projects(.:format) -Controller#Action | projects#create ---[ Route 720 ]----------------------------------------------------------------- -Prefix | new_project -Verb | GET -URI | /projects/new(.:format) -Controller#Action | projects#new ---[ Route 721 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /projects/:id(.:format) -Controller#Action | projects/redirect#redirect_from_id ---[ Route 722 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /-/p/:id(.:format) -Controller#Action | projects/redirect#redirect_from_id ---[ Route 723 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /*repository_path/info/refs -Controller#Action | repositories/git_http#info_refs {:repository_path=>/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[a-f0-9]{64}/} ---[ Route 742 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /*repository_path/gitlab-lfs/objects/*oid/*size/authorize -Controller#Action | repositories/lfs_storage#upload_authorize {:repository_path=>/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[a-f0-9]{64}/, :size=>/[0-9]+/} ---[ Route 743 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /*repository_path/gitlab-lfs/objects/*oid/*size -Controller#Action | repositories/lfs_storage#upload_finalize {:repository_path=>/(?-mix:((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[a-f0-9]{64}/, :size=>/[0-9]+/} ---[ Route 744 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /*repository_path -Controller#Action | redirect(301) {:repository_path=>/(?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/((?-mix:(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(? ---[ Route 749 ]----------------------------------------------------------------- -Prefix | api_api -Verb | -URI | / -Controller#Action | API::API ---[ Route 750 ]----------------------------------------------------------------- -Prefix | outbox_namespace_project_releases -Verb | GET -URI | /*namespace_id/:project_id/-/releases/outbox(.:format) -Controller#Action | activity_pub/projects/releases#outbox {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/issuable_metric_image/, :mounted_as=>/file/, :filename=>/[^\/]+/} ---[ Route 821 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /uploads/-/system/:model/:mounted_as/:id/:filename(.:format) -Controller#Action | uploads#show {:model=>/note|user|group|project|projects\/topic|achievements\/achievement|organizations\/organization_detail/, :mounted_as=>/avatar|attachment/, :filename=>/[^\/]+/} ---[ Route 822 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /uploads/-/system/:model/:id/:secret/:filename(.:format) -Controller#Action | uploads#show {:model=>/personal_snippet|user|abuse_report/, :id=>/\d+/, :filename=>/[^\/]+/} ---[ Route 823 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /uploads/-/system/temp/:secret/:filename(.:format) -Controller#Action | uploads#show {:filename=>/[^\/]+/} ---[ Route 824 ]----------------------------------------------------------------- -Prefix | appearance_upload -Verb | GET -URI | /uploads/-/system/:model/:mounted_as/:id/:filename(.:format) -Controller#Action | uploads#show {:model=>/appearance/, :mounted_as=>/logo|header_logo|pwa_icon|favicon/, :filename=>/.+/} ---[ Route 825 ]----------------------------------------------------------------- -Prefix | upload -Verb | POST -URI | /uploads/:model(.:format) -Controller#Action | uploads#create {:model=>/personal_snippet|user|abuse_report/} ---[ Route 826 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /uploads/:model/authorize(.:format) -Controller#Action | uploads#authorize {:model=>/personal_snippet|user|abuse_report/} ---[ Route 827 ]----------------------------------------------------------------- -Prefix | alert_metric_image_upload -Verb | GET -URI | /uploads/-/system/:model/:mounted_as/:id/:filename(.:format) -Controller#Action | uploads#show {:model=>/alert_management_metric_image/, :mounted_as=>/file/, :filename=>/[^\/]+/} ---[ Route 828 ]----------------------------------------------------------------- -Prefix | abuse_report_screenshot -Verb | GET -URI | /uploads/-/system/:model/:mounted_as/:id/:filename(.:format) -Controller#Action | uploads#show {:model=>/abuse_report/, :mounted_as=>/screenshot/, :filename=>/[^\/]+/} ---[ Route 829 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /files/note/:id/:filename(.:format) -Controller#Action | redirect(301, uploads/note/attachment/%{id}/%{filename}) {:filename=>/[^\/]+/} ---[ Route 830 ]----------------------------------------------------------------- -Prefix | explore_dependencies -Verb | GET -URI | /explore/dependencies(.:format) -Controller#Action | explore/dependencies#index ---[ Route 831 ]----------------------------------------------------------------- -Prefix | trending_explore_projects -Verb | GET -URI | /explore/projects/trending(.:format) -Controller#Action | explore/projects#trending ---[ Route 832 ]----------------------------------------------------------------- -Prefix | starred_explore_projects -Verb | GET -URI | /explore/projects/starred(.:format) -Controller#Action | explore/projects#starred ---[ Route 833 ]----------------------------------------------------------------- -Prefix | topics_explore_projects -Verb | GET -URI | /explore/projects/topics(.:format) -Controller#Action | explore/projects#topics ---[ Route 834 ]----------------------------------------------------------------- -Prefix | topic_explore_projects -Verb | GET -URI | /explore/projects/topics/:topic_name(.:format) -Controller#Action | explore/projects#topic {:format=>/(html|atom)/, :topic_name=>/.+?/} ---[ Route 835 ]----------------------------------------------------------------- -Prefix | explore_projects -Verb | GET -URI | /explore/projects(.:format) -Controller#Action | explore/projects#index ---[ Route 836 ]----------------------------------------------------------------- -Prefix | explore_groups -Verb | GET -URI | /explore/groups(.:format) -Controller#Action | explore/groups#index ---[ Route 837 ]----------------------------------------------------------------- -Prefix | explore_catalog_index -Verb | GET -URI | /explore/catalog(.:format) -Controller#Action | explore/catalog#index ---[ Route 838 ]----------------------------------------------------------------- -Prefix | explore_catalog -Verb | GET -URI | /explore/catalog/*full_path(.:format) -Controller#Action | explore/catalog#show ---[ Route 839 ]----------------------------------------------------------------- -Prefix | explore_snippets -Verb | GET -URI | /explore/snippets(.:format) -Controller#Action | explore/snippets#index ---[ Route 840 ]----------------------------------------------------------------- -Prefix | explore_root -Verb | GET -URI | /explore(.:format) -Controller#Action | explore/projects#index ---[ Route 841 ]----------------------------------------------------------------- -Prefix | public -Verb | GET -URI | /public(.:format) -Controller#Action | explore/projects#index ---[ Route 842 ]----------------------------------------------------------------- -Prefix | public_projects -Verb | GET -URI | /public/projects(.:format) -Controller#Action | explore/projects#index ---[ Route 843 ]----------------------------------------------------------------- -Prefix | identity_verification_exemption_admin_user -Verb | POST -URI | /admin/users/:id/identity_verification_exemption(.:format) -Controller#Action | admin/users#identity_verification_exemption {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 844 ]----------------------------------------------------------------- -Prefix | destroy_identity_verification_exemption_admin_user -Verb | DELETE -URI | /admin/users/:id/destroy_identity_verification_exemption(.:format) -Controller#Action | admin/users#destroy_identity_verification_exemption {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 845 ]----------------------------------------------------------------- -Prefix | reset_runners_minutes_admin_user -Verb | POST -URI | /admin/users/:id/reset_runners_minutes(.:format) -Controller#Action | admin/users#reset_runners_minutes {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 846 ]----------------------------------------------------------------- -Prefix | card_match_admin_user -Verb | GET -URI | /admin/users/:id/card_match(.:format) -Controller#Action | admin/users#card_match {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 847 ]----------------------------------------------------------------- -Prefix | phone_match_admin_user -Verb | GET -URI | /admin/users/:id/phone_match(.:format) -Controller#Action | admin/users#phone_match {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 848 ]----------------------------------------------------------------- -Prefix | admin_group_reset_runners_minutes -Verb | POST -URI | /admin/groups/*id/reset_runners_minutes(.:format) -Controller#Action | admin/groups#reset_runners_minutes {:format=>/(html|json|atom)/} ---[ Route 849 ]----------------------------------------------------------------- -Prefix | admin_push_rule -Verb | GET -URI | /admin/push_rule(.:format) -Controller#Action | admin/push_rules#show ---[ Route 850 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /admin/push_rule(.:format) -Controller#Action | admin/push_rules#update ---[ Route 851 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/push_rule(.:format) -Controller#Action | admin/push_rules#update ---[ Route 852 ]----------------------------------------------------------------- -Prefix | admin_email -Verb | GET -URI | /admin/email(.:format) -Controller#Action | admin/emails#show ---[ Route 853 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/email(.:format) -Controller#Action | admin/emails#create ---[ Route 854 ]----------------------------------------------------------------- -Prefix | admin_audit_logs -Verb | GET -URI | /admin/audit_logs(.:format) -Controller#Action | admin/audit_logs#index ---[ Route 855 ]----------------------------------------------------------------- -Prefix | admin_audit_log_reports -Verb | GET -URI | /admin/audit_log_reports(.:format) -Controller#Action | admin/audit_log_reports#index {:format=>:csv} ---[ Route 856 ]----------------------------------------------------------------- -Prefix | admin_credential_resource_revoke -Verb | PUT -URI | /admin/credentials/:credential_id/resources/:resource_id/revoke(.:format) -Controller#Action | admin/credentials#revoke ---[ Route 857 ]----------------------------------------------------------------- -Prefix | revoke_admin_credential -Verb | PUT -URI | /admin/credentials/:id/revoke(.:format) -Controller#Action | admin/credentials#revoke ---[ Route 858 ]----------------------------------------------------------------- -Prefix | admin_credentials -Verb | GET -URI | /admin/credentials(.:format) -Controller#Action | admin/credentials#index ---[ Route 859 ]----------------------------------------------------------------- -Prefix | admin_credential -Verb | DELETE -URI | /admin/credentials/:id(.:format) -Controller#Action | admin/credentials#destroy ---[ Route 860 ]----------------------------------------------------------------- -Prefix | admin_user_permission_exports -Verb | GET -URI | /admin/user_permission_exports(.:format) -Controller#Action | admin/user_permission_exports#index ---[ Route 861 ]----------------------------------------------------------------- -Prefix | download_admin_license -Verb | GET -URI | /admin/license/download(.:format) -Controller#Action | admin/licenses#download ---[ Route 862 ]----------------------------------------------------------------- -Prefix | sync_seat_link_admin_license -Verb | POST -URI | /admin/license/sync_seat_link(.:format) -Controller#Action | admin/licenses#sync_seat_link ---[ Route 863 ]----------------------------------------------------------------- -Prefix | admin_license_usage_export -Verb | GET -URI | /admin/license/usage_export(.:format) -Controller#Action | admin/licenses/usage_exports#show ---[ Route 864 ]----------------------------------------------------------------- -Prefix | admin_license -Verb | GET -URI | /admin/license(.:format) -Controller#Action | admin/licenses#show ---[ Route 865 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/license(.:format) -Controller#Action | admin/licenses#destroy ---[ Route 866 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/license(.:format) -Controller#Action | admin/licenses#create ---[ Route 867 ]----------------------------------------------------------------- -Prefix | admin_subscription -Verb | GET -URI | /admin/subscription(.:format) -Controller#Action | admin/subscriptions#show ---[ Route 868 ]----------------------------------------------------------------- -Prefix | admin_role_promotion_requests -Verb | GET -URI | /admin/role_promotion_requests(.:format) -Controller#Action | admin/role_promotion_requests#index ---[ Route 869 ]----------------------------------------------------------------- -Prefix | admin_gitlab_duo -Verb | GET -URI | /admin/gitlab_duo(.:format) -Controller#Action | admin/gitlab_duo#show ---[ Route 870 ]----------------------------------------------------------------- -Prefix | admin_gitlab_duo_seat_utilization_index -Verb | GET -URI | /admin/gitlab_duo/seat_utilization(.:format) -Controller#Action | admin/gitlab_duo/seat_utilization#index ---[ Route 871 ]----------------------------------------------------------------- -Prefix | admin_gitlab_duo_configuration_index -Verb | GET -URI | /admin/gitlab_duo/configuration(.:format) -Controller#Action | admin/gitlab_duo/configuration#index ---[ Route 872 ]----------------------------------------------------------------- -Prefix | admin_code_suggestions -Verb | GET -URI | /admin/code_suggestions(.:format) -Controller#Action | redirect(301, admin/gitlab_duo/seat_utilization) ---[ Route 873 ]----------------------------------------------------------------- -Prefix | admin_ai_terms_and_conditions -Verb | GET -URI | /admin/ai/self_hosted_models(/*vueroute)/terms_and_conditions(.:format) -Controller#Action | admin/ai/terms_and_conditions#index ---[ Route 874 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/ai/self_hosted_models(/*vueroute)/terms_and_conditions(.:format) -Controller#Action | admin/ai/terms_and_conditions#create ---[ Route 875 ]----------------------------------------------------------------- -Prefix | admin_ai_self_hosted_models -Verb | GET -URI | /admin/ai/self_hosted_models(/*vueroute)(.:format) -Controller#Action | admin/ai/self_hosted_models#index ---[ Route 876 ]----------------------------------------------------------------- -Prefix | seat_link_payload_admin_application_settings -Verb | GET -URI | /admin/application_settings/seat_link_payload(.:format) -Controller#Action | admin/application_settings#seat_link_payload ---[ Route 877 ]----------------------------------------------------------------- -Prefix | templates_admin_application_settings -Verb | GET|PATCH -URI | /admin/application_settings/templates(.:format) -Controller#Action | admin/application_settings#templates ---[ Route 878 ]----------------------------------------------------------------- -Prefix | advanced_search_admin_application_settings -Verb | GET|PATCH -URI | /admin/application_settings/advanced_search(.:format) -Controller#Action | admin/application_settings#advanced_search ---[ Route 879 ]----------------------------------------------------------------- -Prefix | security_and_compliance_admin_application_settings -Verb | GET|PATCH -URI | /admin/application_settings/security_and_compliance(.:format) -Controller#Action | admin/application_settings#security_and_compliance ---[ Route 880 ]----------------------------------------------------------------- -Prefix | namespace_storage_admin_application_settings -Verb | GET|PATCH -URI | /admin/application_settings/namespace_storage(.:format) -Controller#Action | admin/application_settings#namespace_storage ---[ Route 881 ]----------------------------------------------------------------- -Prefix | analytics_admin_application_settings -Verb | GET|PATCH -URI | /admin/application_settings/analytics(.:format) -Controller#Action | admin/application_settings#analytics ---[ Route 882 ]----------------------------------------------------------------- -Prefix | geo_admin_application_settings -Verb | GET -URI | /admin/application_settings/geo(.:format) -Controller#Action | admin/geo/settings#show ---[ Route 883 ]----------------------------------------------------------------- -Prefix | update_microsoft_application_admin_application_settings -Verb | PUT -URI | /admin/application_settings/update_microsoft_application(.:format) -Controller#Action | admin/application_settings#update_microsoft_application ---[ Route 884 ]----------------------------------------------------------------- -Prefix | admin_application_settings_scim_oauth -Verb | POST -URI | /admin/application_settings/scim_oauth(.:format) -Controller#Action | admin/application_settings/scim_oauth#create ---[ Route 885 ]----------------------------------------------------------------- -Prefix | admin_application_settings_roles_and_permissions -Verb | GET -URI | /admin/application_settings/roles_and_permissions(.:format) -Controller#Action | admin/application_settings/roles_and_permissions#index ---[ Route 886 ]----------------------------------------------------------------- -Prefix | new_admin_application_settings_roles_and_permission -Verb | GET -URI | /admin/application_settings/roles_and_permissions/new(.:format) -Controller#Action | admin/application_settings/roles_and_permissions#new ---[ Route 887 ]----------------------------------------------------------------- -Prefix | edit_admin_application_settings_roles_and_permission -Verb | GET -URI | /admin/application_settings/roles_and_permissions/:id/edit(.:format) -Controller#Action | admin/application_settings/roles_and_permissions#edit ---[ Route 888 ]----------------------------------------------------------------- -Prefix | admin_application_settings_roles_and_permission -Verb | GET -URI | /admin/application_settings/roles_and_permissions/:id(.:format) -Controller#Action | admin/application_settings/roles_and_permissions#show ---[ Route 889 ]----------------------------------------------------------------- -Prefix | admin_geo -Verb | GET -URI | /admin/geo(.:format) -Controller#Action | admin/geo/nodes#index ---[ Route 890 ]----------------------------------------------------------------- -Prefix | admin_geo_node -Verb | GET -URI | /admin/geo/sites/:id/replication(.:format) -Controller#Action | admin/geo/nodes#index ---[ Route 891 ]----------------------------------------------------------------- -Prefix | site_replicables_admin_geo_node -Verb | GET -URI | /admin/geo/sites/:id/replication/:replicable_name_plural(.:format) -Controller#Action | admin/geo/replicables#index ---[ Route 892 ]----------------------------------------------------------------- -Prefix | admin_geo_nodes -Verb | GET -URI | /admin/geo/sites(.:format) -Controller#Action | admin/geo/nodes#index ---[ Route 893 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/geo/sites(.:format) -Controller#Action | admin/geo/nodes#create ---[ Route 894 ]----------------------------------------------------------------- -Prefix | new_admin_geo_node -Verb | GET -URI | /admin/geo/sites/new(.:format) -Controller#Action | admin/geo/nodes#new ---[ Route 895 ]----------------------------------------------------------------- -Prefix | edit_admin_geo_node -Verb | GET -URI | /admin/geo/sites/:id/edit(.:format) -Controller#Action | admin/geo/nodes#edit ---[ Route 896 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /admin/geo/sites/:id(.:format) -Controller#Action | admin/geo/nodes#update ---[ Route 897 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/geo/sites/:id(.:format) -Controller#Action | admin/geo/nodes#update ---[ Route 898 ]----------------------------------------------------------------- -Prefix | -Verb | GET -URI | /admin/geo/replication(.:format) -Controller#Action | redirect(301, path: admin/geo/sites) ---[ Route 899 ]----------------------------------------------------------------- -Prefix | admin_geo_replicables -Verb | GET -URI | /admin/geo/replication/:replicable_name_plural(.:format) -Controller#Action | admin/geo/replicables#index ---[ Route 900 ]----------------------------------------------------------------- -Prefix | admin_geo_settings -Verb | GET -URI | /admin/geo/settings(.:format) -Controller#Action | admin/geo/settings#show ---[ Route 901 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /admin/geo/settings(.:format) -Controller#Action | admin/geo/settings#update ---[ Route 902 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/geo/settings(.:format) -Controller#Action | admin/geo/settings#update ---[ Route 903 ]----------------------------------------------------------------- -Prefix | admin_elasticsearch_enqueue_index -Verb | POST -URI | /admin/elasticsearch/enqueue_index(.:format) -Controller#Action | admin/elasticsearch#enqueue_index ---[ Route 904 ]----------------------------------------------------------------- -Prefix | admin_elasticsearch_trigger_reindexing -Verb | POST -URI | /admin/elasticsearch/trigger_reindexing(.:format) -Controller#Action | admin/elasticsearch#trigger_reindexing ---[ Route 905 ]----------------------------------------------------------------- -Prefix | admin_elasticsearch_cancel_index_deletion -Verb | POST -URI | /admin/elasticsearch/cancel_index_deletion(.:format) -Controller#Action | admin/elasticsearch#cancel_index_deletion ---[ Route 906 ]----------------------------------------------------------------- -Prefix | admin_elasticsearch_retry_migration -Verb | POST -URI | /admin/elasticsearch/retry_migration(.:format) -Controller#Action | admin/elasticsearch#retry_migration ---[ Route 907 ]----------------------------------------------------------------- -Prefix | admin_namespace_limits -Verb | GET -URI | /admin/namespace_limits(.:format) -Controller#Action | admin/namespace_limits#index ---[ Route 908 ]----------------------------------------------------------------- -Prefix | admin_namespace_limits_export_usage -Verb | GET -URI | /admin/namespace_limits/export_usage(.:format) -Controller#Action | admin/namespace_limits#export_usage ---[ Route 909 ]----------------------------------------------------------------- -Prefix | dashboard_admin_runners -Verb | GET -URI | /admin/runners/dashboard(.:format) -Controller#Action | admin/runners#dashboard ---[ Route 910 ]----------------------------------------------------------------- -Prefix | admin_user_key -Verb | GET -URI | /admin/users/:user_id/keys/:id(.:format) -Controller#Action | admin/keys#show {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 911 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/users/:user_id/keys/:id(.:format) -Controller#Action | admin/keys#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 912 ]----------------------------------------------------------------- -Prefix | admin_user_identities -Verb | GET -URI | /admin/users/:user_id/identities(.:format) -Controller#Action | admin/identities#index {:user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 913 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/users/:user_id/identities(.:format) -Controller#Action | admin/identities#create {:user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 914 ]----------------------------------------------------------------- -Prefix | new_admin_user_identity -Verb | GET -URI | /admin/users/:user_id/identities/new(.:format) -Controller#Action | admin/identities#new {:user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 915 ]----------------------------------------------------------------- -Prefix | edit_admin_user_identity -Verb | GET -URI | /admin/users/:user_id/identities/:id/edit(.:format) -Controller#Action | admin/identities#edit {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 916 ]----------------------------------------------------------------- -Prefix | admin_user_identity -Verb | PATCH -URI | /admin/users/:user_id/identities/:id(.:format) -Controller#Action | admin/identities#update {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 917 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/users/:user_id/identities/:id(.:format) -Controller#Action | admin/identities#update {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 918 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/users/:user_id/identities/:id(.:format) -Controller#Action | admin/identities#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 919 ]----------------------------------------------------------------- -Prefix | revoke_admin_user_impersonation_token -Verb | PUT -URI | /admin/users/:user_id/impersonation_tokens/:id/revoke(.:format) -Controller#Action | admin/impersonation_tokens#revoke {:id=>/[a-zA-Z.\/0-9_\-]+/, :user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 920 ]----------------------------------------------------------------- -Prefix | admin_user_impersonation_tokens -Verb | GET -URI | /admin/users/:user_id/impersonation_tokens(.:format) -Controller#Action | admin/impersonation_tokens#index {:user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 921 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/users/:user_id/impersonation_tokens(.:format) -Controller#Action | admin/impersonation_tokens#create {:user_id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 922 ]----------------------------------------------------------------- -Prefix | projects_admin_user -Verb | GET -URI | /admin/users/:id/projects(.:format) -Controller#Action | admin/users#projects {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 923 ]----------------------------------------------------------------- -Prefix | keys_admin_user -Verb | GET -URI | /admin/users/:id/keys(.:format) -Controller#Action | admin/users#keys {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 924 ]----------------------------------------------------------------- -Prefix | block_admin_user -Verb | PUT -URI | /admin/users/:id/block(.:format) -Controller#Action | admin/users#block {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 925 ]----------------------------------------------------------------- -Prefix | unblock_admin_user -Verb | PUT -URI | /admin/users/:id/unblock(.:format) -Controller#Action | admin/users#unblock {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 926 ]----------------------------------------------------------------- -Prefix | ban_admin_user -Verb | PUT -URI | /admin/users/:id/ban(.:format) -Controller#Action | admin/users#ban {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 927 ]----------------------------------------------------------------- -Prefix | unban_admin_user -Verb | PUT -URI | /admin/users/:id/unban(.:format) -Controller#Action | admin/users#unban {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 928 ]----------------------------------------------------------------- -Prefix | deactivate_admin_user -Verb | PUT -URI | /admin/users/:id/deactivate(.:format) -Controller#Action | admin/users#deactivate {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 929 ]----------------------------------------------------------------- -Prefix | activate_admin_user -Verb | PUT -URI | /admin/users/:id/activate(.:format) -Controller#Action | admin/users#activate {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 930 ]----------------------------------------------------------------- -Prefix | unlock_admin_user -Verb | PUT -URI | /admin/users/:id/unlock(.:format) -Controller#Action | admin/users#unlock {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 931 ]----------------------------------------------------------------- -Prefix | confirm_admin_user -Verb | PUT -URI | /admin/users/:id/confirm(.:format) -Controller#Action | admin/users#confirm {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 932 ]----------------------------------------------------------------- -Prefix | approve_admin_user -Verb | PUT -URI | /admin/users/:id/approve(.:format) -Controller#Action | admin/users#approve {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 933 ]----------------------------------------------------------------- -Prefix | trust_admin_user -Verb | PUT -URI | /admin/users/:id/trust(.:format) -Controller#Action | admin/users#trust {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 934 ]----------------------------------------------------------------- -Prefix | untrust_admin_user -Verb | PUT -URI | /admin/users/:id/untrust(.:format) -Controller#Action | admin/users#untrust {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 935 ]----------------------------------------------------------------- -Prefix | reject_admin_user -Verb | DELETE -URI | /admin/users/:id/reject(.:format) -Controller#Action | admin/users#reject {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 936 ]----------------------------------------------------------------- -Prefix | impersonate_admin_user -Verb | POST -URI | /admin/users/:id/impersonate(.:format) -Controller#Action | admin/users#impersonate {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 937 ]----------------------------------------------------------------- -Prefix | disable_two_factor_admin_user -Verb | PATCH -URI | /admin/users/:id/disable_two_factor(.:format) -Controller#Action | admin/users#disable_two_factor {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 938 ]----------------------------------------------------------------- -Prefix | remove_email_admin_user -Verb | DELETE -URI | /admin/users/:id/remove/:email_id(.:format) -Controller#Action | admin/users#remove_email {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 939 ]----------------------------------------------------------------- -Prefix | admin_users -Verb | GET -URI | /admin/users(.:format) -Controller#Action | admin/users#index ---[ Route 940 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/users(.:format) -Controller#Action | admin/users#create ---[ Route 941 ]----------------------------------------------------------------- -Prefix | new_admin_user -Verb | GET -URI | /admin/users/new(.:format) -Controller#Action | admin/users#new ---[ Route 942 ]----------------------------------------------------------------- -Prefix | edit_admin_user -Verb | GET -URI | /admin/users/:id/edit(.:format) -Controller#Action | admin/users#edit {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 943 ]----------------------------------------------------------------- -Prefix | admin_user -Verb | GET -URI | /admin/users/:id(.:format) -Controller#Action | admin/users#show {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 944 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /admin/users/:id(.:format) -Controller#Action | admin/users#update {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 945 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/users/:id(.:format) -Controller#Action | admin/users#update {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 946 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/users/:id(.:format) -Controller#Action | admin/users#destroy {:id=>/[a-zA-Z.\/0-9_\-]+/} ---[ Route 947 ]----------------------------------------------------------------- -Prefix | destroy_admin_session -Verb | POST -URI | /admin/session/destroy(.:format) -Controller#Action | admin/sessions#destroy ---[ Route 948 ]----------------------------------------------------------------- -Prefix | new_admin_session -Verb | GET -URI | /admin/session/new(.:format) -Controller#Action | admin/sessions#new ---[ Route 949 ]----------------------------------------------------------------- -Prefix | admin_session -Verb | POST -URI | /admin/session(.:format) -Controller#Action | admin/sessions#create ---[ Route 950 ]----------------------------------------------------------------- -Prefix | admin_impersonation -Verb | DELETE -URI | /admin/impersonation(.:format) -Controller#Action | admin/impersonations#destroy ---[ Route 951 ]----------------------------------------------------------------- -Prefix | new_admin_initial_setup -Verb | GET -URI | /admin/initial_setup/new(.:format) -Controller#Action | admin/initial_setup#new ---[ Route 952 ]----------------------------------------------------------------- -Prefix | admin_initial_setup -Verb | PATCH -URI | /admin/initial_setup(.:format) -Controller#Action | admin/initial_setup#update ---[ Route 953 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/initial_setup(.:format) -Controller#Action | admin/initial_setup#update ---[ Route 954 ]----------------------------------------------------------------- -Prefix | moderate_user_admin_abuse_report -Verb | PUT -URI | /admin/abuse_reports/:id/moderate_user(.:format) -Controller#Action | admin/abuse_reports#moderate_user ---[ Route 955 ]----------------------------------------------------------------- -Prefix | admin_abuse_reports -Verb | GET -URI | /admin/abuse_reports(.:format) -Controller#Action | admin/abuse_reports#index ---[ Route 956 ]----------------------------------------------------------------- -Prefix | admin_abuse_report -Verb | GET -URI | /admin/abuse_reports/:id(.:format) -Controller#Action | admin/abuse_reports#show ---[ Route 957 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /admin/abuse_reports/:id(.:format) -Controller#Action | admin/abuse_reports#update ---[ Route 958 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/abuse_reports/:id(.:format) -Controller#Action | admin/abuse_reports#update ---[ Route 959 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/abuse_reports/:id(.:format) -Controller#Action | admin/abuse_reports#destroy ---[ Route 960 ]----------------------------------------------------------------- -Prefix | admin_gitaly_servers -Verb | GET -URI | /admin/gitaly_servers(.:format) -Controller#Action | admin/gitaly_servers#index ---[ Route 961 ]----------------------------------------------------------------- -Prefix | mark_as_ham_admin_spam_log -Verb | POST -URI | /admin/spam_logs/:id/mark_as_ham(.:format) -Controller#Action | admin/spam_logs#mark_as_ham ---[ Route 962 ]----------------------------------------------------------------- -Prefix | admin_spam_logs -Verb | GET -URI | /admin/spam_logs(.:format) -Controller#Action | admin/spam_logs#index ---[ Route 963 ]----------------------------------------------------------------- -Prefix | admin_spam_log -Verb | DELETE -URI | /admin/spam_logs/:id(.:format) -Controller#Action | admin/spam_logs#destroy ---[ Route 964 ]----------------------------------------------------------------- -Prefix | renew_admin_application -Verb | PUT -URI | /admin/applications/:id/renew(.:format) -Controller#Action | admin/applications#renew ---[ Route 965 ]----------------------------------------------------------------- -Prefix | admin_applications -Verb | GET -URI | /admin/applications(.:format) -Controller#Action | admin/applications#index ---[ Route 966 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/applications(.:format) -Controller#Action | admin/applications#create ---[ Route 967 ]----------------------------------------------------------------- -Prefix | new_admin_application -Verb | GET -URI | /admin/applications/new(.:format) -Controller#Action | admin/applications#new ---[ Route 968 ]----------------------------------------------------------------- -Prefix | edit_admin_application -Verb | GET -URI | /admin/applications/:id/edit(.:format) -Controller#Action | admin/applications#edit ---[ Route 969 ]----------------------------------------------------------------- -Prefix | admin_application -Verb | GET -URI | /admin/applications/:id(.:format) -Controller#Action | admin/applications#show ---[ Route 970 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /admin/applications/:id(.:format) -Controller#Action | admin/applications#update ---[ Route 971 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/applications/:id(.:format) -Controller#Action | admin/applications#update ---[ Route 972 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/applications/:id(.:format) -Controller#Action | admin/applications#destroy ---[ Route 973 ]----------------------------------------------------------------- -Prefix | admin_groups -Verb | GET -URI | /admin/groups(.:format) -Controller#Action | admin/groups#index ---[ Route 974 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/groups(.:format) -Controller#Action | admin/groups#create ---[ Route 975 ]----------------------------------------------------------------- -Prefix | new_admin_group -Verb | GET -URI | /admin/groups/new(.:format) -Controller#Action | admin/groups#new ---[ Route 976 ]----------------------------------------------------------------- -Prefix | admin_organizations -Verb | GET -URI | /admin/organizations(.:format) -Controller#Action | admin/organizations#index ---[ Route 977 ]----------------------------------------------------------------- -Prefix | admin_group_members_update -Verb | PUT -URI | /admin/groups/*id/members_update(.:format) -Controller#Action | admin/groups#members_update {:format=>/(html|json|atom)/} ---[ Route 978 ]----------------------------------------------------------------- -Prefix | admin_group_edit -Verb | GET -URI | /admin/groups/*id/edit(.:format) -Controller#Action | admin/groups#edit {:format=>/(html|json|atom)/} ---[ Route 979 ]----------------------------------------------------------------- -Prefix | admin_group -Verb | GET -URI | /admin/groups/*id(.:format) -Controller#Action | admin/groups#show {:format=>/(html|json|atom)/} ---[ Route 980 ]----------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /admin/groups/*id(.:format) -Controller#Action | admin/groups#update {:format=>/(html|json|atom)/} ---[ Route 981 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/groups/*id(.:format) -Controller#Action | admin/groups#update {:format=>/(html|json|atom)/} ---[ Route 982 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/groups/*id(.:format) -Controller#Action | admin/groups#destroy {:format=>/(html|json|atom)/} ---[ Route 983 ]----------------------------------------------------------------- -Prefix | admin_topic_avatar -Verb | DELETE -URI | /admin/topics/:topic_id/avatar(.:format) -Controller#Action | admin/topics/avatars#destroy ---[ Route 984 ]----------------------------------------------------------------- -Prefix | preview_markdown_admin_topics -Verb | POST -URI | /admin/topics/preview_markdown(.:format) -Controller#Action | admin/topics#preview_markdown ---[ Route 985 ]----------------------------------------------------------------- -Prefix | merge_admin_topics -Verb | POST -URI | /admin/topics/merge(.:format) -Controller#Action | admin/topics#merge ---[ Route 986 ]----------------------------------------------------------------- -Prefix | admin_topics -Verb | GET -URI | /admin/topics(.:format) -Controller#Action | admin/topics#index ---[ Route 987 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/topics(.:format) -Controller#Action | admin/topics#create ---[ Route 988 ]----------------------------------------------------------------- -Prefix | new_admin_topic -Verb | GET -URI | /admin/topics/new(.:format) -Controller#Action | admin/topics#new ---[ Route 989 ]----------------------------------------------------------------- -Prefix | edit_admin_topic -Verb | GET -URI | /admin/topics/:id/edit(.:format) -Controller#Action | admin/topics#edit ---[ Route 990 ]----------------------------------------------------------------- -Prefix | admin_topic -Verb | PATCH -URI | /admin/topics/:id(.:format) -Controller#Action | admin/topics#update ---[ Route 991 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/topics/:id(.:format) -Controller#Action | admin/topics#update ---[ Route 992 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/topics/:id(.:format) -Controller#Action | admin/topics#destroy ---[ Route 993 ]----------------------------------------------------------------- -Prefix | admin_deploy_keys -Verb | GET -URI | /admin/deploy_keys(.:format) -Controller#Action | admin/deploy_keys#index ---[ Route 994 ]----------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/deploy_keys(.:format) -Controller#Action | admin/deploy_keys#create ---[ Route 995 ]----------------------------------------------------------------- -Prefix | new_admin_deploy_key -Verb | GET -URI | /admin/deploy_keys/new(.:format) -Controller#Action | admin/deploy_keys#new ---[ Route 996 ]----------------------------------------------------------------- -Prefix | edit_admin_deploy_key -Verb | GET -URI | /admin/deploy_keys/:id/edit(.:format) -Controller#Action | admin/deploy_keys#edit ---[ Route 997 ]----------------------------------------------------------------- -Prefix | admin_deploy_key -Verb | PATCH -URI | /admin/deploy_keys/:id(.:format) -Controller#Action | admin/deploy_keys#update ---[ Route 998 ]----------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/deploy_keys/:id(.:format) -Controller#Action | admin/deploy_keys#update ---[ Route 999 ]----------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/deploy_keys/:id(.:format) -Controller#Action | admin/deploy_keys#destroy ---[ Route 1000 ]---------------------------------------------------------------- -Prefix | test_admin_hook -Verb | POST -URI | /admin/hooks/:id/test(.:format) -Controller#Action | admin/hooks#test ---[ Route 1001 ]---------------------------------------------------------------- -Prefix | retry_admin_hook_hook_log -Verb | POST -URI | /admin/hooks/:hook_id/hook_logs/:id/retry(.:format) -Controller#Action | admin/hook_logs#retry ---[ Route 1002 ]---------------------------------------------------------------- -Prefix | admin_hook_hook_log -Verb | GET -URI | /admin/hooks/:hook_id/hook_logs/:id(.:format) -Controller#Action | admin/hook_logs#show ---[ Route 1003 ]---------------------------------------------------------------- -Prefix | admin_hooks -Verb | GET -URI | /admin/hooks(.:format) -Controller#Action | admin/hooks#index ---[ Route 1004 ]---------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/hooks(.:format) -Controller#Action | admin/hooks#create ---[ Route 1005 ]---------------------------------------------------------------- -Prefix | edit_admin_hook -Verb | GET -URI | /admin/hooks/:id/edit(.:format) -Controller#Action | admin/hooks#edit ---[ Route 1006 ]---------------------------------------------------------------- -Prefix | admin_hook -Verb | PATCH -URI | /admin/hooks/:id(.:format) -Controller#Action | admin/hooks#update ---[ Route 1007 ]---------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/hooks/:id(.:format) -Controller#Action | admin/hooks#update ---[ Route 1008 ]---------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/hooks/:id(.:format) -Controller#Action | admin/hooks#destroy ---[ Route 1009 ]---------------------------------------------------------------- -Prefix | preview_admin_broadcast_messages -Verb | POST -URI | /admin/broadcast_messages/preview(.:format) -Controller#Action | admin/broadcast_messages#preview ---[ Route 1010 ]---------------------------------------------------------------- -Prefix | admin_broadcast_messages -Verb | GET -URI | /admin/broadcast_messages(.:format) -Controller#Action | admin/broadcast_messages#index ---[ Route 1011 ]---------------------------------------------------------------- -Prefix | -Verb | POST -URI | /admin/broadcast_messages(.:format) -Controller#Action | admin/broadcast_messages#create ---[ Route 1012 ]---------------------------------------------------------------- -Prefix | edit_admin_broadcast_message -Verb | GET -URI | /admin/broadcast_messages/:id/edit(.:format) -Controller#Action | admin/broadcast_messages#edit ---[ Route 1013 ]---------------------------------------------------------------- -Prefix | admin_broadcast_message -Verb | PATCH -URI | /admin/broadcast_messages/:id(.:format) -Controller#Action | admin/broadcast_messages#update ---[ Route 1014 ]---------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /admin/broadcast_messages/:id(.:format) -Controller#Action | admin/broadcast_messages#update ---[ Route 1015 ]---------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /admin/broadcast_messages/:id(.:format) -Controller#Action | admin/broadcast_messages#destroy ---[ Route 1016 ]---------------------------------------------------------------- -Prefix | admin_instance_review -Verb | GET -URI | /admin/instance_review(.:format) -Controller#Action | admin/instance_review#index ---[ Route 1017 ]---------------------------------------------------------------- -Prefix | admin_background_migration_batched_job -Verb | GET -URI | /admin/background_migrations/:background_migration_id/batched_jobs/:id(.:format) -Controller#Action | admin/batched_jobs#show ---[ Route 1018 ]---------------------------------------------------------------- -Prefix | pause_admin_background_migration -Verb | POST -URI | /admin/background_migrations/:id/pause(.:format) -Controller#Action | admin/background_migrations#pause ---[ Route 1019 ]---------------------------------------------------------------- -Prefix | resume_admin_background_migration -Verb | POST -URI | /admin/background_migrations/:id/resume(.:format) -Controller#Action | admin/background_migrations#resume ---[ Route 1020 ]---------------------------------------------------------------- -Prefix | retry_admin_background_migration -Verb | POST -URI | /admin/background_migrations/:id/retry(.:format) -Controller#Action | admin/background_migrations#retry ---[ Route 1021 ]---------------------------------------------------------------- -Prefix | admin_background_migrations -Verb | GET -URI | /admin/background_migrations(.:format) -Controller#Action | admin/background_migrations#index ---[ Route 1022 ]---------------------------------------------------------------- -Prefix | admin_background_migration -Verb | GET -URI | /admin/background_migrations/:id(.:format) -Controller#Action | admin/background_migrations#show ---[ Route 1023 ]---------------------------------------------------------------- -Prefix | admin_health_check -Verb | GET -URI | /admin/health_check(.:format) -Controller#Action | admin/health_check#show ---[ Route 1024 ]---------------------------------------------------------------- -Prefix | admin_background_jobs -Verb | GET -URI | /admin/background_jobs(.:format) -Controller#Action | admin/background_jobs#show ---[ Route 1025 ]---------------------------------------------------------------- -Prefix | admin_system_info -Verb | GET -URI | /admin/system_info(.:format) -Controller#Action | admin/system_info#show ---[ Route 1026 ]---------------------------------------------------------------- -Prefix | admin_projects -Verb | GET -URI | /admin/projects(.:format) -Controller#Action | admin/projects#index ---[ Route 1027 ]---------------------------------------------------------------- -Prefix | admin_usage_trends -Verb | GET -URI | /admin/usage_trends(.:format) -Controller#Action | admin/usage_trends#index ---[ Route 1028 ]---------------------------------------------------------------- -Prefix | admin_dev_ops_reports -Verb | GET -URI | /admin/dev_ops_reports(.:format) -Controller#Action | admin/dev_ops_report#show ---[ Route 1029 ]---------------------------------------------------------------- -Prefix | admin_dev_ops_report -Verb | GET -URI | /admin/dev_ops_report(.:format) -Controller#Action | redirect(301, admin/dev_ops_reports) ---[ Route 1030 ]---------------------------------------------------------------- -Prefix | admin_cohorts -Verb | GET -URI | /admin/cohorts(.:format) -Controller#Action | admin/cohorts#index ---[ Route 1031 ]---------------------------------------------------------------- -Prefix | transfer_admin_namespace_project -Verb | PUT -URI | /admin/projects/*namespace_id/:id/transfer(.:format) -Controller#Action | admin/projects#transfer {:id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?true, :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?true, :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(zip|tar|tar\.gz|tgz|gz|tar\.bz2|tbz|tbz2|tb2|bz2)/, :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/.+?/} ---[ Route 1364 ]---------------------------------------------------------------- -Prefix | namespace_project_security_configuration_sast -Verb | GET -URI | /*namespace_id/:project_id/-/security/configuration/sast(.:format) -Controller#Action | projects/security/sast_configuration#show {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"json", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(csv|json)/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?"json", :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :integration_id=>/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :integration_id=>/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/0-9_\-#%+:]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/0-9_\-#%+:]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/0-9_\-#%+:]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/0-9_\-#%+:]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/0-9_\-#%+:]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\\]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\\]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\\]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\\]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+|:id/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+|:id/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+|:id/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?:json} ---[ Route 1542 ]---------------------------------------------------------------- -Prefix | update_now_namespace_project_mirror -Verb | POST -URI | /*namespace_id/:project_id/-/mirror/update_now(.:format) -Controller#Action | projects/mirrors#update_now {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(html|json)/} ---[ Route 1601 ]---------------------------------------------------------------- -Prefix | search_namespace_project_environments -Verb | GET -URI | /*namespace_id/:project_id/-/environments/search(.:format) -Controller#Action | projects/environments#search {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/\d+/} ---[ Route 1631 ]---------------------------------------------------------------- -Prefix | description_diff_namespace_project_issue -Verb | GET -URI | /*namespace_id/:project_id/-/issues/:id/descriptions/:version_id/diff(.:format) -Controller#Action | projects/issues#description_diff {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :issue_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/timeline|metrics|alerts/} ---[ Route 1647 ]---------------------------------------------------------------- -Prefix | service_desk_namespace_project_issues -Verb | GET -URI | /*namespace_id/:project_id/-/issues/service_desk(.:format) -Controller#Action | projects/issues#service_desk {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/timeline|metrics|alerts/} ---[ Route 1652 ]---------------------------------------------------------------- -Prefix | namespace_project_issue_links -Verb | GET -URI | /*namespace_id/:project_id/-/issues/:issue_id/links(.:format) -Controller#Action | projects/issue_links#index {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :issue_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"reports", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :merge_request_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :merge_request_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"commits", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"pipelines", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"diffs", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :merge_request_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :merge_request_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :merge_request_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"diffs", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"pipelines", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?true, :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"true", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/.+/, :to=>/.+/} ---[ Route 1784 ]---------------------------------------------------------------- -Prefix | namespace_project_compare_with_two_dots -Verb | GET -URI | /*namespace_id/:project_id/-/compare/:from..:to -Controller#Action | projects/compare#show {:straight=>"true", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/.+/, :to=>/.+/} ---[ Route 1785 ]---------------------------------------------------------------- -Prefix | diff_for_path_namespace_project_compare_index -Verb | GET -URI | /*namespace_id/:project_id/-/compare/diff_for_path -Controller#Action | projects/compare#diff_for_path {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/.*/, :path=>/[^\0]*/} ---[ Route 1793 ]---------------------------------------------------------------- -Prefix | namespace_project_network -Verb | GET -URI | /*namespace_id/:project_id/-/network/:id -Controller#Action | projects/network#show {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/active|stale|all/} ---[ Route 1800 ]---------------------------------------------------------------- -Prefix | diverging_commit_counts_namespace_project_branches -Verb | GET -URI | /*namespace_id/:project_id/-/branches/diverging_commit_counts -Controller#Action | projects/branches#diverging_commit_counts {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?true, :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{7,64}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :hook_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :hook_id=>/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/svg/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/:0-9_\-]+/, :artifact_id=>/[a-zA-Z.\/:0-9_\-]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/:0-9_\-]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[a-zA-Z.\/:0-9_\-]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{40}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{40}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\h{40}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"json", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/issue|merge_request/} ---[ Route 1933 ]---------------------------------------------------------------- -Prefix | namespace_project_template -Verb | GET -URI | /*namespace_id/:project_id/templates/:template_type/:key(.:format) -Controller#Action | projects/templates#show {:format=>"json", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[^\/]+/, :template_type=>/issue|merge_request/} ---[ Route 1934 ]---------------------------------------------------------------- -Prefix | namespace_project_template_names -Verb | GET -URI | /*namespace_id/:project_id/description_templates/names/:template_type(.:format) -Controller#Action | projects/templates#names {:format=>"json", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/issue|merge_request/} ---[ Route 1935 ]---------------------------------------------------------------- -Prefix | verify_namespace_project_pages_domain -Verb | POST -URI | /*namespace_id/:project_id/pages/domains/:id/verify(.:format) -Controller#Action | projects/pages_domains#verify {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\/]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"legacy-prometheus", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?"legacy", :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[A-Za-z0-9]+/} ---[ Route 1963 ]---------------------------------------------------------------- -Prefix | -Verb | GET -URI | /*namespace_id/:project_id/builds/artifacts/*ref_name_and_path -Controller#Action | projects/build_artifacts#latest_succeeded {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\w[\w.-]{0,127}/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?nil, :project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[^\/]+/} ---[ Route 1989 ]---------------------------------------------------------------- -Prefix | authorize_namespace_project_uploads -Verb | POST -URI | /*namespace_id/:project_id/uploads/authorize(.:format) -Controller#Action | projects/uploads#authorize {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/svg/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/svg/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :format=>:json, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :format=>:json, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?:json, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?:json, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/\d+/, :format=>:json, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/.*/, :path=>/[^\0]*/} ---[ Route 2006 ]---------------------------------------------------------------- -Prefix | namespace_project_deprecated_deprecated_tree -Verb | GET -URI | /*namespace_id/:project_id/tree/*id -Controller#Action | projects/tree#show {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/[^\0]+/, :namespace_id=>/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/\d+/} ---[ Route 2013 ]---------------------------------------------------------------- -Prefix | namespace_project_legacy_mirror_redirect -Verb | GET|POST|PATCH|DELETE -URI | /*namespace_id/:project_id/mirror(/*rest)(.:format) -Controller#Action | redirect(301) {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/[a-zA-Z0-9_\-\.@]+/, :project_id=>/[a-zA-Z0-9_\-\.@]+/} ---[ Route 2062 ]---------------------------------------------------------------- -Prefix | -Verb | GET -URI | (/-/jira)/*namespace_id/:project_id/commit/:id(.:format) -Controller#Action | redirect(301) {:namespace_id=>/[a-zA-Z0-9_\-\.@]+/, :project_id=>/[a-zA-Z0-9_\-\.@]+/, :id=>/\h{7,64}/} ---[ Route 2063 ]---------------------------------------------------------------- -Prefix | -Verb | GET -URI | (/-/jira)/*namespace_id/:project_id/tree/*id(.:format) -Controller#Action | redirect(301) {:namespace_id=>/[a-zA-Z0-9_\-\.@]+/, :project_id=>/[a-zA-Z0-9_\-\.@]+/} ---[ Route 2064 ]---------------------------------------------------------------- -Prefix | -Verb | POST -URI | /*namespace_id/:project_id/*all(.:format) -Controller#Action | application#route_not_found {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?302} ---[ Route 2073 ]---------------------------------------------------------------- -Prefix | -Verb | GET -URI | /.well-known/security.txt(.:format) -Controller#Action | well_known#security_txt ---[ Route 2074 ]---------------------------------------------------------------- -Prefix | deprecated -Verb | GET -URI | /snippets/:id/raw -Controller#Action | snippets#raw {:id=>/\d+/} ---[ Route 2075 ]---------------------------------------------------------------- -Prefix | deprecated_legacy_snippets_redirect -Verb | GET|POST|PATCH|DELETE -URI | /snippets(/*rest)(.:format) -Controller#Action | redirect(301) ---[ Route 2076 ]---------------------------------------------------------------- -Prefix | sitemap -Verb | GET -URI | /sitemap(.:format) -Controller#Action | sitemap#show ---[ Route 2077 ]---------------------------------------------------------------- -Prefix | root -Verb | GET -URI | / -Controller#Action | root#index ---[ Route 2078 ]---------------------------------------------------------------- -Prefix | -Verb | GET -URI | /*unmatched_route -Controller#Action | application#route_not_found ---[ Route 2080 ]---------------------------------------------------------------- -Prefix | experiment_engine -Verb | -URI | /-/experiment -Controller#Action | Gitlab::Experiment::Engine - -[ Routes for LetterOpenerWeb::Engine ] ---[ Route 1 ]------------------------------------------------------------------- -Prefix | letters -Verb | GET -URI | / -Controller#Action | letter_opener_web/letters#index ---[ Route 2 ]------------------------------------------------------------------- -Prefix | clear_letters -Verb | POST -URI | /clear(.:format) -Controller#Action | letter_opener_web/letters#clear ---[ Route 3 ]------------------------------------------------------------------- -Prefix | letter -Verb | GET -URI | /:id(/:style)(.:format) -Controller#Action | letter_opener_web/letters#show ---[ Route 4 ]------------------------------------------------------------------- -Prefix | delete_letter -Verb | POST -URI | /:id/delete(.:format) -Controller#Action | letter_opener_web/letters#destroy ---[ Route 5 ]------------------------------------------------------------------- -Prefix | -Verb | GET -URI | /:id/attachments/:file(.:format) -Controller#Action | letter_opener_web/letters#attachment {:file=>/[^\/]+/} - -[ Routes for Lookbook::Engine ] ---[ Route 1 ]------------------------------------------------------------------- -Prefix | cable -Verb | -URI | /cable -Controller#Action | #, @worker_pool_size=4, @disable_request_forgery_protection=false, @allow_same_origin_as_host=true, @cable={"adapter"=>"async"}, @mount_path=nil, @logger=#, @formatter=#, @logdev=#, @binmode=false, @mon_data=#, @mon_data_owner_object_id=22800>>>, @mutex=#, @pubsub=nil, @worker_pool=nil, @event_loop=nil, @remote_connections=nil> ---[ Route 2 ]------------------------------------------------------------------- -Prefix | lookbook_home -Verb | GET -URI | / -Controller#Action | lookbook/application#index ---[ Route 3 ]------------------------------------------------------------------- -Prefix | lookbook_page_index -Verb | GET -URI | /pages(.:format) -Controller#Action | lookbook/pages#index ---[ Route 4 ]------------------------------------------------------------------- -Prefix | lookbook_page -Verb | GET -URI | /pages/*path(.:format) -Controller#Action | lookbook/pages#show ---[ Route 5 ]------------------------------------------------------------------- -Prefix | lookbook_previews -Verb | GET -URI | /previews(.:format) -Controller#Action | lookbook/previews#index ---[ Route 6 ]------------------------------------------------------------------- -Prefix | lookbook_preview -Verb | GET -URI | /preview/*path(.:format) -Controller#Action | lookbook/previews#show ---[ Route 7 ]------------------------------------------------------------------- -Prefix | lookbook_inspect -Verb | GET -URI | /inspect/*path(.:format) -Controller#Action | lookbook/inspector#show ---[ Route 8 ]------------------------------------------------------------------- -Prefix | lookbook_embed_lookup -Verb | GET -URI | /embed(.:format) -Controller#Action | lookbook/embeds#lookup ---[ Route 9 ]------------------------------------------------------------------- -Prefix | lookbook_embed -Verb | GET -URI | /embed/*path(.:format) -Controller#Action | lookbook/embeds#show ---[ Route 10 ]------------------------------------------------------------------ -Prefix | -Verb | GET -URI | /*path(.:format) -Controller#Action | lookbook/application#not_found - -[ Routes for Toogle::Engine ] ---[ Route 1 ]------------------------------------------------------------------- -Prefix | definitions -Verb | GET -URI | /definitions(.:format) -Controller#Action | toogle/definitions#index ---[ Route 2 ]------------------------------------------------------------------- -Prefix | features -Verb | GET -URI | / -Controller#Action | toogle/features#index ---[ Route 3 ]------------------------------------------------------------------- -Prefix | feature -Verb | GET -URI | /:id(.:format) -Controller#Action | toogle/features#show ---[ Route 4 ]------------------------------------------------------------------- -Prefix | -Verb | PATCH -URI | /:id(.:format) -Controller#Action | toogle/features#update ---[ Route 5 ]------------------------------------------------------------------- -Prefix | -Verb | PUT -URI | /:id(.:format) -Controller#Action | toogle/features#update ---[ Route 6 ]------------------------------------------------------------------- -Prefix | -Verb | DELETE -URI | /:id(.:format) -Controller#Action | toogle/features#destroy - -[ Routes for Peek::Railtie ] ---[ Route 1 ]------------------------------------------------------------------- -Prefix | results -Verb | GET -URI | /results(.:format) -Controller#Action | peek/results#show - -[ Routes for Gitlab::Experiment::Engine ] ---[ Route 1 ]------------------------------------------------------------------- -Prefix | experiment -Verb | GET -URI | /:id(.:format) -Controller#Action | gitlab/experiment/experiments#show diff --git a/crates/rails/output/routes.json b/crates/rails/output/routes.json deleted file mode 100644 index a303896c..00000000 --- a/crates/rails/output/routes.json +++ /dev/null @@ -1,37912 +0,0 @@ -{ - "routes": [ - { - "section": "Lookbook::Engine", - "id": 1, - "path_original": "/cable", - "path": "/lookbook_engine/cable", - "params": [], - "constraints": {}, - "methods": [], - "action": "#, @worker_pool_size=4, @disable_request_forgery_protection=false, @allow_same_origin_as_host=true, @cable={\"adapter\"=>\"async\"}, @mount_path=nil, @logger=#, @formatter=#, @logdev=#, @binmode=false, @mon_data=#, @mon_data_owner_object_id=22800>>>, @mutex=#, @pubsub=nil, @worker_pool=nil, @event_loop=nil, @remote_connections=nil>", - "prefix": "cable" - }, - { - "section": null, - "id": 748, - "path_original": "/-/graphql-explorer(.:format)", - "path": "/-/graphql-explorer(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "GET" - ], - "action": "#", - "prefix": "__graphql_explorer" - }, - { - "section": null, - "id": 119, - "path_original": "/-/jira_connect(.:format)", - "path": "/-/jira_connect(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "GET" - ], - "action": "#", - "prefix": "jira_connect_base" - }, - { - "section": null, - "id": 87, - "path_original": "/-/http_router/version(.:format)", - "path": "/-/http_router/version(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [], - "action": "#", - "prefix": "http_router_version" - }, - { - "section": null, - "id": 65, - "path_original": "/jwt/auth(.:format)", - "path": "/jwt/auth(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "POST" - ], - "action": "#", - "prefix": null - }, - { - "section": null, - "id": 749, - "path_original": "/", - "path": "/", - "params": [], - "constraints": {}, - "methods": [], - "action": "API::API", - "prefix": "api_api" - }, - { - "section": null, - "id": 2080, - "path_original": "/-/experiment", - "path": "/-/experiment", - "params": [], - "constraints": {}, - "methods": [], - "action": "Gitlab::Experiment::Engine", - "prefix": "experiment_engine" - }, - { - "section": null, - "id": 8, - "path_original": "/rails/letter_opener", - "path": "/rails/letter_opener", - "params": [], - "constraints": {}, - "methods": [], - "action": "LetterOpenerWeb::Engine", - "prefix": "letter_opener_web" - }, - { - "section": null, - "id": 9, - "path_original": "/rails/lookbook", - "path": "/rails/lookbook", - "params": [], - "constraints": {}, - "methods": [], - "action": "Lookbook::Engine", - "prefix": "lookbook" - }, - { - "section": null, - "id": 92, - "path_original": "/-/peek", - "path": "/-/peek", - "params": [], - "constraints": {}, - "methods": [], - "action": "Peek::Railtie", - "prefix": "peek_routes" - }, - { - "section": null, - "id": 755, - "path_original": "/admin/sidekiq", - "path": "/admin/sidekiq", - "params": [], - "constraints": {}, - "methods": [], - "action": "Sidekiq::Web", - "prefix": "sidekiq" - }, - { - "section": null, - "id": 10, - "path_original": "/rails/features", - "path": "/rails/features", - "params": [], - "constraints": {}, - "methods": [], - "action": "Toogle::Engine", - "prefix": "toogle" - }, - { - "section": null, - "id": 229, - "path_original": "/-/abuse_reports/add_category(.:format)", - "path": "/-/abuse_reports/add_category(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "POST" - ], - "action": "abuse_reports#add_category", - "prefix": "add_category_abuse_reports" - }, - { - "section": null, - "id": 230, - "path_original": "/-/abuse_reports(.:format)", - "path": "/-/abuse_reports(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "POST" - ], - "action": "abuse_reports#create", - "prefix": "abuse_reports" - }, - { - "section": null, - "id": 94, - "path_original": "/-/acme-challenge(.:format)", - "path": "/-/acme-challenge(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "GET" - ], - "action": "acme_challenges#show", - "prefix": "acme_challenge" - }, - { - "section": null, - "id": 751, - "path_original": "/*namespace_id/:project_id/-/releases/inbox(.:format)", - "path": "/{*namespace_id:2}/{project_id:4}/-/releases/inbox(.{format})", - "params": [ - "namespace_id", - "project_id", - "format" - ], - "constraints": { - "namespace_id": "(?-mix:(?!((?i-mx:\\-|\\.well\\-known|404\\.html|422\\.html|500\\.html|502\\.html|503\\.html|admin|api|apple\\-touch\\-icon\\.png|assets|dashboard|deploy\\.html|explore|favicon\\.ico|favicon\\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\\.txt|s|search|sitemap|sitemap\\.xml|sitemap\\.xml\\.gz|slash\\-command\\-logo\\.png|snippets|unsubscribes|uploads|users|v2))\\/)(?-mix:(?:[a-zA-Z0-9_\\.][a-zA-Z0-9_\\-\\.]{0,254}[a-zA-Z0-9_\\-]|[a-zA-Z0-9_])(?-mix:(?, - pub constraints: BTreeMap, -} - -#[derive(Debug, Clone, Serialize)] -struct Route { - section: Option, - id: usize, - path_original: String, - path: String, - params: Vec, - constraints: BTreeMap, - methods: Vec, - action: String, - prefix: Option, -} - -// Also handles conversion from Rails URI format to Wayfind. -fn parse_uri(value: &str) -> (String, Vec) { - let mut path = String::new(); - - let mut params = vec![]; - let mut segment = String::new(); - let mut in_param = false; - - let chars: Vec = value.chars().collect(); - let len = chars.len(); - - for (index, &char) in chars.iter().enumerate() { - match char { - ':' | '*' => { - in_param = true; - - if char == '*' { - segment.push_str("{*"); - } else { - segment.push('{'); - } - - let mut param = String::new(); - let mut next = index + 1; - - while next < len && (chars[next].is_ascii_alphanumeric() || chars[next] == '_') { - param.push(chars[next]); - next += 1; - } - - if !param.is_empty() { - params.push(param); - } - } - _ if in_param && (char.is_ascii_alphanumeric() || char == '_') => { - segment.push(char); - - if index == len - 1 { - segment.push('}'); - path.push_str(&segment); - segment.clear(); - } - } - _ if in_param => { - if segment.starts_with('{') { - segment.push('}'); - } - - path.push_str(&segment); - segment.clear(); - - in_param = false; - path.push(char); - } - _ => { - if !segment.is_empty() { - path.push_str(&segment); - segment.clear(); - } - - path.push(char); - } - } - } - - if !segment.is_empty() { - if in_param { - segment.push('}'); - } - - path.push_str(&segment); - } - - (path, params) -} - -fn parse_constraints(constraint: &str, params: &[String]) -> BTreeMap { - let constraint = constraint - .trim() - .trim_start_matches('{') - .trim_end_matches('}'); - - if constraint.is_empty() { - return BTreeMap::new(); - } - - let mut constraints = BTreeMap::new(); - - let parts: Vec<&str> = constraint.split(", :").collect(); - for (index, part) in parts.iter().enumerate() { - let part = if index == 0 { - *part - } else { - &format!(":{part}") - }; - - if let Some((key, value)) = part.split_once("=>") { - let key = key - .trim() - .trim_start_matches([':', '*']) - .trim_matches(|c| c == '"' || c == '\'') - .to_owned(); - - if params.contains(&key) { - let value = value.trim(); - let end = value.len(); - - // Handle static, symbol and regex constraints - let value = if (value.starts_with('"') && value.ends_with('"')) - || (value.starts_with('/') && value.ends_with('/')) - { - &value[1..end - 1] - } else if value.starts_with(':') { - &value[1..end] - } else { - value - }; - - // Ruby supports octal sequences in regex - // Convert them to hex to make them work with fancy-regex - let value = value - .replace("[^\\000-\\040\\177", "[^\\x00-\\x20\\x7f") - .replace("\\0", "\\x00"); - - // Verify it actually is valid regex - Regex::new(&value).unwrap(); - - constraints.insert(key, value.clone()); - } - } - } - - constraints -} - -fn parse_router(input: &str) -> Router { - let mut routes = vec![]; - let mut section = None; - let mut route = None; - - for line in input.lines() { - let line = line.trim(); - - if line.starts_with("[ Routes for ") { - section = Some(line[13..line.len() - 2].to_owned()); - continue; - } - - if line.starts_with("--[ Route ") { - if let Some(route) = route.take() { - routes.push(route); - } - - let id = line.split_whitespace().nth(2).unwrap().parse().unwrap(); - - route = Some(Route { - id, - section: section.clone(), - prefix: None, - path: String::new(), - path_original: String::new(), - params: vec![], - constraints: BTreeMap::new(), - methods: vec![], - action: String::new(), - }); - - continue; - } - - if let Some((key, value)) = line.split_once('|') { - let key = key.trim().to_lowercase().replace(' ', ""); - let value = value.trim().to_owned(); - - if let Some(route) = route.as_mut() { - match key.as_str() { - "prefix" => { - if !value.is_empty() { - route.prefix = Some(value.clone()); - } - } - "verb" => { - let methods: Vec = value - .split('|') - .map(|v| v.trim().to_owned()) - .filter(|v| !v.is_empty()) - .collect(); - - if !methods.is_empty() { - route.methods = methods; - } - } - "uri" => { - route.path_original.clone_from(&value); - - let (path, params) = parse_uri(&value); - route.path = path; - route.params = params; - } - "controller#action" => { - let mut in_parens = 0; - let mut start = None; - let end = value.len(); - - for (index, char) in value.chars().enumerate() { - match char { - '(' => in_parens += 1, - ')' => in_parens -= 1, - '{' if in_parens == 0 && value[index..].starts_with("{:") => { - start = Some(index); - break; - } - _ => {} - } - } - - if let Some(start) = start { - let action = value[..start].trim().to_owned(); - route.action = action; - - let constraint = value[start..end].trim().to_owned(); - route.constraints = parse_constraints(&constraint, &route.params); - } else { - let action = value.trim().to_owned(); - route.action = action; - } - } - _ => unreachable!("Unknown key: {key}"), - } - } - } - } - - if let Some(route) = route { - routes.push(route); - } - - // Create constraints. - let mut id = 0; - let mut constraints = BTreeMap::new(); - - for route in &routes { - for value in route.constraints.values() { - if !constraints.contains_key(value) { - constraints.insert(value.to_string(), id); - id += 1; - } - } - } - - for route in &mut routes { - let mut path = route.path.clone(); - - for (param, constraint) in &route.constraints { - let name = constraints.get(constraint).unwrap(); - - if path.contains(&format!("{{*{param}}}")) { - path = path.replace(&format!("{{*{param}}}"), &format!("{{*{param}:{name}}}")); - } else if path.contains(&format!("{{{param}}}")) { - path = path.replace(&format!("{{{param}}}"), &format!("{{{param}:{name}}}")); - } - } - - route.path = path; - } - - // Add section prefixes to routes. - for route in &mut routes { - if let Some(section) = &route.section { - let section = section.to_lowercase().replace("::", "_"); - if route.path == "/" { - route.path = format!("/{section}"); - } else { - route.path = format!("/{section}{}", route.path); - } - } - } - - // Dedupe by action, method + path. - let mut unique: BTreeMap<(String, Vec, String), Route> = BTreeMap::new(); - - for route in routes { - let key = ( - route.action.clone(), - route.methods.clone(), - route.path.clone(), - ); - - unique.entry(key).or_insert(route); - } - - Router { - routes: unique.into_values().collect(), - constraints, - } -} - -fn main() { - let args: Vec = env::args().collect(); - let path = &args[1]; - - let content = fs::read_to_string(path).unwrap(); - let router = parse_router(&content); - - let json = serde_json::to_string_pretty(&router).unwrap(); - println!("{json}"); -} - -#[cfg(test)] -mod tests { - use super::*; - use insta::assert_json_snapshot; - - #[test] - fn test_no_verb() { - let input = r" - --[ Route 8 ]------------------------------------------------------------------- - Prefix | letter_opener_web - Verb | - URI | /rails/letter_opener - Controller#Action | LetterOpenerWeb::Engine - "; - - let routes = parse_router(input); - assert_json_snapshot!(routes, @r#" - { - "routes": [ - { - "section": null, - "id": 8, - "path_original": "/rails/letter_opener", - "path": "/rails/letter_opener", - "params": [], - "constraints": {}, - "methods": [], - "action": "LetterOpenerWeb::Engine", - "prefix": "letter_opener_web" - } - ], - "constraints": {} - } - "#); - } - - #[test] - fn test_multiple_verbs() { - let input = r" - --[ Route 226 ]----------------------------------------------------------------- - Prefix | decline_invite - Verb | GET|POST - URI | /-/invites/:id/decline(.:format) - Controller#Action | invites#decline {:id=>/[A-Za-z0-9_-]+/} - "; - - let routes = parse_router(input); - assert_json_snapshot!(routes, @r#" - { - "routes": [ - { - "section": null, - "id": 226, - "path_original": "/-/invites/:id/decline(.:format)", - "path": "/-/invites/{id:0}/decline(.{format})", - "params": [ - "id", - "format" - ], - "constraints": { - "id": "[A-Za-z0-9_-]+" - }, - "methods": [ - "GET", - "POST" - ], - "action": "invites#decline", - "prefix": "decline_invite" - } - ], - "constraints": { - "[A-Za-z0-9_-]+": 0 - } - } - "#); - } - - #[test] - fn test_redirect_action() { - let input = r" - --[ Route 248 ]----------------------------------------------------------------- - Prefix | - Verb | GET - URI | /-/s/:username(.:format) - Controller#Action | redirect(301, users/%{username}/snippets) {:username=>/[a-zA-Z.0-9_\-]+(?302} - "; - - let routes = parse_router(input); - assert_json_snapshot!(routes, @r#" - { - "routes": [ - { - "section": null, - "id": 2072, - "path_original": "/.well-known/change-password(.:format)", - "path": "/.well-known/change-password(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "GET" - ], - "action": "redirect(301, -/user_settings/password/edit)", - "prefix": null - } - ], - "constraints": {} - } - "#); - } - - #[test] - fn test_sections() { - let input = r" - --[ Route 10 ]------------------------------------------------------------------ - Prefix | - Verb | GET - URI | /*path(.:format) - Controller#Action | lookbook/application#not_found - [ Routes for Toogle::Engine ] - --[ Route 1 ]------------------------------------------------------------------- - Prefix | definitions - Verb | GET - URI | /definitions(.:format) - Controller#Action | toogle/definitions#index - --[ Route 2 ]------------------------------------------------------------------- - Prefix | features - Verb | GET - URI | / - Controller#Action | toogle/features#index - "; - - let routes = parse_router(input); - assert_json_snapshot!(routes, @r#" - { - "routes": [ - { - "section": null, - "id": 10, - "path_original": "/*path(.:format)", - "path": "/{*path}(.{format})", - "params": [ - "path", - "format" - ], - "constraints": {}, - "methods": [ - "GET" - ], - "action": "lookbook/application#not_found", - "prefix": null - }, - { - "section": "Toogle::Engine", - "id": 1, - "path_original": "/definitions(.:format)", - "path": "/toogle_engine/definitions(.{format})", - "params": [ - "format" - ], - "constraints": {}, - "methods": [ - "GET" - ], - "action": "toogle/definitions#index", - "prefix": "definitions" - }, - { - "section": "Toogle::Engine", - "id": 2, - "path_original": "/", - "path": "/toogle_engine", - "params": [], - "constraints": {}, - "methods": [ - "GET" - ], - "action": "toogle/features#index", - "prefix": "features" - } - ], - "constraints": {} - } - "#); - } - - #[test] - fn test_proc() { - let input = r#" - [ Routes for Lookbook::Engine ] - --[ Route 1 ]------------------------------------------------------------------- - Prefix | cable - Verb | - URI | /cable - Controller#Action | #, @worker_pool_size=4, @disable_request_forgery_protection=false, @allow_same_origin_as_host=true, @cable={"adapter"=>"async"}, @mount_path=nil, @logger=#, @formatter=#, @logdev=#, @binmode=false, @mon_data=#, @mon_data_owner_object_id=22800>>>, @mutex=#, @pubsub=nil, @worker_pool=nil, @event_loop=nil, @remote_connections=nil> - "#; - - let routes = parse_router(input); - assert_json_snapshot!(routes, @r##" - { - "routes": [ - { - "section": "Lookbook::Engine", - "id": 1, - "path_original": "/cable", - "path": "/lookbook_engine/cable", - "params": [], - "constraints": {}, - "methods": [], - "action": "#, @worker_pool_size=4, @disable_request_forgery_protection=false, @allow_same_origin_as_host=true, @cable={\"adapter\"=>\"async\"}, @mount_path=nil, @logger=#, @formatter=#, @logdev=#, @binmode=false, @mon_data=#, @mon_data_owner_object_id=22800>>>, @mutex=#, @pubsub=nil, @worker_pool=nil, @event_loop=nil, @remote_connections=nil>", - "prefix": "cable" - } - ], - "constraints": {} - } - "##); - } - - #[test] - fn test_params() { - let input = r" - --[ Route 2071 ]---------------------------------------------------------------- - Prefix | - Verb | DELETE - URI | /*namespace_id/:project_id(.:format) - Controller#Action | application#route_not_found {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?"txt"} - "#; - - let routes = parse_router(input); - assert_json_snapshot!(routes, @r#" - { - "routes": [ - { - "section": null, - "id": 2079, - "path_original": "/health_check(/:checks)(.:format)", - "path": "/health_check(/{checks})(.{format:0})", - "params": [ - "checks", - "format" - ], - "constraints": { - "format": "txt" - }, - "methods": [ - "GET", - "POST" - ], - "action": "health_check/health_check#index", - "prefix": null - } - ], - "constraints": { - "txt": 0 - } - } - "#); - } - - #[test] - fn test_symbol_constraint() { - let input = r" - --[ Route 517 ]----------------------------------------------------------------- - Prefix | group_security_merge_commit_reports - Verb | GET - URI | /groups/*group_id/-/security/merge_commit_reports(.:format) - Controller#Action | groups/security/merge_commit_reports#index {:format=>:csv} - "; - - let routes = parse_router(input); - assert_json_snapshot!(routes, @r#" - { - "routes": [ - { - "section": null, - "id": 517, - "path_original": "/groups/*group_id/-/security/merge_commit_reports(.:format)", - "path": "/groups/{*group_id}/-/security/merge_commit_reports(.{format:0})", - "params": [ - "group_id", - "format" - ], - "constraints": { - "format": "csv" - }, - "methods": [ - "GET" - ], - "action": "groups/security/merge_commit_reports#index", - "prefix": "group_security_merge_commit_reports" - } - ], - "constraints": { - "csv": 0 - } - } - "#); - } - - #[test] - fn test_complex() { - let input = r" - --[ Route 1793 ]---------------------------------------------------------------- - Prefix | namespace_project_network - Verb | GET - URI | /*namespace_id/:project_id/-/network/:id - Controller#Action | projects/network#show {:project_id=>/(?!((?i-mx:\-|badges|blame|blob|builds|commits|create|create_dir|edit|environments\/folders|files|find_file|gitlab\-lfs\/objects|info\/lfs\/objects|new|preview|raw|refs|tree|update|wikis))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254})(?-mix:(?/(?!\/|.*(?:[\/.]\.|\/\/|@\{|\\))[^\000-\040\177~^:?*\[]+(?/(?-mix:(?!((?i-mx:\-|\.well\-known|404\.html|422\.html|500\.html|502\.html|503\.html|admin|api|apple\-touch\-icon\.png|assets|dashboard|deploy\.html|explore|favicon\.ico|favicon\.png|files|groups|health_check|help|import|jwt|login|oauth|profile|projects|public|robots\.txt|s|search|sitemap|sitemap\.xml|sitemap\.xml\.gz|slash\-command\-logo\.png|snippets|unsubscribes|uploads|users|v2))\/)(?-mix:(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]{0,254}[a-zA-Z0-9_\-]|[a-zA-Z0-9_])(?-mix:(? = LazyLock::new(|| { /// Constraint ensures that the `` parameter in URLs adheres to the OCI Distribution Specification for repository names. pub struct NameConstraint; -impl PathConstraint for NameConstraint { +impl Constraint for NameConstraint { const NAME: &'static str = "name"; fn check(segment: &str) -> bool { diff --git a/examples/oci/src/extract.rs b/examples/oci/src/extract.rs index 6cb0211b..097ba30a 100644 --- a/examples/oci/src/extract.rs +++ b/examples/oci/src/extract.rs @@ -1,8 +1,9 @@ -use crate::{response::IntoResponse, state::SharedAppState}; +use std::{convert::Infallible, future::Future}; + use http::{request::Parts, Request}; use hyper::body::Incoming; -use std::convert::Infallible; -use std::future::Future; + +use crate::{response::IntoResponse, state::SharedAppState}; pub mod body; pub mod method; diff --git a/examples/oci/src/extract/body.rs b/examples/oci/src/extract/body.rs index da7ab966..2e903b3c 100644 --- a/examples/oci/src/extract/body.rs +++ b/examples/oci/src/extract/body.rs @@ -1,14 +1,14 @@ -use super::FromRequest; -use crate::{ - response::{AppResponse, IntoResponse}, - state::SharedAppState, -}; use bytes::Bytes; use http::{header::CONTENT_TYPE, Request, Response, StatusCode}; use http_body_util::{BodyExt, Full}; use serde_json::json; use thiserror::Error; +use crate::{ + response::{AppResponse, IntoResponse}, + state::SharedAppState, +}; + #[derive(Debug, Error)] pub enum BodyError { #[error("Failed to read request body: {0}")] diff --git a/examples/oci/src/extract/method.rs b/examples/oci/src/extract/method.rs index 319837c2..32f4e017 100644 --- a/examples/oci/src/extract/method.rs +++ b/examples/oci/src/extract/method.rs @@ -1,8 +1,9 @@ -use super::FromRequestParts; -use crate::state::SharedAppState; -use http::request::Parts; use std::convert::Infallible; +use http::request::Parts; + +use crate::state::SharedAppState; + /// Access to the given request method. pub struct Method(pub http::Method); diff --git a/examples/oci/src/extract/path.rs b/examples/oci/src/extract/path.rs index 17d688c7..5ca1abcf 100644 --- a/examples/oci/src/extract/path.rs +++ b/examples/oci/src/extract/path.rs @@ -1,14 +1,16 @@ -use super::FromRequestParts; -use crate::response::{AppResponse, IntoResponse}; -use crate::state::SharedAppState; +use std::{fmt::Display, str::FromStr}; + use bytes::Bytes; -use http::Response; -use http::{request::Parts, StatusCode}; +use http::{request::Parts, Response, StatusCode}; use http_body_util::Full; use serde_json::json; -use std::{fmt::Display, str::FromStr}; use thiserror::Error; +use crate::{ + response::{AppResponse, IntoResponse}, + state::SharedAppState, +}; + #[derive(Debug, Error)] pub enum PathError { #[error("Missing path parameters")] diff --git a/examples/oci/src/extract/query.rs b/examples/oci/src/extract/query.rs index 57a31fc6..f09e43fc 100644 --- a/examples/oci/src/extract/query.rs +++ b/examples/oci/src/extract/query.rs @@ -1,16 +1,17 @@ -use super::FromRequestParts; -use crate::{ - response::{AppResponse, IntoResponse}, - state::SharedAppState, -}; +use std::{collections::HashMap, str::Utf8Error}; + use bytes::Bytes; use http::{request::Parts, Response, StatusCode}; use http_body_util::Full; use percent_encoding::percent_decode_str; use serde_json::json; -use std::{collections::HashMap, str::Utf8Error}; use thiserror::Error; +use crate::{ + response::{AppResponse, IntoResponse}, + state::SharedAppState, +}; + #[derive(Debug, Error)] pub enum QueryError { #[error("Invalid query string")] diff --git a/examples/oci/src/extract/route.rs b/examples/oci/src/extract/route.rs index 8e98c637..1226dbec 100644 --- a/examples/oci/src/extract/route.rs +++ b/examples/oci/src/extract/route.rs @@ -1,8 +1,9 @@ -use super::FromRequestParts; -use crate::state::SharedAppState; -use http::request::Parts; use std::convert::Infallible; +use http::request::Parts; + +use crate::state::SharedAppState; + #[derive(Debug, Clone)] pub struct RouteInner(pub String); diff --git a/examples/oci/src/handler.rs b/examples/oci/src/handler.rs index cdbdd179..55906134 100644 --- a/examples/oci/src/handler.rs +++ b/examples/oci/src/handler.rs @@ -1,9 +1,10 @@ +use std::{future::Future, pin::Pin}; + use crate::{ extract::{AppRequest, FromRequest, FromRequestParts}, response::{AppResponse, IntoResponse}, state::SharedAppState, }; -use std::{future::Future, pin::Pin}; /// Trait for request handlers in the application. /// diff --git a/examples/oci/src/lib.rs b/examples/oci/src/lib.rs index 04d03720..134d053e 100644 --- a/examples/oci/src/lib.rs +++ b/examples/oci/src/lib.rs @@ -4,8 +4,11 @@ clippy::multiple_crate_versions )] +use std::{convert::Infallible, sync::Arc}; + use anyhow::Error; use constraints::name::NameConstraint; +use http::Method; use hyper::service::service_fn; use hyper_util::{ rt::{TokioExecutor, TokioIo}, @@ -13,9 +16,7 @@ use hyper_util::{ }; use router::AppRouter; use state::AppState; -use std::{convert::Infallible, sync::Arc}; use tokio::{net::TcpListener, task::JoinSet}; -use wayfind::RouteBuilder; pub mod constraints; pub mod extract; @@ -27,82 +28,88 @@ pub mod state; pub mod types; pub async fn start_server(listener: TcpListener) -> Result<(), Error> { + tracing::info!( + address = %listener.local_addr()?, + "listening on http" + ); + let state = Arc::new(AppState::new()); + // TODO: Enable `wayfind` method routing, when implemented. let mut router = AppRouter::new(); - router.constraint::(); + router.path_constraint::(); // end-1 - let route = RouteBuilder::new() - .route("/v2(/)") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, routes::root::handle_root_get); + router.route(Method::GET, "/v2(/)", routes::root::handle_root_get); // end-2 - let route = RouteBuilder::new() - .route("/v2/{*name:name}/blobs/{digest}(/)") - .methods(vec!["GET", "HEAD"]) - .build()?; - router.insert(&route, routes::blob::handle_blob_pull); + router.route( + Method::GET, + "/v2/{*name:name}/blobs/{digest}(/)", + routes::blob::handle_blob_pull, + ); + router.route( + Method::HEAD, + "/v2/{*name:name}/blobs/{digest}(/)", + routes::blob::handle_blob_pull, + ); // end-3 - let route = RouteBuilder::new() - .route("/v2/{*name:name}/manifests/{reference}(/)") - .methods(vec!["GET", "HEAD"]) - .build()?; - router.insert(&route, routes::manifest::handle_manifest_pull); + router.route( + Method::GET, + "/v2/{*name:name}/manifests/{reference}(/)", + routes::manifest::handle_manifest_pull, + ); + router.route( + Method::HEAD, + "/v2/{*name:name}/manifests/{reference}(/)", + routes::manifest::handle_manifest_pull, + ); // end-4a / end-4b - let route = RouteBuilder::new() - .route("/v2/{*name:name}/blobs/uploads(/)") - .methods(vec!["POST"]) - .build()?; - router.insert(&route, routes::blob::handle_blob_push_post); + router.route( + Method::POST, + "/v2/{*name:name}/blobs/uploads(/)", + routes::blob::handle_blob_push_post, + ); // end-6 - let route = RouteBuilder::new() - .route("/v2/{*name:name}/blobs/uploads/{reference}(/)") - .methods(vec!["PUT"]) - .build()?; - router.insert(&route, routes::blob::handle_blob_push_put); + router.route( + Method::PUT, + "/v2/{*name:name}/blobs/uploads/{reference}(/)", + routes::blob::handle_blob_push_put, + ); // end-7 - let route = RouteBuilder::new() - .route("/v2/{*name:name}/manifests/{reference}(/)") - .methods(vec!["PUT"]) - .build()?; - router.insert(&route, routes::manifest::handle_manifest_put); + router.route( + Method::PUT, + "/v2/{*name:name}/manifests/{reference}(/)", + routes::manifest::handle_manifest_put, + ); // end-8a - let route = RouteBuilder::new() - .route("/v2/{*name:name}/tags/list(/)") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, routes::tags::handle_tags_get); + router.route( + Method::GET, + "/v2/{*name:name}/tags/list(/)", + routes::tags::handle_tags_get, + ); // end-9 - let route = RouteBuilder::new() - .route("/v2/{*name:name}/manifests/{reference}(/)") - .methods(vec!["DELETE"]) - .build()?; - router.insert(&route, routes::manifest::handle_manifest_delete); + router.route( + Method::DELETE, + "/v2/{*name:name}/manifests/{reference}(/)", + routes::manifest::handle_manifest_delete, + ); // end-10 - let route = RouteBuilder::new() - .route("/v2/{*name:name}/blobs/{digest}(/)") - .methods(vec!["DELETE"]) - .build()?; - router.insert(&route, routes::blob::handle_blob_delete); + router.route( + Method::DELETE, + "/v2/{*name:name}/blobs/{digest}(/)", + routes::blob::handle_blob_delete, + ); - println!("{}", router.inner); let router = Arc::new(router); - tracing::info!( - address = %listener.local_addr()?, - "listening on http" - ); - let mut join_set = JoinSet::new(); loop { diff --git a/examples/oci/src/main.rs b/examples/oci/src/main.rs index ab4c8dc4..b5d514c0 100644 --- a/examples/oci/src/main.rs +++ b/examples/oci/src/main.rs @@ -1,7 +1,8 @@ #![allow(clippy::multiple_crate_versions)] -use anyhow::Error; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; + +use anyhow::Error; use tokio::net::TcpListener; use wayfind_oci_example::start_server; diff --git a/examples/oci/src/response.rs b/examples/oci/src/response.rs index 15c48091..84346af2 100644 --- a/examples/oci/src/response.rs +++ b/examples/oci/src/response.rs @@ -1,7 +1,8 @@ +use std::convert::Infallible; + use bytes::Bytes; use http::{Response, StatusCode}; use http_body_util::Full; -use std::convert::Infallible; /// Represents a HTTP response with a full body of bytes. pub type AppResponse = Response>; diff --git a/examples/oci/src/router.rs b/examples/oci/src/router.rs index 01bcd269..7fe989c6 100644 --- a/examples/oci/src/router.rs +++ b/examples/oci/src/router.rs @@ -1,17 +1,14 @@ +use std::{collections::HashMap, future::Future, pin::Pin, sync::Arc}; + +use http::{Method, StatusCode}; +use wayfind::Constraint; + use crate::{ extract::{path::PathInner, route::RouteInner, AppRequest}, handler::Handler, response::{AppResponse, IntoResponse}, state::SharedAppState, }; -use bytes::Bytes; -use http::{Response, StatusCode}; -use http_body_util::Full; -use std::{future::Future, pin::Pin, sync::Arc}; -use wayfind::{ - errors::{MethodSearchError, SearchError}, - PathConstraint, Route, Router, -}; /// Type alias for async handlers. type ArcHandler = Arc< @@ -22,25 +19,44 @@ type ArcHandler = Arc< pub struct AppRouter<'r> { /// Maps HTTP methods to their respective `wayfind` Routers. - pub inner: Router<'r, ArcHandler>, + /// TODO: Replace with native `wayfind` method routing, when implemented. + routes: HashMap>, } impl<'r> AppRouter<'r> { /// Creates a new `AppRouter` with empty route tables for all HTTP methods. #[must_use] pub fn new() -> Self { - Self { - inner: Router::new(), + let mut router = Self { + routes: HashMap::default(), + }; + + for method in [ + Method::GET, + Method::POST, + Method::PUT, + Method::DELETE, + Method::HEAD, + Method::OPTIONS, + Method::CONNECT, + Method::PATCH, + Method::TRACE, + ] { + router.routes.insert(method, wayfind::Router::new()); } + + router } /// Registers a constraint to all route tables. - pub fn constraint(&mut self) { - self.inner.path.constraint::().unwrap(); + pub fn path_constraint(&mut self) { + for router in self.routes.values_mut() { + router.constraint::().unwrap(); + } } /// Adds a new route with the specified method, path, and handler. - pub fn insert(&mut self, route: &Route<'r>, handler: H) + pub fn route(&mut self, method: Method, path: &'r str, handler: H) where H: Handler + Send + Sync + 'static, { @@ -49,45 +65,39 @@ impl<'r> AppRouter<'r> { Box::pin(async move { handler.call(req, state).await }) }); - self.inner.insert(route, handler).unwrap(); + if let Some(router) = self.routes.get_mut(&method) { + router.insert(path, handler).unwrap(); + } else { + let mut new_router = wayfind::Router::new(); + new_router.insert(path, handler).unwrap(); + self.routes.insert(method, new_router); + } } + /// Handles an incoming request by routing it to the appropriate handler. pub async fn handle(&self, mut req: AppRequest, state: SharedAppState) -> AppResponse { + let method = req.method(); let path = req.uri().path().to_owned(); - let method = req.method().as_str().to_owned(); - - let Ok(request) = wayfind::RequestBuilder::new() - .path(&path) - .method(&method) - .build() - else { - return Response::builder() - .status(StatusCode::NOT_FOUND) - .body(Full::new(Bytes::from("Not Found"))) - .unwrap(); + + let Some(router) = self.routes.get(method) else { + return StatusCode::METHOD_NOT_ALLOWED.into_response(); }; - let result = self.inner.search(&request); - match result { - Ok(Some(search)) => { - let route = search.path.route.to_owned(); - let parameters: Vec<(String, String)> = search - .path - .parameters - .into_iter() - .map(|p| (p.0.to_owned(), p.1.to_owned())) - .collect(); - - req.extensions_mut().insert(RouteInner(route)); - req.extensions_mut().insert(PathInner(parameters)); - - let handler = search.data; - handler(req, state).await - } - Err(SearchError::Method(MethodSearchError::NotAllowed)) => { - StatusCode::METHOD_NOT_ALLOWED.into_response() - } - Ok(None) | Err(_) => StatusCode::NOT_FOUND.into_response(), - } + let Ok(Some(search)) = router.search(&path) else { + return StatusCode::NOT_FOUND.into_response(); + }; + + let route = search.route.to_owned(); + let parameters: Vec<(String, String)> = search + .parameters + .into_iter() + .map(|p| (p.0.to_owned(), p.1.to_owned())) + .collect(); + + req.extensions_mut().insert(RouteInner(route)); + req.extensions_mut().insert(PathInner(parameters)); + + let handler = search.data; + handler(req, state).await } } diff --git a/examples/oci/src/routes/blob.rs b/examples/oci/src/routes/blob.rs index 70faa9ca..53229433 100644 --- a/examples/oci/src/routes/blob.rs +++ b/examples/oci/src/routes/blob.rs @@ -1,9 +1,3 @@ -use crate::{ - extract::{body::Body, method::Method, path::Path, query::Query, route::Route}, - response::{AppResponse, IntoResponse}, - state::{AppStateError, SharedAppState}, - types::digest::{Digest, DigestError}, -}; use bytes::Bytes; use http::{ header::{CONTENT_LENGTH, CONTENT_TYPE}, @@ -14,6 +8,13 @@ use serde_json::json; use thiserror::Error; use uuid::Uuid; +use crate::{ + extract::{body::Body, method::Method, path::Path, query::Query, route::Route}, + response::{AppResponse, IntoResponse}, + state::{AppStateError, SharedAppState}, + types::digest::{Digest, DigestError}, +}; + #[derive(Debug, Error)] pub enum BlobError { #[error(transparent)] diff --git a/examples/oci/src/routes/manifest.rs b/examples/oci/src/routes/manifest.rs index 8bb3e5ee..92c4c5c1 100644 --- a/examples/oci/src/routes/manifest.rs +++ b/examples/oci/src/routes/manifest.rs @@ -1,9 +1,3 @@ -use crate::{ - extract::{body::Body, method::Method, path::Path, route::Route}, - response::{AppResponse, IntoResponse}, - state::{AppStateError, SharedAppState}, - types::digest::Digest, -}; use bytes::Bytes; use http::{ header::{CONTENT_LENGTH, CONTENT_TYPE}, @@ -13,6 +7,13 @@ use http_body_util::Full; use serde_json::json; use thiserror::Error; +use crate::{ + extract::{body::Body, method::Method, path::Path, route::Route}, + response::{AppResponse, IntoResponse}, + state::{AppStateError, SharedAppState}, + types::digest::Digest, +}; + #[derive(Debug, Error)] pub enum ManifestError { #[error(transparent)] diff --git a/examples/oci/src/routes/root.rs b/examples/oci/src/routes/root.rs index 2ec12c6c..4641743f 100644 --- a/examples/oci/src/routes/root.rs +++ b/examples/oci/src/routes/root.rs @@ -1,8 +1,9 @@ +use http::StatusCode; + use crate::{ extract::{method::Method, route::Route}, response::IntoResponse, }; -use http::StatusCode; pub async fn handle_root_get(Route(route): Route, Method(method): Method) -> impl IntoResponse { tracing::info!( diff --git a/examples/oci/src/routes/tags.rs b/examples/oci/src/routes/tags.rs index 44460dfa..7bb7b368 100644 --- a/examples/oci/src/routes/tags.rs +++ b/examples/oci/src/routes/tags.rs @@ -1,14 +1,15 @@ -use crate::{ - extract::{method::Method, path::Path, route::Route}, - response::{AppResponse, IntoResponse}, - state::{AppStateError, SharedAppState}, -}; use bytes::Bytes; use http::{header::CONTENT_TYPE, Response, StatusCode}; use http_body_util::Full; use serde_json::json; use thiserror::Error; +use crate::{ + extract::{method::Method, path::Path, route::Route}, + response::{AppResponse, IntoResponse}, + state::{AppStateError, SharedAppState}, +}; + #[derive(Debug, Error)] pub enum RegistryError { #[error(transparent)] diff --git a/examples/oci/src/state.rs b/examples/oci/src/state.rs index e0279a26..1fedac34 100644 --- a/examples/oci/src/state.rs +++ b/examples/oci/src/state.rs @@ -1,10 +1,12 @@ -use crate::types::digest::Digest; +use std::sync::Arc; + use dashmap::DashMap; use http::StatusCode; -use std::sync::Arc; use thiserror::Error; use uuid::Uuid; +use crate::types::digest::Digest; + pub type SharedAppState = Arc; #[derive(Debug, Error)] diff --git a/examples/oci/src/types/digest.rs b/examples/oci/src/types/digest.rs index 0452daf7..b9669f2f 100644 --- a/examples/oci/src/types/digest.rs +++ b/examples/oci/src/types/digest.rs @@ -1,6 +1,7 @@ +use std::fmt::Display; + use http::StatusCode; use sha2::{Digest as ShaDigest, Sha256, Sha512}; -use std::fmt::Display; use thiserror::Error; #[derive(Debug, Error)] diff --git a/flake.lock b/flake.lock index 53edac42..c9e78485 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1734435836, - "narHash": "sha256-kMBQ5PRiFLagltK0sH+08aiNt3zGERC2297iB6vrvlU=", + "lastModified": 1735821806, + "narHash": "sha256-cuNapx/uQeCgeuhUhdck3JKbgpsml259sjUQnWM7zW8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "4989a246d7a390a859852baddb1013f825435cee", + "rev": "d6973081434f88088e5321f83ebafe9a1167c367", "type": "github" }, "original": { @@ -29,11 +29,11 @@ ] }, "locked": { - "lastModified": 1734834660, - "narHash": "sha256-bm8V+Cu8rWJA+vKQnc94mXTpSDgvedyoDKxTVi/uJfw=", + "lastModified": 1735957590, + "narHash": "sha256-vbkoQTInunSjwx9DKebbCNBq9bim8CRj1VbS4eiABfg=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "b070e6030118680977bc2388868c4b3963872134", + "rev": "d40e15e076bcedc5bf5498a0f8ff5f18de4bf8c3", "type": "github" }, "original": { diff --git a/fuzz/fuzz_targets/e2e.rs b/fuzz/fuzz_targets/e2e.rs index 834e13fb..9f6d9689 100644 --- a/fuzz/fuzz_targets/e2e.rs +++ b/fuzz/fuzz_targets/e2e.rs @@ -1,17 +1,12 @@ #![no_main] use libfuzzer_sys::fuzz_target; -use wayfind::{RequestBuilder, RouteBuilder, Router}; +use wayfind::Router; fuzz_target!(|data: &[u8]| { let mut router = Router::new(); if let Ok(route) = std::str::from_utf8(data) { - if let Ok(route) = RouteBuilder::new().route(route).build() { - let _ = router.insert(&route, true); - } - - if let Ok(path) = RequestBuilder::new().path(route).build() { - let _ = router.search(&path); - } + let _ = router.insert(route, true); + let _ = router.search(route); } }); diff --git a/src/chain.rs b/src/chain.rs deleted file mode 100644 index 6d7e4d43..00000000 --- a/src/chain.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::{AuthorityId, MethodId, PathId}; -use std::fmt::Display; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct DataChain { - pub authority: AuthorityId, - pub path: PathId, - pub method: MethodId, -} - -impl Display for DataChain { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}-{}-{}", self.authority, self.path, self.method) - } -} diff --git a/crates/path/src/constraints.rs b/src/constraints.rs similarity index 79% rename from crates/path/src/constraints.rs rename to src/constraints.rs index a3a44c2a..a504db0f 100644 --- a/crates/path/src/constraints.rs +++ b/src/constraints.rs @@ -1,12 +1,12 @@ use std::net::{Ipv4Addr, Ipv6Addr}; -pub trait PathConstraint: Send + Sync { +pub trait Constraint: Send + Sync { const NAME: &'static str; fn check(segment: &str) -> bool; } -impl PathConstraint for u8 { +impl Constraint for u8 { const NAME: &'static str = "u8"; fn check(segment: &str) -> bool { @@ -14,7 +14,7 @@ impl PathConstraint for u8 { } } -impl PathConstraint for u16 { +impl Constraint for u16 { const NAME: &'static str = "u16"; fn check(segment: &str) -> bool { @@ -22,7 +22,7 @@ impl PathConstraint for u16 { } } -impl PathConstraint for u32 { +impl Constraint for u32 { const NAME: &'static str = "u32"; fn check(segment: &str) -> bool { @@ -30,7 +30,7 @@ impl PathConstraint for u32 { } } -impl PathConstraint for u64 { +impl Constraint for u64 { const NAME: &'static str = "u64"; fn check(segment: &str) -> bool { @@ -38,7 +38,7 @@ impl PathConstraint for u64 { } } -impl PathConstraint for u128 { +impl Constraint for u128 { const NAME: &'static str = "u128"; fn check(segment: &str) -> bool { @@ -46,7 +46,7 @@ impl PathConstraint for u128 { } } -impl PathConstraint for usize { +impl Constraint for usize { const NAME: &'static str = "usize"; fn check(segment: &str) -> bool { @@ -54,7 +54,7 @@ impl PathConstraint for usize { } } -impl PathConstraint for i8 { +impl Constraint for i8 { const NAME: &'static str = "i8"; fn check(segment: &str) -> bool { @@ -62,7 +62,7 @@ impl PathConstraint for i8 { } } -impl PathConstraint for i16 { +impl Constraint for i16 { const NAME: &'static str = "i16"; fn check(segment: &str) -> bool { @@ -70,7 +70,7 @@ impl PathConstraint for i16 { } } -impl PathConstraint for i32 { +impl Constraint for i32 { const NAME: &'static str = "i32"; fn check(segment: &str) -> bool { @@ -78,7 +78,7 @@ impl PathConstraint for i32 { } } -impl PathConstraint for i64 { +impl Constraint for i64 { const NAME: &'static str = "i64"; fn check(segment: &str) -> bool { @@ -86,7 +86,7 @@ impl PathConstraint for i64 { } } -impl PathConstraint for i128 { +impl Constraint for i128 { const NAME: &'static str = "i128"; fn check(segment: &str) -> bool { @@ -94,7 +94,7 @@ impl PathConstraint for i128 { } } -impl PathConstraint for isize { +impl Constraint for isize { const NAME: &'static str = "isize"; fn check(segment: &str) -> bool { @@ -102,7 +102,7 @@ impl PathConstraint for isize { } } -impl PathConstraint for f32 { +impl Constraint for f32 { const NAME: &'static str = "f32"; fn check(segment: &str) -> bool { @@ -110,7 +110,7 @@ impl PathConstraint for f32 { } } -impl PathConstraint for f64 { +impl Constraint for f64 { const NAME: &'static str = "f64"; fn check(segment: &str) -> bool { @@ -118,7 +118,7 @@ impl PathConstraint for f64 { } } -impl PathConstraint for bool { +impl Constraint for bool { const NAME: &'static str = "bool"; fn check(segment: &str) -> bool { @@ -126,7 +126,7 @@ impl PathConstraint for bool { } } -impl PathConstraint for Ipv4Addr { +impl Constraint for Ipv4Addr { const NAME: &'static str = "ipv4"; fn check(segment: &str) -> bool { @@ -134,7 +134,7 @@ impl PathConstraint for Ipv4Addr { } } -impl PathConstraint for Ipv6Addr { +impl Constraint for Ipv6Addr { const NAME: &'static str = "ipv6"; fn check(segment: &str) -> bool { diff --git a/src/decode/punycode.rs b/src/decode/punycode.rs deleted file mode 100644 index 4dc1a96c..00000000 --- a/src/decode/punycode.rs +++ /dev/null @@ -1,671 +0,0 @@ -//! - -#![allow(clippy::many_single_char_names)] -#![allow(clippy::cast_possible_truncation)] - -use crate::errors::{EncodingError, PunycodeEncodingError}; -use std::borrow::Cow; - -/// -const BASE: u32 = 36; -const TMIN: u32 = 1; -const TMAX: u32 = 26; -const SKEW: u32 = 38; -const DAMP: u32 = 700; -const INITIAL_BIAS: u32 = 72; -const INITIAL_N: u32 = 128; - -pub fn punycode_decode(input: &[u8]) -> Result, EncodingError> { - if input.is_empty() { - return Ok(String::from_utf8_lossy(input)); - } - - let mut parts = vec![]; - let mut start = 0; - - for (i, &byte) in input.iter().enumerate() { - if byte == b'.' { - if start != i { - parts.push(&input[start..i]); - } - - parts.push(&input[i..=i]); - start = i + 1; - } - } - - if start < input.len() { - parts.push(&input[start..]); - } - - let mut result = String::with_capacity(input.len()); - for part in parts { - if part == b"." { - result.push('.'); - continue; - } - - if part.starts_with(b"xn--") { - let decoded = punycode_decode_part(&part[4..])?; - result.push_str(&decoded); - } else { - let string = String::from_utf8_lossy(part); - if string.contains(|c: char| c.is_ascii_control()) { - return Err(EncodingError::Punycode( - PunycodeEncodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: part.iter().position(|&x| x < 32).unwrap_or(0), - character: vec![], - }, - )); - } - - result.push_str(&string); - } - } - - Ok(Cow::Owned(result)) -} - -/// TODO: I'd like to understand this better, and maybe enforce certain restirctions to improve performance/remove error cases. -/// -fn punycode_decode_part(input: &[u8]) -> Result { - if input == b"-" { - return Err(EncodingError::Punycode( - PunycodeEncodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: 0, - }, - )); - } - - let mut output = Vec::with_capacity(input.len()); - - let mut n: u32 = INITIAL_N; - let mut i: u32 = 0; - let mut bias: u32 = INITIAL_BIAS; - - let last_delimiter = input.iter().rposition(|&x| x == b'-').unwrap_or(0); - for &byte in &input[..last_delimiter] { - output.push(byte as char); - } - - let mut pos = last_delimiter; - if last_delimiter > 0 { - pos += 1; - } - - while pos < input.len() { - let old_i: u32 = i; - let mut w: u32 = 1; - let mut k: u32 = BASE; - - loop { - if pos >= input.len() { - return Err(EncodingError::Punycode( - PunycodeEncodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: pos - 1, - }, - )); - } - - let byte = input[pos]; - if !is_valid_punycode_digit(byte) { - return Err(EncodingError::Punycode( - PunycodeEncodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: pos, - character: vec![], - }, - )); - } - - let digit = decode_digit(byte).unwrap(); - - if k > u32::MAX - BASE { - return Err(EncodingError::Punycode(PunycodeEncodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position: 10, // Fixed position for overflow test - })); - } - - i = i - .checked_add(digit.checked_mul(w).ok_or_else(|| { - PunycodeEncodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position: 10, // Fixed position for overflow test - } - })?) - .ok_or_else(|| PunycodeEncodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position: 10, // Fixed position for overflow test - })?; - - let t: u32 = if k <= bias { - TMIN - } else if k >= bias + TMAX { - TMAX - } else { - k - bias - }; - - if digit < t { - break; - } - - w = w - .checked_mul(BASE - t) - .ok_or_else(|| PunycodeEncodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position: 10, // Fixed position for overflow test - })?; - - k += BASE; - pos += 1; - } - - bias = adapt(i - old_i, output.len() as u32 + 1, old_i == 0); - - n = n - .checked_add(i / (output.len() as u32 + 1)) - .ok_or_else(|| PunycodeEncodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position: 10, // Fixed position for overflow test - })?; - - if n > 0x0010_FFFF { - return Err(EncodingError::Punycode( - PunycodeEncodingError::InvalidCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: pos, - value: n, - }, - )); - } - - i %= output.len() as u32 + 1; - - if n < 128 { - return Err(EncodingError::Punycode( - PunycodeEncodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: pos, - character: vec![], - }, - )); - } - - let code_point = - char::from_u32(n).ok_or_else(|| PunycodeEncodingError::InvalidCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: pos, - value: n, - })?; - - output.insert(i as usize, code_point); - i += 1; - pos += 1; - } - - Ok(output.into_iter().collect()) -} - -const fn is_valid_punycode_digit(cp: u8) -> bool { - matches!(cp, b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9') -} - -const fn decode_digit(cp: u8) -> Option { - match cp { - b'A'..=b'Z' => Some(cp as u32 - b'A' as u32), - b'a'..=b'z' => Some(cp as u32 - b'a' as u32), - b'0'..=b'9' => Some(cp as u32 - b'0' as u32 + 26), - _ => None, - } -} - -const fn adapt(delta: u32, num_points: u32, first_time: bool) -> u32 { - let mut delta = if first_time { delta / DAMP } else { delta >> 1 }; - - delta += delta / num_points; - - let mut k = 0; - let base_minus_tmin = BASE - TMIN; - - while delta > ((base_minus_tmin * TMAX) >> 1) { - delta /= base_minus_tmin; - k += BASE; - } - - k + (((base_minus_tmin + 1) * delta) / (delta + SKEW)) -} - -#[cfg(test)] -mod tests { - use super::*; - - /// - #[test] - fn test_punycode_rfc_arabic() { - let input = b"egbpdaj6bu4bxfgehfvwxn"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "ليهمابتكلموشعربي؟"); - } - - /// - #[test] - fn test_punycode_rfc_chinese_simplified() { - let input = b"ihqwcrb4cv8a8dqg056pqjye"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "他们为什么不说中文"); - } - - /// - #[test] - fn test_punycode_rfc_chinese_traditional() { - let input = b"ihqwctvzc91f659drss3x8bo0yb"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "他們爲什麽不說中文"); - } - - /// - #[test] - fn test_punycode_rfc_czech() { - let input = b"Proprostnemluvesky-uyb24dma41a"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "Pročprostěnemluvíčesky"); - } - - /// - #[test] - fn test_punycode_rfc_hebrew() { - let input = b"4dbcagdahymbxekheh6e0a7fei0b"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "למההםפשוטלאמדבריםעברית"); - } - - /// - #[test] - fn test_punycode_rfc_hindi() { - let input = b"i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "यहलोगहिन्दीक्योंनहींबोलसकतेहैं"); - } - - /// - #[test] - fn test_punycode_rfc_japanese() { - let input = b"n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "なぜみんな日本語を話してくれないのか"); - } - - /// - #[test] - fn test_punycode_rfc_korean() { - let input = b"989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "세계의모든사람들이한국어를이해한다면얼마나좋을까"); - } - - /// - #[test] - fn test_punycode_rfc_russian() { - let input = b"b1abfaaepdrnnbgefbaDotcwatmq2g4l"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "почемужеонинеговорятпорусски"); - } - - /// - #[test] - fn test_punycode_rfc_spanish() { - let input = b"PorqunopuedensimplementehablarenEspaol-fmd56a"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "PorquénopuedensimplementehablarenEspañol"); - } - - /// - #[test] - fn test_punycode_rfc_vietnamese() { - let input = b"TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "TạisaohọkhôngthểchỉnóitiếngViệt"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_1() { - let input = b"3B-ww4c5e180e575a65lsy2b"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "3年B組金八先生"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_2() { - let input = b"-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "安室奈美恵-with-SUPER-MONKEYS"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_3() { - let input = b"Hello-Another-Way--fc4qua05auwb3674vfr0b"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "Hello-Another-Way-それぞれの場所"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_4() { - let input = b"2-u9tlzr9756bt3uc0v"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "ひとつ屋根の下2"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_5() { - let input = b"MajiKoi5-783gue6qz075azm5e"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "MajiでKoiする5秒前"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_6() { - let input = b"de-jg4avhby1noc0d"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "パフィーdeルンバ"); - } - - /// - #[test] - fn test_punycode_rfc_japanese_artist_7() { - let input = b"d9juau41awczczp"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "そのスピードで"); - } - - /// - #[test] - fn test_punycode_rfc_ascii() { - let input = b"-> $1.00 <--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-> $1.00 <-"); - } - - /// - #[test] - fn test_punycode_empty_string() { - let input = b""; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, ""); - } - - /// - #[test] - fn test_punycode_hyphen() { - let input = b"--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-"); - } - - /// - #[test] - fn test_punycode_hyphen_a() { - let input = b"-a-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-a"); - } - - /// - #[test] - fn test_punycode_hyphen_a_hyphen() { - let input = b"-a--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "-a-"); - } - - /// - #[test] - fn test_punycode_a() { - let input = b"a-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "a"); - } - - /// - #[test] - fn test_punycode_a_hyphen() { - let input = b"a--"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "a-"); - } - - /// - #[test] - fn test_punycode_a_b() { - let input = b"a-b-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "a-b"); - } - - /// - #[test] - fn test_punycode_books() { - let input = b"books-"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "books"); - } - - /// - #[test] - fn test_punycode_german() { - let input = b"bcher-kva"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "bücher"); - } - - /// - #[test] - fn test_punycode_chinese() { - let input = b"Hello-ck1hg65u"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "Hello世界"); - } - - /// - #[test] - fn test_punycode_umlaut() { - let input = b"tda"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "ü"); - } - - /// - #[test] - fn test_punycode_two_special() { - let input = b"tdac"; - let result = punycode_decode_part(input).unwrap(); - assert_eq!(result, "üý"); - } - - /// - #[test] - fn test_punycode_error_single_hyphen() { - let input = b"-"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - unexpected end of input - - Input: - - ^ - - Expected: more punycode digits - Found: end of input - "); - - assert_eq!( - result, - EncodingError::Punycode(PunycodeEncodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: 0 - }) - ); - } - - /// - #[test] - fn test_punycode_error_null_byte() { - let input = b"foo\0bar"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid basic code point - - Input: foobar - ^ - - Expected: ASCII character (0-127) - Found: '' - "); - - assert_eq!( - result, - EncodingError::Punycode(PunycodeEncodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 3, - character: vec![], - }) - ); - } - - /// - #[test] - fn test_punycode_error_hash() { - let input = b"foo#bar"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid basic code point - - Input: foo#bar - ^ - - Expected: ASCII character (0-127) - Found: '' - "); - - assert_eq!( - result, - EncodingError::Punycode(PunycodeEncodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 3, - character: vec![], - }) - ); - } - - /// - #[test] - fn test_punycode_error_pound_symbol() { - let input = b"foo\xC2\xA3bar"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid basic code point - - Input: foo£bar - ^ - - Expected: ASCII character (0-127) - Found: '' - "); - - assert_eq!( - result, - EncodingError::Punycode(PunycodeEncodingError::InvalidBasicCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 3, - character: vec![], - }) - ); - } - - /// - #[test] - fn test_punycode_error_truncated() { - let input = b"9"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - unexpected end of input - - Input: 9 - ^ - - Expected: more punycode digits - Found: end of input - "); - - assert_eq!( - result, - EncodingError::Punycode(PunycodeEncodingError::UnexpectedEnd { - input: String::from_utf8_lossy(input).to_string(), - position: 0 - }) - ); - } - - /// - #[test] - fn test_punycode_error_code_point_too_large() { - let input = b"99999a"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - invalid code point - - Input: 99999a - ^ - - Cannot convert value 4760513 to valid Unicode character - "); - - assert_eq!( - result, - EncodingError::Punycode(PunycodeEncodingError::InvalidCodePoint { - input: String::from_utf8_lossy(input).to_string(), - position: 5, - value: 0x0048_A3C1, - }) - ); - } - - /// - #[test] - fn test_punycode_error_overflow() { - let input = b"9999999999a"; - let result = punycode_decode_part(input).unwrap_err(); - - insta::assert_snapshot!(result, @r" - numeric overflow - - Input: 9999999999a - ^ - - Overflow occurred while decoding punycode digits - "); - - assert_eq!( - result, - EncodingError::Punycode(PunycodeEncodingError::Overflow { - input: String::from_utf8_lossy(input).to_string(), - position: 10, - }) - ); - } -} diff --git a/crates/path/src/delete.rs b/src/delete.rs similarity index 78% rename from crates/path/src/delete.rs rename to src/delete.rs index e21d4aef..64cc5e00 100644 --- a/crates/path/src/delete.rs +++ b/src/delete.rs @@ -1,17 +1,19 @@ -use super::{ +use std::sync::Arc; + +use crate::{ node::Node, + parser::{ParsedTemplate, Part}, state::{State, StaticState}, }; -use crate::parser::{ParsedTemplate, Part}; -impl Node<'_, S> { +impl Node<'_, T, S> { /// Deletes a route from the node tree. /// /// This method recursively traverses the tree to find and remove the specified route. /// Logic should match that used by the insert method. /// /// If the route is found and deleted, we re-optimize the tree structure. - pub fn delete(&mut self, route: &mut ParsedTemplate) { + pub fn delete(&mut self, route: &mut ParsedTemplate) -> Option> { if let Some(part) = route.parts.pop() { match part { Part::Static { prefix } => self.delete_static(route, &prefix), @@ -27,27 +29,26 @@ impl Node<'_, S> { } } else { // TODO: Check if path_id matches? - self.data.take(); + let data = self.data.take(); self.needs_optimization = true; + data.map(|d| d.data) } } - fn delete_static(&mut self, route: &mut ParsedTemplate, prefix: &[u8]) { - let Some(index) = self.static_children.iter().position(|child| { + fn delete_static(&mut self, route: &mut ParsedTemplate, prefix: &[u8]) -> Option> { + let index = self.static_children.iter().position(|child| { prefix.len() >= child.state.prefix.len() && child.state.prefix.iter().zip(prefix).all(|(a, b)| a == b) - }) else { - return; - }; + })?; let child = &mut self.static_children[index]; child.needs_optimization = true; let remaining_prefix = &prefix[child.state.prefix.len()..]; - if remaining_prefix.is_empty() { - child.delete(route); + let result = if remaining_prefix.is_empty() { + child.delete(route) } else { - child.delete_static(route, remaining_prefix); + child.delete_static(route, remaining_prefix) }; if child.is_empty() { @@ -67,6 +68,8 @@ impl Node<'_, S> { ..merge }; } + + result } fn delete_dynamic( @@ -74,20 +77,20 @@ impl Node<'_, S> { route: &mut ParsedTemplate, name: &str, constraint: Option<&String>, - ) { - let Some(index) = self.dynamic_children.iter().position(|child| { + ) -> Option> { + let index = self.dynamic_children.iter().position(|child| { child.state.name == name && child.state.constraint.as_ref() == constraint - }) else { - return; - }; + })?; let child = &mut self.dynamic_children[index]; - child.delete(route); + let result = child.delete(route); if child.is_empty() { self.dynamic_children.remove(index); self.needs_optimization = true; } + + result } fn delete_wildcard( @@ -95,34 +98,32 @@ impl Node<'_, S> { route: &mut ParsedTemplate, name: &str, constraint: Option<&String>, - ) { - let Some(index) = self.wildcard_children.iter().position(|child| { + ) -> Option> { + let index = self.wildcard_children.iter().position(|child| { child.state.name == name && child.state.constraint.as_ref() == constraint - }) else { - return; - }; + })?; let child = &mut self.wildcard_children[index]; - child.delete(route); + let result = child.delete(route); if child.is_empty() { self.wildcard_children.remove(index); self.needs_optimization = true; } + + result } - fn delete_end_wildcard(&mut self, name: &str, constraint: Option<&String>) { - let Some(index) = self.end_wildcard_children.iter().position(|child| { + fn delete_end_wildcard(&mut self, name: &str, constraint: Option<&String>) -> Option> { + let index = self.end_wildcard_children.iter().position(|child| { child.state.name == name && child.state.constraint.as_ref() == constraint - }) else { - return; - }; + })?; let mut child = self.end_wildcard_children.remove(index); + self.needs_optimization = true; // TODO: Check if path_id matches? - child.data.take(); - self.needs_optimization = true; + child.data.take().map(|d| d.data) } fn is_empty(&self) -> bool { diff --git a/crates/path/src/display.rs b/src/display.rs similarity index 89% rename from crates/path/src/display.rs rename to src/display.rs index c3197882..2993309b 100644 --- a/crates/path/src/display.rs +++ b/src/display.rs @@ -1,11 +1,12 @@ -use crate::{node::Node, state::State}; use std::fmt::{Display, Write}; -impl Display for Node<'_, S> { +use crate::{node::Node, state::State}; + +impl Display for Node<'_, T, S> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - fn debug_node( + fn debug_node( output: &mut String, - node: &Node<'_, S>, + node: &Node<'_, T, S>, padding: &str, is_top: bool, is_last: bool, @@ -13,15 +14,15 @@ impl Display for Node<'_, S> { let key = node.state.key(); if is_top { - if let Some(data) = node.data.as_ref() { - writeln!(output, "{key} [{}]", data.id)?; + if node.data.is_some() { + writeln!(output, "{key} [*]",)?; } else { writeln!(output, "{key}")?; } } else { let branch = if is_last { "╰─" } else { "├─" }; - if let Some(data) = node.data.as_ref() { - writeln!(output, "{padding}{branch} {key} [{}]", data.id)?; + if node.data.is_some() { + writeln!(output, "{padding}{branch} {key} [*]",)?; } else { writeln!(output, "{padding}{branch} {key}")?; } diff --git a/src/errors.rs b/src/errors.rs index c88a3ebd..0a8bcada 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -1,38 +1,17 @@ -//! Error types for [`wayfind`](crate). -//! -//! All errors contain a user-friendly display method. +pub mod constraint; +pub use constraint::ConstraintError; -pub(crate) mod delete; +pub mod delete; pub use delete::DeleteError; -pub(crate) mod encoding; +pub mod encoding; pub use encoding::EncodingError; -pub use wayfind_percent::errors::DecodingError as PercentDecodingError; -pub use wayfind_punycode::errors::DecodingError as PunycodeDecodingError; -pub(crate) mod insert; +pub mod insert; pub use insert::InsertError; -pub(crate) mod request; -pub use request::RequestError; - -pub(crate) mod route; -pub use route::RouteError; - -pub(crate) mod search; +pub mod search; pub use search::SearchError; -pub use wayfind_authority::errors::{ - ConstraintError as AuthorityConstraintError, DeleteError as AuthorityDeleteError, - InsertError as AuthorityInsertError, SearchError as AuthoritySearchError, - TemplateError as AuthorityTemplateError, -}; -pub use wayfind_method::errors::{ - DeleteError as MethodDeleteError, InsertError as MethodInsertError, - SearchError as MethodSearchError, -}; -pub use wayfind_path::errors::{ - ConstraintError as PathConstraintError, DeleteError as PathDeleteError, - InsertError as PathInsertError, SearchError as PathSearchError, - TemplateError as PathTemplateError, -}; +pub mod template; +pub use template::TemplateError; diff --git a/crates/path/src/errors/constraint.rs b/src/errors/constraint.rs similarity index 97% rename from crates/path/src/errors/constraint.rs rename to src/errors/constraint.rs index b0a5a268..08080772 100644 --- a/crates/path/src/errors/constraint.rs +++ b/src/errors/constraint.rs @@ -8,7 +8,7 @@ pub enum ConstraintError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::ConstraintError; + /// use wayfind::errors::ConstraintError; /// /// let error = ConstraintError::DuplicateName { /// name: "my_constraint", diff --git a/src/errors/delete.rs b/src/errors/delete.rs index 19f95ca9..22b46879 100644 --- a/src/errors/delete.rs +++ b/src/errors/delete.rs @@ -1,12 +1,71 @@ use std::{error::Error, fmt::Display}; +use super::{EncodingError, TemplateError}; + /// Errors relating to attempting to delete a route from a [`Router`](crate::Router). #[derive(Debug, PartialEq, Eq)] pub enum DeleteError { - Authority(wayfind_authority::errors::DeleteError), - Path(wayfind_path::errors::DeleteError), - Method(wayfind_method::errors::DeleteError), - NotFound, + /// A [`EncodingError`] that occurred during the decoding. + Encoding(EncodingError), + + /// A [`TemplateError`] that occurred during the delete. + Template(TemplateError), + + /// Route to be deleted was not found in the router. + /// + /// # Examples + /// + /// ```rust + /// use wayfind::errors::DeleteError; + /// + /// let error = DeleteError::NotFound { + /// route: "/not_found".to_string(), + /// }; + /// + /// let display = " + /// not found + /// + /// Route: /not_found + /// + /// The specified route does not exist in the router + /// "; + /// + /// assert_eq!(error.to_string(), display.trim()); + /// ``` + NotFound { + /// The route that was not found in the router. + route: String, + }, + + /// Tried to delete a route using a format that doesn't match how it was inserted. + /// + /// # Examples + /// + /// ```rust + /// use wayfind::errors::DeleteError; + /// + /// let error = DeleteError::Mismatch { + /// route: "/users/{id}/".to_string(), + /// inserted: "/users/{id}(/)".to_string(), + /// }; + /// + /// let display = " + /// delete mismatch + /// + /// Route: /users/{id}/ + /// Inserted: /users/{id}(/) + /// + /// The route must be deleted using the same format as was inserted + /// "; + /// + /// assert_eq!(error.to_string(), display.trim()); + /// ``` + Mismatch { + /// The route that was attempted to be deleted. + route: String, + /// The route stored as stored in the router. + inserted: String, + }, } impl Error for DeleteError {} @@ -14,28 +73,37 @@ impl Error for DeleteError {} impl Display for DeleteError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::Authority(error) => error.fmt(f), - Self::Path(error) => error.fmt(f), - Self::Method(error) => error.fmt(f), - Self::NotFound => write!(f, "not found"), - } - } -} + Self::Encoding(error) => error.fmt(f), + Self::Template(error) => error.fmt(f), + Self::NotFound { route } => write!( + f, + r"not found + + Route: {route} + +The specified route does not exist in the router" + ), + Self::Mismatch { route, inserted } => write!( + f, + r"delete mismatch -impl From for DeleteError { - fn from(error: wayfind_authority::errors::DeleteError) -> Self { - Self::Authority(error) + Route: {route} + Inserted: {inserted} + +The route must be deleted using the same format as was inserted" + ), + } } } -impl From for DeleteError { - fn from(error: wayfind_path::errors::DeleteError) -> Self { - Self::Path(error) +impl From for DeleteError { + fn from(error: EncodingError) -> Self { + Self::Encoding(error) } } -impl From for DeleteError { - fn from(error: wayfind_method::errors::DeleteError) -> Self { - Self::Method(error) +impl From for DeleteError { + fn from(error: TemplateError) -> Self { + Self::Template(error) } } diff --git a/src/errors/encoding.rs b/src/errors/encoding.rs index a2cc071a..61a2f946 100644 --- a/src/errors/encoding.rs +++ b/src/errors/encoding.rs @@ -3,9 +3,6 @@ use std::{error::Error, fmt::Display}; /// Errors relating to attempting to decode strings. #[derive(Debug, PartialEq, Eq)] pub enum EncodingError { - Percent(wayfind_percent::errors::DecodingError), - Punycode(wayfind_punycode::errors::DecodingError), - /// Invalid UTF-8 sequence encountered. /// /// # Examples @@ -40,8 +37,6 @@ impl Error for EncodingError {} impl Display for EncodingError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::Percent(error) => error.fmt(f), - Self::Punycode(error) => error.fmt(f), Self::Utf8Error { input } => { write!( f, @@ -56,15 +51,3 @@ Expected: valid UTF-8 characters } } } - -impl From for EncodingError { - fn from(error: wayfind_percent::errors::DecodingError) -> Self { - Self::Percent(error) - } -} - -impl From for EncodingError { - fn from(error: wayfind_punycode::errors::DecodingError) -> Self { - Self::Punycode(error) - } -} diff --git a/src/errors/insert.rs b/src/errors/insert.rs index 2e5426d1..39a32c56 100644 --- a/src/errors/insert.rs +++ b/src/errors/insert.rs @@ -1,13 +1,41 @@ -use crate::chain::DataChain; use std::{error::Error, fmt::Display}; +use super::TemplateError; + /// Errors relating to attempting to insert a route into a [`Router`](crate::Router). #[derive(Debug, PartialEq, Eq)] pub enum InsertError { - Authority(wayfind_authority::errors::InsertError), - Path(wayfind_path::errors::InsertError), - Method(wayfind_method::errors::InsertError), - Conflict { chain: DataChain }, + /// A [`TemplateError`] that occurred during the insert operation. + Template(TemplateError), + + /// FIXME + Conflict, + + /// The constraint specified in the route is not recognized by the router. + /// + /// # Examples + /// + /// ```rust + /// use wayfind::errors::InsertError; + /// + /// let error = InsertError::UnknownConstraint { + /// constraint: "unknown_constraint".to_string(), + /// }; + /// + /// let display = " + /// unknown constraint + /// + /// Constraint: unknown_constraint + /// + /// The router doesn't recognize this constraint + /// "; + /// + /// assert_eq!(error.to_string(), display.trim()); + /// ``` + UnknownConstraint { + /// The name of the unrecognized constraint. + constraint: String, + }, } impl Error for InsertError {} @@ -15,33 +43,22 @@ impl Error for InsertError {} impl Display for InsertError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::Authority(error) => error.fmt(f), - Self::Path(error) => error.fmt(f), - Self::Method(error) => error.fmt(f), - Self::Conflict { chain } => write!( + Self::Template(error) => error.fmt(f), + Self::Conflict => write!(f, "CONFLICT"), + Self::UnknownConstraint { constraint } => write!( f, - r"chain conflict + r"unknown constraint - Chain: {chain:?}" + Constraint: {constraint} + +The router doesn't recognize this constraint" ), } } } -impl From for InsertError { - fn from(error: wayfind_authority::errors::InsertError) -> Self { - Self::Authority(error) - } -} - -impl From for InsertError { - fn from(error: wayfind_path::errors::InsertError) -> Self { - Self::Path(error) - } -} - -impl From for InsertError { - fn from(error: wayfind_method::errors::InsertError) -> Self { - Self::Method(error) +impl From for InsertError { + fn from(error: TemplateError) -> Self { + Self::Template(error) } } diff --git a/src/errors/request.rs b/src/errors/request.rs deleted file mode 100644 index 0c85ba0c..00000000 --- a/src/errors/request.rs +++ /dev/null @@ -1,50 +0,0 @@ -use super::EncodingError; -use std::{error::Error, fmt::Display}; - -/// Errors that can occur when creating a [`Request`](`crate::Request`). -#[derive(Debug, PartialEq, Eq)] -pub enum RequestError { - /// A [`EncodingError`] that occurred during the decoding. - Encoding(EncodingError), - - /// The path was not provided when building the [`Request`](`crate::Request`). - /// - /// # Examples - /// - /// ```rust - /// use wayfind::errors::RequestError; - /// - /// let error = RequestError::MissingPath; - /// - /// let display = " - /// missing path - /// - /// A path must be provided when building a Request - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - MissingPath, -} - -impl Error for RequestError {} - -impl Display for RequestError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Encoding(error) => error.fmt(f), - Self::MissingPath => write!( - f, - r"missing path - -A path must be provided when building a Request" - ), - } - } -} - -impl From for RequestError { - fn from(error: EncodingError) -> Self { - Self::Encoding(error) - } -} diff --git a/src/errors/route.rs b/src/errors/route.rs deleted file mode 100644 index 631b0737..00000000 --- a/src/errors/route.rs +++ /dev/null @@ -1,128 +0,0 @@ -use super::EncodingError; -use std::{error::Error, fmt::Display}; - -/// Errors that can occur when creating a [`Route`](`crate::Route`). -#[derive(Debug, PartialEq, Eq)] -pub enum RouteError { - /// A [`EncodingError`] that occurred during the creation. - Encoding(EncodingError), - - /// The route was not provided when building the [`Route`](`crate::Route`). - /// - /// # Examples - /// - /// ```rust - /// use wayfind::errors::RouteError; - /// - /// let error = RouteError::MissingRoute; - /// - /// let display = " - /// missing route - /// - /// A route must be provided when building a Route - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - MissingRoute, - - /// The authority provided was percent-encoded. - /// - /// # Examples - /// - /// ```rust - /// use wayfind::errors::RouteError; - /// - /// let error = RouteError::EncodedAuthority { - /// input: "ドメイン名例".to_string(), - /// decoded: "eckwd4c7cu47r2wf".to_string(), - /// }; - /// - /// let display = " - /// encoded authority - /// - /// Input: ドメイン名例 - /// Decoded: eckwd4c7cu47r2wf - /// - /// The router expects authorities to be in their decoded form - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - EncodedAuthority { - /// The original encoded input authority. - input: String, - /// The decoded version of the authority. - decoded: String, - }, - - /// The path provided was percent-encoded. - /// - /// # Examples - /// - /// ```rust - /// use wayfind::errors::RouteError; - /// - /// let error = RouteError::EncodedPath { - /// input: "/hello%20world".to_string(), - /// decoded: "/hello world".to_string(), - /// }; - /// - /// let display = " - /// encoded path - /// - /// Input: /hello%20world - /// Decoded: /hello world - /// - /// The router expects paths to be in their decoded form - /// "; - /// - /// assert_eq!(error.to_string(), display.trim()); - /// ``` - EncodedPath { - /// The original encoded input path. - input: String, - /// The decoded version of the path. - decoded: String, - }, -} - -impl Error for RouteError {} - -impl Display for RouteError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Encoding(error) => error.fmt(f), - Self::MissingRoute => write!( - f, - r"missing route - -A route must be provided when building a Route" - ), - Self::EncodedAuthority { input, decoded } => write!( - f, - r"encoded authority - - Input: {input} - Decoded: {decoded} - -The router expects authorities to be in their decoded form" - ), - Self::EncodedPath { input, decoded } => write!( - f, - r"encoded path - - Input: {input} - Decoded: {decoded} - -The router expects paths to be in their decoded form" - ), - } - } -} - -impl From for RouteError { - fn from(error: EncodingError) -> Self { - Self::Encoding(error) - } -} diff --git a/src/errors/search.rs b/src/errors/search.rs index 51330bb0..1fb490d1 100644 --- a/src/errors/search.rs +++ b/src/errors/search.rs @@ -1,11 +1,12 @@ use std::{error::Error, fmt::Display}; +use super::EncodingError; + /// Errors relating to attempting to search for a match in a [`Router`](crate::Router). #[derive(Debug, PartialEq, Eq)] pub enum SearchError { - Authority(wayfind_authority::errors::SearchError), - Path(wayfind_path::errors::SearchError), - Method(wayfind_method::errors::SearchError), + /// A [`EncodingError`] that occurred during the search. + Encoding(EncodingError), } impl Error for SearchError {} @@ -13,27 +14,13 @@ impl Error for SearchError {} impl Display for SearchError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::Authority(error) => error.fmt(f), - Self::Path(error) => error.fmt(f), - Self::Method(error) => error.fmt(f), + Self::Encoding(error) => error.fmt(f), } } } -impl From for SearchError { - fn from(error: wayfind_authority::errors::SearchError) -> Self { - Self::Authority(error) - } -} - -impl From for SearchError { - fn from(error: wayfind_path::errors::SearchError) -> Self { - Self::Path(error) - } -} - -impl From for SearchError { - fn from(error: wayfind_method::errors::SearchError) -> Self { - Self::Method(error) +impl From for SearchError { + fn from(error: EncodingError) -> Self { + Self::Encoding(error) } } diff --git a/crates/path/src/errors/template.rs b/src/errors/template.rs similarity index 95% rename from crates/path/src/errors/template.rs rename to src/errors/template.rs index 7b954552..1b8e3715 100644 --- a/crates/path/src/errors/template.rs +++ b/src/errors/template.rs @@ -1,6 +1,7 @@ -use crate::errors::EncodingError; use std::{error::Error, fmt::Display}; +use super::EncodingError; + /// Errors relating to malformed routes. #[derive(Debug, PartialEq, Eq)] pub enum TemplateError { @@ -15,7 +16,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::MissingLeadingSlash { /// route: "abc".to_string(), @@ -41,7 +42,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::EmptyBraces { /// route: "/{}".to_string(), @@ -69,7 +70,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::UnbalancedBrace { /// route: "/{".to_string(), @@ -99,7 +100,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::EmptyParentheses { /// route: "/()".to_string(), @@ -127,7 +128,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::UnbalancedParenthesis { /// route: "/(".to_string(), @@ -157,7 +158,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::EmptyParameter { /// route: "/{:}".to_string(), @@ -188,7 +189,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::InvalidParameter { /// route: "/{a/b}".to_string(), @@ -224,7 +225,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::DuplicateParameter { /// route: "/{id}/{id}".to_string(), @@ -266,7 +267,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::EmptyWildcard { /// route: "/{*}".to_string(), @@ -297,7 +298,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::EmptyConstraint { /// route: "/{a:}".to_string(), @@ -328,7 +329,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::InvalidConstraint { /// route: "/{a:b/c}".to_string(), @@ -364,7 +365,7 @@ pub enum TemplateError { /// # Examples /// /// ```rust - /// use wayfind_path::errors::TemplateError; + /// use wayfind::errors::TemplateError; /// /// let error = TemplateError::TouchingParameters { /// route: "/{a}{b}".to_string(), diff --git a/crates/path/src/insert.rs b/src/insert.rs similarity index 78% rename from crates/path/src/insert.rs rename to src/insert.rs index 072b3333..58633837 100644 --- a/crates/path/src/insert.rs +++ b/src/insert.rs @@ -1,17 +1,14 @@ -use super::{ - node::Node, - state::{DynamicState, EndWildcardState, State, StaticState, WildcardState}, - PathData, -}; use crate::{ + node::{Data, Node}, parser::{ParsedTemplate, Part}, - vec::SortedVec, + state::{DynamicState, EndWildcardState, State, StaticState, WildcardState}, + vec::SortedNode, }; -impl<'r, S: State> Node<'r, S> { +impl<'r, T, S: State> Node<'r, T, S> { /// Inserts a new route into the node tree with associated data. /// Recursively traverses the node tree, creating new nodes as necessary. - pub fn insert(&mut self, route: &mut ParsedTemplate, data: PathData<'r>) { + pub fn insert(&mut self, route: &mut ParsedTemplate, data: Data<'r, T>) { if let Some(part) = route.parts.pop() { match part { Part::Static { prefix } => self.insert_static(route, data, &prefix), @@ -37,7 +34,7 @@ impl<'r, S: State> Node<'r, S> { } } - fn insert_static(&mut self, route: &mut ParsedTemplate, data: PathData<'r>, prefix: &[u8]) { + fn insert_static(&mut self, route: &mut ParsedTemplate, data: Data<'r, T>, prefix: &[u8]) { // Check if the first byte is already a child here. let Some(child) = self .static_children @@ -49,12 +46,12 @@ impl<'r, S: State> Node<'r, S> { state: StaticState::new(prefix.to_vec()), data: None, - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), + static_children: SortedNode::default(), + dynamic_children: SortedNode::default(), dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), + wildcard_children: SortedNode::default(), wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), + end_wildcard_children: SortedNode::default(), priority: 0, needs_optimization: false, @@ -106,12 +103,12 @@ impl<'r, S: State> Node<'r, S> { state: StaticState::new(prefix[common_prefix..].to_vec()), data: None, - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), + static_children: SortedNode::default(), + dynamic_children: SortedNode::default(), dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), + wildcard_children: SortedNode::default(), wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), + end_wildcard_children: SortedNode::default(), priority: 0, needs_optimization: false, @@ -121,10 +118,10 @@ impl<'r, S: State> Node<'r, S> { child.needs_optimization = true; if prefix[common_prefix..].is_empty() { - child.static_children = SortedVec::new(vec![new_child_a]); + child.static_children = SortedNode::new(vec![new_child_a]); child.insert(route, data); } else { - child.static_children = SortedVec::new(vec![new_child_a, new_child_b]); + child.static_children = SortedNode::new(vec![new_child_a, new_child_b]); child.static_children[1].insert(route, data); } @@ -134,7 +131,7 @@ impl<'r, S: State> Node<'r, S> { fn insert_dynamic( &mut self, route: &mut ParsedTemplate, - data: PathData<'r>, + data: Data<'r, T>, name: String, constraint: Option, ) { @@ -149,12 +146,12 @@ impl<'r, S: State> Node<'r, S> { state: DynamicState::new(name, constraint), data: None, - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), + static_children: SortedNode::default(), + dynamic_children: SortedNode::default(), dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), + wildcard_children: SortedNode::default(), wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), + end_wildcard_children: SortedNode::default(), priority: 0, needs_optimization: false, @@ -171,7 +168,7 @@ impl<'r, S: State> Node<'r, S> { fn insert_wildcard( &mut self, route: &mut ParsedTemplate, - data: PathData<'r>, + data: Data<'r, T>, name: String, constraint: Option, ) { @@ -186,12 +183,12 @@ impl<'r, S: State> Node<'r, S> { state: WildcardState::new(name, constraint), data: None, - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), + static_children: SortedNode::default(), + dynamic_children: SortedNode::default(), dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), + wildcard_children: SortedNode::default(), wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), + end_wildcard_children: SortedNode::default(), priority: 0, needs_optimization: false, @@ -205,12 +202,7 @@ impl<'r, S: State> Node<'r, S> { self.needs_optimization = true; } - fn insert_end_wildcard( - &mut self, - data: PathData<'r>, - name: String, - constraint: Option, - ) { + fn insert_end_wildcard(&mut self, data: Data<'r, T>, name: String, constraint: Option) { if self .end_wildcard_children .iter() @@ -223,12 +215,12 @@ impl<'r, S: State> Node<'r, S> { state: EndWildcardState::new(name, constraint), data: Some(data), - static_children: SortedVec::default(), - dynamic_children: SortedVec::default(), + static_children: SortedNode::default(), + dynamic_children: SortedNode::default(), dynamic_children_shortcut: false, - wildcard_children: SortedVec::default(), + wildcard_children: SortedNode::default(), wildcard_children_shortcut: false, - end_wildcard_children: SortedVec::default(), + end_wildcard_children: SortedNode::default(), priority: 0, needs_optimization: false, diff --git a/src/lib.rs b/src/lib.rs index 7a95b915..ba02d946 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,18 +1,28 @@ #![doc = include_str!("../README.md")] +#![allow(clippy::missing_errors_doc, clippy::missing_panics_doc)] -pub(crate) mod chain; -pub use chain::DataChain; +mod constraints; +pub use constraints::Constraint; + +mod delete; + +mod display; pub mod errors; -pub(crate) mod request; -pub use request::{Request, RequestBuilder}; +mod insert; + +mod node; + +mod optimize; + +mod parser; + +mod router; +pub use router::{Match, Parameters, Router}; + +mod search; -pub(crate) mod route; -pub use route::{Route, RouteBuilder}; +mod state; -pub(crate) mod router; -pub use router::{AuthorityMatch, Match, MethodMatch, PathMatch, Router}; -pub use wayfind_authority::AuthorityId; -pub use wayfind_method::MethodId; -pub use wayfind_path::{PathConstraint, PathId, PathParameters}; +mod vec; diff --git a/src/node.rs b/src/node.rs new file mode 100644 index 00000000..6a3b6cec --- /dev/null +++ b/src/node.rs @@ -0,0 +1,35 @@ +use std::sync::Arc; + +use crate::{ + state::{DynamicState, EndWildcardState, State, StaticState, WildcardState}, + vec::SortedNode, +}; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Data<'r, T> { + pub data: Arc, + pub route: &'r str, + pub expanded: Option>, +} + +/// Represents a node in the tree structure. +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Node<'r, T, S: State> { + /// The type of Node, and associated structure data. + pub state: S, + /// Optional data associated with this node. + /// The presence of this data is needed to successfully match a route. + pub data: Option>, + + pub static_children: SortedNode<'r, T, StaticState>, + pub dynamic_children: SortedNode<'r, T, DynamicState>, + pub dynamic_children_shortcut: bool, + pub wildcard_children: SortedNode<'r, T, WildcardState>, + pub wildcard_children_shortcut: bool, + pub end_wildcard_children: SortedNode<'r, T, EndWildcardState>, + + /// Higher values indicate more specific matches. + pub priority: usize, + /// Flag indicating whether this node or its children need optimization. + pub needs_optimization: bool, +} diff --git a/crates/path/src/optimize.rs b/src/optimize.rs similarity index 96% rename from crates/path/src/optimize.rs rename to src/optimize.rs index e3a5644a..e6f4a40f 100644 --- a/crates/path/src/optimize.rs +++ b/src/optimize.rs @@ -1,6 +1,9 @@ -use super::{node::Node, state::State, PathData}; +use crate::{ + node::{Data, Node}, + state::State, +}; -impl Node<'_, S> { +impl Node<'_, T, S> { pub(crate) fn optimize(&mut self) { self.optimize_inner(0); } @@ -45,7 +48,7 @@ impl Node<'_, S> { if self.data.is_some() { priority += 1_000; priority += match &self.data { - Some(PathData { + Some(Data { route, expanded, .. }) => expanded.as_ref().map_or_else( || route.len() + (route.bytes().filter(|&b| b == b'/').count() * 100), diff --git a/crates/path/src/parser.rs b/src/parser.rs similarity index 99% rename from crates/path/src/parser.rs rename to src/parser.rs index f762c438..bbe3f8fc 100644 --- a/crates/path/src/parser.rs +++ b/src/parser.rs @@ -1,7 +1,7 @@ -use super::errors::TemplateError; -use crate::errors::EncodingError; use smallvec::{smallvec, SmallVec}; +use crate::errors::{EncodingError, TemplateError}; + /// Characters that are not allowed in parameter names or constraints. const INVALID_PARAM_CHARS: [u8; 7] = [b':', b'*', b'{', b'}', b'(', b')', b'/']; @@ -364,9 +364,10 @@ impl Parser { #[cfg(test)] mod tests { - use super::*; use similar_asserts::assert_eq; + use super::*; + #[test] fn test_parser_static_route() { assert_eq!( diff --git a/src/request.rs b/src/request.rs deleted file mode 100644 index a0beffb1..00000000 --- a/src/request.rs +++ /dev/null @@ -1,92 +0,0 @@ -use crate::errors::{EncodingError, RequestError}; -use std::{borrow::Cow, fmt::Debug}; -use wayfind_percent::percent_decode; -use wayfind_punycode::punycode_decode; - -#[derive(Clone, Eq, PartialEq)] -pub struct Request<'r> { - authority: Option>, - path: Cow<'r, [u8]>, - method: Option<&'r str>, -} - -impl Request<'_> { - #[must_use] - pub fn authority(&self) -> Option<&str> { - self.authority.as_deref() - } - - #[must_use] - pub fn path(&self) -> &[u8] { - self.path.as_ref() - } - - #[must_use] - pub const fn method(&self) -> Option<&str> { - self.method - } -} - -impl Debug for Request<'_> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Request") - .field("authority", &self.authority) - .field("path", &String::from_utf8_lossy(&self.path)) - .field("method", &self.method) - .finish() - } -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct RequestBuilder<'p> { - authority: Option<&'p str>, - path: Option<&'p str>, - method: Option<&'p str>, -} - -impl<'p> RequestBuilder<'p> { - #[must_use] - pub const fn new() -> Self { - Self { - authority: None, - path: None, - method: None, - } - } - - #[must_use] - pub const fn authority(mut self, authority: &'p str) -> Self { - self.authority = Some(authority); - self - } - - #[must_use] - pub const fn path(mut self, path: &'p str) -> Self { - self.path = Some(path); - self - } - - #[must_use] - pub const fn method(mut self, method: &'p str) -> Self { - self.method = Some(method); - self - } - - #[allow(clippy::missing_errors_doc)] - pub fn build(self) -> Result, RequestError> { - let authority = if let Some(authority) = self.authority { - Some(punycode_decode(authority.as_bytes()).map_err(EncodingError::from)?) - } else { - None - }; - - let path = self.path.ok_or(RequestError::MissingPath)?; - let path = percent_decode(path.as_bytes()).map_err(EncodingError::from)?; - - Ok(Request { - authority, - path, - method: self.method, - }) - } -} diff --git a/src/route.rs b/src/route.rs deleted file mode 100644 index 3e151c17..00000000 --- a/src/route.rs +++ /dev/null @@ -1,83 +0,0 @@ -use wayfind_percent::percent_decode; -use wayfind_punycode::punycode_decode; - -use crate::errors::{EncodingError, RouteError}; - -/// A route that can be inserted into a [`Router`](`crate::Router`). -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct Route<'r> { - pub(crate) authority: Option<&'r str>, - pub(crate) route: &'r str, - pub(crate) methods: Option>, -} - -/// Builder pattern for creating a [`Route`]. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct RouteBuilder<'r> { - authority: Option<&'r str>, - route: Option<&'r str>, - methods: Option>, -} - -impl<'r> RouteBuilder<'r> { - #[must_use] - pub const fn new() -> Self { - Self { - authority: None, - route: None, - methods: None, - } - } - - #[must_use] - pub const fn authority(mut self, authority: &'r str) -> Self { - self.authority = Some(authority); - self - } - - #[must_use] - pub const fn route(mut self, route: &'r str) -> Self { - self.route = Some(route); - self - } - - #[must_use] - pub fn methods(mut self, methods: Vec<&'r str>) -> Self { - self.methods = Some(methods); - self - } - - /// Builds a new [`Route`] instance from the builder. - /// - /// # Errors - /// - /// Return a [`RouteError`] if a required field was not populated. - pub fn build(self) -> Result, RouteError> { - if let Some(authority) = self.authority { - let decoded = punycode_decode(authority.as_bytes()).map_err(EncodingError::from)?; - if authority != decoded { - return Err(RouteError::EncodedAuthority { - input: authority.to_owned(), - decoded: decoded.to_string(), - })?; - } - } - - let route = self.route.ok_or(RouteError::MissingRoute)?; - - // Verify path is percent-decoded - let decoded = percent_decode(route.as_bytes()).map_err(EncodingError::from)?; - if route.as_bytes() != decoded.as_ref() { - return Err(RouteError::EncodedPath { - input: route.to_owned(), - decoded: String::from_utf8_lossy(&decoded).to_string(), - })?; - } - - Ok(Route { - authority: self.authority, - route, - methods: self.methods, - }) - } -} diff --git a/src/router.rs b/src/router.rs index 81967329..d8acbe43 100644 --- a/src/router.rs +++ b/src/router.rs @@ -1,290 +1,187 @@ -#![allow(clippy::missing_errors_doc, clippy::missing_panics_doc)] +use std::{ + collections::HashMap, + fmt::Display, + net::{Ipv4Addr, Ipv6Addr}, + sync::Arc, +}; + +use smallvec::{smallvec, SmallVec}; use crate::{ - chain::DataChain, - errors::{DeleteError, InsertError, SearchError}, - AuthorityId, MethodId, Request, Route, + constraints::Constraint, + errors::{ConstraintError, DeleteError, InsertError, SearchError}, + node::{Data, Node}, + parser::{Parser, Part}, + state::RootState, + vec::SortedNode, }; -use std::collections::BTreeMap; -use wayfind_authority::{AuthorityParameters, AuthorityRouter}; -use wayfind_method::MethodRouter; -use wayfind_path::{PathParameters, PathRouter}; #[derive(Debug, Eq, PartialEq)] pub struct Match<'r, 'p, T> { pub data: &'r T, - pub authority: AuthorityMatch<'r, 'p>, - pub path: PathMatch<'r, 'p>, - pub method: MethodMatch<'r>, -} - -#[derive(Debug, Eq, PartialEq, Default)] -pub struct AuthorityMatch<'r, 'p> { - pub authority: Option<&'r str>, - pub parameters: AuthorityParameters<'r, 'p>, -} - -impl<'r, 'p> From> for AuthorityMatch<'r, 'p> { - fn from(value: wayfind_authority::AuthorityMatch<'r, 'p>) -> Self { - Self { - authority: Some(value.authority), - parameters: value.parameters, - } - } -} - -#[derive(Debug, Eq, PartialEq)] -pub struct PathMatch<'r, 'p> { pub route: &'r str, pub expanded: Option<&'r str>, - pub parameters: PathParameters<'r, 'p>, -} - -impl<'r, 'p> From> for PathMatch<'r, 'p> { - fn from(value: wayfind_path::PathMatch<'r, 'p>) -> Self { - Self { - route: value.route, - expanded: value.expanded, - parameters: value.parameters, - } - } + pub parameters: Parameters<'r, 'p>, } -#[derive(Clone, Debug, Eq, PartialEq, Default)] -pub struct MethodMatch<'r> { - pub method: Option<&'r str>, -} +pub type Parameters<'r, 'p> = SmallVec<[(&'r str, &'p str); 4]>; -impl<'r> From> for MethodMatch<'r> { - fn from(value: wayfind_method::MethodMatch<'r>) -> Self { - Self { - method: value.method, - } - } +#[derive(Clone)] +pub struct StoredConstraint { + pub type_name: &'static str, + pub check: fn(&str) -> bool, } #[derive(Clone)] pub struct Router<'r, T> { - pub authority: AuthorityRouter<'r>, - pub path: PathRouter<'r>, - pub method: MethodRouter, - data: BTreeMap, + pub root: Node<'r, T, RootState>, + pub constraints: HashMap<&'r str, StoredConstraint>, } impl<'r, T> Router<'r, T> { #[must_use] pub fn new() -> Self { - Self { - authority: AuthorityRouter::new(), - path: PathRouter::new(), - method: MethodRouter::new(), - data: BTreeMap::default(), - } - } - - pub fn insert(&mut self, route: &Route<'r>, value: T) -> Result<(), InsertError> { - let authority_id = if let Some(authority) = route.authority { - self.authority.insert(authority)? - } else { - AuthorityId(None) - }; - - let path_id = self.path.insert(route.route)?; - - let method_id = if let Some(methods) = route.methods.as_ref() { - self.method.insert(path_id.0, methods)? - } else { - MethodId(None) + let mut router = Self { + root: Node { + state: RootState::new(), + data: None, + + static_children: SortedNode::default(), + dynamic_children: SortedNode::default(), + dynamic_children_shortcut: false, + wildcard_children: SortedNode::default(), + wildcard_children_shortcut: false, + end_wildcard_children: SortedNode::default(), + + priority: 0, + needs_optimization: false, + }, + constraints: HashMap::default(), }; - let chain = DataChain { - authority: authority_id, - path: path_id, - method: method_id, - }; + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + router.constraint::().unwrap(); + + router + } - if self.data.contains_key(&chain) { - return Err(InsertError::Conflict { chain }); + pub fn constraint(&mut self) -> Result<(), ConstraintError> { + if let Some(existing) = self.constraints.get(C::NAME) { + return Err(ConstraintError::DuplicateName { + name: C::NAME, + existing_type: existing.type_name, + new_type: std::any::type_name::(), + }); } - self.data.insert(chain, value); + self.constraints.insert( + C::NAME, + StoredConstraint { + type_name: std::any::type_name::(), + check: C::check, + }, + ); + Ok(()) } - pub fn delete(&mut self, route: &Route<'r>) -> Result { - let authority_id = if let Some(authority) = route.authority { - self.authority - .find(authority)? - .ok_or(DeleteError::NotFound)? - } else { - AuthorityId(None) - }; - - let Some(path_id) = self.path.find(route.route)? else { - return Err(DeleteError::NotFound); - }; - - let method_id = if let Some(methods) = route.methods.as_ref() { - self.method.find(path_id.0, methods)? - } else { - MethodId(None) - }; - - let chain = DataChain { - authority: authority_id, - path: path_id, - method: method_id, - }; - - if !self.data.contains_key(&chain) { - return Err(DeleteError::NotFound); + pub fn insert(&mut self, route: &'r str, data: T) -> Result<(), InsertError> { + let mut parsed = Parser::new(route.as_bytes())?; + + // Check for invalid constraints. + for route in &parsed.routes { + for part in &route.parts { + if let Part::Dynamic { + constraint: Some(name), + .. + } + | Part::Wildcard { + constraint: Some(name), + .. + } = part + { + if !self.constraints.contains_key(name.as_str()) { + return Err(InsertError::UnknownConstraint { + constraint: name.to_string(), + }); + } + } + } } - let authority_count = if route.authority.is_some() { - self.data - .keys() - .filter(|existing| existing.authority == authority_id) - .count() - } else { - 0 - }; - - let path_count = self - .data - .keys() - .filter(|existing| existing.path == path_id) - .count(); - - let method_count = if route.methods.is_some() { - self.data - .keys() - .filter(|existing| existing.method == method_id) - .count() - } else { - 0 + let data = Arc::from(data); + if parsed.routes.len() > 1 { + for mut parsed_route in parsed.routes { + let expanded = Arc::from(String::from_utf8_lossy(&parsed_route.raw)); + self.root.insert( + &mut parsed_route, + Data { + data: Arc::clone(&data), + route, + expanded: Some(expanded), + }, + ); + } + } else if let Some(parsed_route) = parsed.routes.first_mut() { + self.root.insert( + parsed_route, + Data { + data, + route, + expanded: None, + }, + ); }; - let data = self.data.remove(&chain).ok_or(DeleteError::NotFound)?; - - if route.authority.is_some() && authority_count == 1 { - self.authority.delete(route.authority.unwrap()); - } - - if path_count == 1 { - self.path.delete(route.route); - } + self.root.optimize(); + Ok(()) + } - if route.methods.is_some() && method_count == 1 { - self.method.delete(path_id.0, method_id); + pub fn delete(&mut self, route: &str) -> Result<(), DeleteError> { + let parsed = Parser::new(route.as_bytes())?; + for mut expanded_route in parsed.routes { + self.root.delete(&mut expanded_route); } - Ok(data) + self.root.optimize(); + Ok(()) } - pub fn search<'p>( - &'r self, - request: &'p Request<'p>, - ) -> Result>, SearchError> - where - 'p: 'r, - { - let authority = request.authority().map_or_else( - || Ok(None), - |authority| self.authority.search(authority.as_bytes()), - ); - - let authority_id = authority.as_ref().map_or_else( - |_| AuthorityId(None), - |authority| authority.as_ref().map_or(AuthorityId(None), |a| a.id), - ); - - let Some(path) = self.path.search(request.path())? else { + pub fn search<'p>(&'r self, path: &'p str) -> Result>, SearchError> { + let mut parameters = smallvec![]; + let Some((data, _)) = + self.root + .search(path.as_bytes(), &mut parameters, &self.constraints)? + else { return Ok(None); }; - let path_id = path.id; - - let method = request - .method() - .map_or(Ok(None), |method| self.method.search(path_id.0, method)); - - let method_id = method.as_ref().map_or_else( - |_| MethodId(None), - |method| method.as_ref().map_or(MethodId(None), |m| m.id), - ); - - let chain = DataChain { - authority: authority_id, - path: path_id, - method: method_id, - }; - - let Some(data) = self.data.get(&chain) else { - if let Err(err) = authority { - return Err(SearchError::Authority(err)); - } - - if let Err(err) = method { - return Err(SearchError::Method(err)); - } - - return Ok(None); - }; - - let authority = authority.map_or(AuthorityMatch::default(), |authority| { - authority.map_or_else(AuthorityMatch::default, Into::into) - }); - - let path = path.into(); - - let method = method.map_or(MethodMatch::default(), |method| { - method.map_or_else(MethodMatch::default, Into::into) - }); - Ok(Some(Match { - data, - authority, - path, - method, + data: data.data.as_ref(), + route: data.route, + expanded: data.expanded.as_deref(), + parameters, })) } } -impl std::fmt::Display for Router<'_, T> { +impl Display for Router<'_, T> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "\n=== Authority")?; - let authority = self.authority.to_string(); - if authority.is_empty() { - write!(f, "\nEmpty")?; - } else { - write!(f, "\n{authority}")?; - } - - write!(f, "\n=== Path")?; - let path = self.path.to_string(); - if path.is_empty() { - write!(f, "\nEmpty")?; - } else { - write!(f, "\n{path}")?; - } - - write!(f, "\n=== Method")?; - let method = self.method.to_string(); - if method.is_empty() { - write!(f, "\nEmpty")?; - } else { - write!(f, "\n{method}")?; - } - - write!(f, "\n=== Chains")?; - if self.data.is_empty() { - write!(f, "\nEmpty")?; - } else { - for chain in self.data.keys() { - write!(f, "\n{chain}")?; - } - } - - Ok(()) + write!(f, "{}", self.root) } } diff --git a/crates/path/src/search.rs b/src/search.rs similarity index 88% rename from crates/path/src/search.rs rename to src/search.rs index 5263c700..4f5b913b 100644 --- a/crates/path/src/search.rs +++ b/src/search.rs @@ -1,12 +1,15 @@ -use super::{node::Node, state::State, PathData}; +use std::collections::HashMap; + +use smallvec::smallvec; + use crate::{ errors::{EncodingError, SearchError}, - {PathParameters, StoredConstraint}, + node::{Data, Node}, + router::{Parameters, StoredConstraint}, + state::State, }; -use smallvec::smallvec; -use std::collections::HashMap; -impl<'r, S: State> Node<'r, S> { +impl<'r, T, S: State> Node<'r, T, S> { /// Searches for a matching route in the node tree. /// /// This method traverses the tree to find a route node that matches the given path, collecting parameters along the way. @@ -14,9 +17,9 @@ impl<'r, S: State> Node<'r, S> { pub fn search<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { if path.is_empty() { return Ok(self.data.as_ref().map(|data| (data, self.priority))); } @@ -43,9 +46,9 @@ impl<'r, S: State> Node<'r, S> { fn search_static<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { for child in self.static_children.iter() { if path.len() >= child.state.prefix.len() && child.state.prefix.iter().zip(path).all(|(a, b)| a == b) @@ -65,9 +68,9 @@ impl<'r, S: State> Node<'r, S> { fn search_dynamic<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { if self.dynamic_children_shortcut { self.search_dynamic_segment(path, parameters, constraints) } else { @@ -79,13 +82,13 @@ impl<'r, S: State> Node<'r, S> { fn search_dynamic_inline<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { for child in self.dynamic_children.iter() { let mut consumed = 0; - let mut best_match: Option<(&'r PathData<'r>, usize)> = None; + let mut best_match: Option<(&'r Data<'r, T>, usize)> = None; let mut best_match_parameters = smallvec![]; while consumed < path.len() { @@ -133,9 +136,9 @@ impl<'r, S: State> Node<'r, S> { fn search_dynamic_segment<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { for child in self.dynamic_children.iter() { let segment_end = path.iter().position(|&b| b == b'/').unwrap_or(path.len()); @@ -164,9 +167,9 @@ impl<'r, S: State> Node<'r, S> { fn search_wildcard<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { if self.wildcard_children_shortcut { self.search_wildcard_segment(path, parameters, constraints) } else { @@ -178,13 +181,13 @@ impl<'r, S: State> Node<'r, S> { fn search_wildcard_inline<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { for child in self.wildcard_children.iter() { let mut consumed = 0; - let mut best_match: Option<(&'r PathData<'r>, usize)> = None; + let mut best_match: Option<(&'r Data<'r, T>, usize)> = None; let mut best_match_parameters = smallvec![]; while consumed < path.len() { @@ -228,9 +231,9 @@ impl<'r, S: State> Node<'r, S> { fn search_wildcard_segment<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { for child in self.wildcard_children.iter() { let mut consumed = 0; let mut remaining_path = path; @@ -293,9 +296,9 @@ impl<'r, S: State> Node<'r, S> { fn search_end_wildcard<'p>( &'r self, path: &'p [u8], - parameters: &mut PathParameters<'r, 'p>, + parameters: &mut Parameters<'r, 'p>, constraints: &HashMap<&'r str, StoredConstraint>, - ) -> Result, usize)>, SearchError> { + ) -> Result, usize)>, SearchError> { for child in self.end_wildcard_children.iter() { if !Self::check_constraint(child.state.constraint.as_ref(), path, constraints) { continue; diff --git a/crates/authority/src/state.rs b/src/state.rs similarity index 100% rename from crates/authority/src/state.rs rename to src/state.rs diff --git a/crates/authority/src/vec.rs b/src/vec.rs similarity index 50% rename from crates/authority/src/vec.rs rename to src/vec.rs index 035b7254..a4ef95d2 100644 --- a/crates/authority/src/vec.rs +++ b/src/vec.rs @@ -1,24 +1,26 @@ use std::ops::{Index, IndexMut}; +use crate::{node::Node, state::State}; + /// A `vec` which caches its sort state. #[derive(Clone, Debug, Eq, PartialEq)] -pub struct SortedVec { - vec: Vec, +pub struct SortedNode<'r, T, S: State> { + vec: Vec>, sorted: bool, } -impl SortedVec { +impl<'r, T, S: State> SortedNode<'r, T, S> { #[must_use] - pub const fn new(vec: Vec) -> Self { + pub const fn new(vec: Vec>) -> Self { Self { vec, sorted: false } } - pub fn push(&mut self, value: T) { + pub fn push(&mut self, value: Node<'r, T, S>) { self.vec.push(value); self.sorted = false; } - pub fn remove(&mut self, index: usize) -> T { + pub fn remove(&mut self, index: usize) -> Node<'r, T, S> { self.vec.remove(index) } @@ -33,18 +35,18 @@ impl SortedVec { self.vec.is_empty() } - pub fn find_mut(&mut self, predicate: F) -> Option<&mut T> + pub fn find_mut(&mut self, predicate: F) -> Option<&mut Node<'r, T, S>> where - F: Fn(&T) -> bool, + F: Fn(&Node<'r, T, S>) -> bool, { self.vec.iter_mut().find(|item| predicate(item)) } - pub fn iter(&self) -> impl Iterator { + pub fn iter(&self) -> impl Iterator> { self.vec.iter() } - pub fn iter_mut(&mut self) -> impl Iterator { + pub fn iter_mut(&mut self) -> impl Iterator> { self.vec.iter_mut() } @@ -53,29 +55,34 @@ impl SortedVec { return; } - self.vec.sort(); + self.vec.sort_by(|a, b| { + b.priority + .cmp(&a.priority) + .then_with(|| a.state.cmp(&b.state)) + }); + self.sorted = true; } } -impl Default for SortedVec { +impl Default for SortedNode<'_, T, S> { fn default() -> Self { Self { - vec: vec![], + vec: Vec::new(), sorted: false, } } } -impl Index for SortedVec { - type Output = T; +impl<'r, T, S: State> Index for SortedNode<'r, T, S> { + type Output = Node<'r, T, S>; fn index(&self, index: usize) -> &Self::Output { &self.vec[index] } } -impl IndexMut for SortedVec { +impl IndexMut for SortedNode<'_, T, S> { fn index_mut(&mut self, index: usize) -> &mut Self::Output { &mut self.vec[index] } diff --git a/tests/authority.rs b/tests/authority.rs deleted file mode 100644 index 5bc4722f..00000000 --- a/tests/authority.rs +++ /dev/null @@ -1,315 +0,0 @@ -use smallvec::smallvec; -use std::error::Error; -use wayfind::{ - AuthorityMatch, Match, MethodMatch, PathMatch, RequestBuilder, RouteBuilder, Router, -}; - -#[test] -fn test_authority_simple() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .authority("api.example.com") - .route("/users") - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - api.example.com [1] - === Path - /users [1] - === Method - Empty - === Chains - 1-1-* - "); - - let request = RequestBuilder::new() - .authority("api.example.com") - .path("/users") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: Some("api.example.com"), - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} - -#[test] -fn test_authority_parameter() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .authority("{tenant}.example.com") - .route("/users") - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - {tenant} - ╰─ .example.com [1] - === Path - /users [1] - === Method - Empty - === Chains - 1-1-* - "); - - let request = RequestBuilder::new() - .authority("acme.example.com") - .path("/users") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: Some("{tenant}.example.com"), - parameters: smallvec![("tenant", "acme")], - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} - -#[test] -fn test_authority_multiple_parameters() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .authority("{tenant}.{region}.example.com") - .route("/users") - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - {tenant} - ╰─ . - ╰─ {region} - ╰─ .example.com [1] - === Path - /users [1] - === Method - Empty - === Chains - 1-1-* - "); - - let request = RequestBuilder::new() - .authority("acme.us-east.example.com") - .path("/users") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: Some("{tenant}.{region}.example.com"), - parameters: smallvec![("tenant", "acme"), ("region", "us-east")], - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} - -#[test] -fn test_authority_priority() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .authority("api.example.com") - .route("/users") - .build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new() - .authority("{tenant}.example.com") - .route("/users") - .build()?; - router.insert(&route, 2)?; - - insta::assert_snapshot!(router, @r" - === Authority - api.example.com [1] - {tenant} - ╰─ .example.com [2] - === Path - /users [1] - === Method - Empty - === Chains - 1-1-* - 2-1-* - "); - - let request = RequestBuilder::new() - .authority("api.example.com") - .path("/users") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: Some("api.example.com"), - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - let request = RequestBuilder::new() - .authority("acme.example.com") - .path("/users") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &2, - authority: AuthorityMatch { - authority: Some("{tenant}.example.com"), - parameters: smallvec![("tenant", "acme")], - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} - -#[test] -fn test_authority_fallback() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new() - .authority("api.example.com") - .route("/users") - .build()?; - router.insert(&route, 2)?; - - insta::assert_snapshot!(router, @r" - === Authority - api.example.com [1] - === Path - /users [1] - === Method - Empty - === Chains - *-1-* - 1-1-* - "); - - let request = RequestBuilder::new() - .authority("api.example.com") - .path("/users") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &2, - authority: AuthorityMatch { - authority: Some("api.example.com"), - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - let request = RequestBuilder::new() - .authority("other.example.com") - .path("/users") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} diff --git a/tests/constraint.rs b/tests/constraint.rs index 11523644..c563d47d 100644 --- a/tests/constraint.rs +++ b/tests/constraint.rs @@ -1,14 +1,14 @@ +use std::error::Error; + use similar_asserts::assert_eq; use smallvec::smallvec; -use std::error::Error; use wayfind::{ - errors::{InsertError, PathConstraintError, PathInsertError}, - AuthorityMatch, Match, MethodMatch, PathConstraint, PathMatch, RequestBuilder, RouteBuilder, - Router, + errors::{ConstraintError, InsertError}, + Constraint, Match, Router, }; struct NameConstraint; -impl PathConstraint for NameConstraint { +impl Constraint for NameConstraint { const NAME: &'static str = "name"; fn check(segment: &str) -> bool { @@ -19,44 +19,26 @@ impl PathConstraint for NameConstraint { #[test] fn test_constraint_dynamic() -> Result<(), Box> { let mut router = Router::new(); - router.path.constraint::()?; - - let route = RouteBuilder::new().route("/users/{id:name}").build()?; - router.insert(&route, 1)?; + router.constraint::()?; + router.insert("/users/{id:name}", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ╰─ {id:name} [1] - === Method - Empty - === Chains - *-1-* + ╰─ {id:name} [*] "); - let request = RequestBuilder::new().path("/users/john123").build()?; - let search = router.search(&request)?; + let search = router.search("/users/john123")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users/{id:name}", - expanded: None, - parameters: smallvec![("id", "john123")], - }, - method: MethodMatch { method: None }, + route: "/users/{id:name}", + expanded: None, + parameters: smallvec![("id", "john123")], }) ); - let request = RequestBuilder::new().path("/users/john@123").build()?; - let search = router.search(&request)?; + let search = router.search("/users/john@123")?; assert_eq!(search, None); Ok(()) @@ -65,44 +47,26 @@ fn test_constraint_dynamic() -> Result<(), Box> { #[test] fn test_constraint_wildcard() -> Result<(), Box> { let mut router = Router::new(); - router.path.constraint::()?; - - let route = RouteBuilder::new().route("/users/{*path:name}").build()?; - router.insert(&route, 1)?; + router.constraint::()?; + router.insert("/users/{*path:name}", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ╰─ {*path:name} [1] - === Method - Empty - === Chains - *-1-* + ╰─ {*path:name} [*] "); - let request = RequestBuilder::new().path("/users/john/doe123").build()?; - let search = router.search(&request)?; + let search = router.search("/users/john/doe123")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users/{*path:name}", - expanded: None, - parameters: smallvec![("path", "john/doe123")], - }, - method: MethodMatch { method: None }, + route: "/users/{*path:name}", + expanded: None, + parameters: smallvec![("path", "john/doe123")], }) ); - let request = RequestBuilder::new().path("/users/john@doe/123").build()?; - let search = router.search(&request)?; + let search = router.search("/users/john@doe/123")?; assert_eq!(search, None); Ok(()) @@ -112,24 +76,19 @@ fn test_constraint_wildcard() -> Result<(), Box> { fn test_constraint_unknown() { let mut router = Router::new(); - let route = RouteBuilder::new() - .route("/users/{id:unknown}") - .build() - .unwrap(); - let result = router.insert(&route, 1); - + let result = router.insert("/users/{id:unknown}", 1); assert_eq!( result, - Err(InsertError::Path(PathInsertError::UnknownConstraint { + Err(InsertError::UnknownConstraint { constraint: "unknown".to_owned() - })) + }) ); } #[test] fn test_constraint_conflict() -> Result<(), Box> { struct Constraint1; - impl PathConstraint for Constraint1 { + impl Constraint for Constraint1 { const NAME: &'static str = "test"; fn check(segment: &str) -> bool { segment == "1" @@ -137,7 +96,7 @@ fn test_constraint_conflict() -> Result<(), Box> { } struct Constraint2; - impl PathConstraint for Constraint2 { + impl Constraint for Constraint2 { const NAME: &'static str = "test"; fn check(segment: &str) -> bool { segment == "2" @@ -145,12 +104,12 @@ fn test_constraint_conflict() -> Result<(), Box> { } let mut router: Router<'_, usize> = Router::new(); - router.path.constraint::()?; + router.constraint::()?; - let result = router.path.constraint::(); + let result = router.constraint::(); assert_eq!( result, - Err(PathConstraintError::DuplicateName { + Err(ConstraintError::DuplicateName { name: "test", existing_type: "constraint::test_constraint_conflict::Constraint1", new_type: "constraint::test_constraint_conflict::Constraint2" @@ -163,61 +122,34 @@ fn test_constraint_conflict() -> Result<(), Box> { #[test] fn test_constraint_builtin() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users/{id}").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/users/{id:u32}").build()?; - router.insert(&route, 2)?; + router.insert("/users/{id}", 1)?; + router.insert("/users/{id:u32}", 2)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ├─ {id:u32} [2] - ╰─ {id} [1] - === Method - Empty - === Chains - *-1-* - *-2-* + ├─ {id:u32} [*] + ╰─ {id} [*] "); - let request = RequestBuilder::new().path("/users/abc").build()?; - let search = router.search(&request)?; + let search = router.search("/users/abc")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users/{id}", - expanded: None, - parameters: smallvec![("id", "abc")], - }, - method: MethodMatch { method: None }, + route: "/users/{id}", + expanded: None, + parameters: smallvec![("id", "abc")], }) ); - let request = RequestBuilder::new().path("/users/123").build()?; - let search = router.search(&request)?; + let search = router.search("/users/123")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users/{id:u32}", - expanded: None, - parameters: smallvec![("id", "123")], - }, - method: MethodMatch { method: None }, + route: "/users/{id:u32}", + expanded: None, + parameters: smallvec![("id", "123")], }) ); @@ -228,62 +160,35 @@ fn test_constraint_builtin() -> Result<(), Box> { #[test] fn test_constraint_unreachable() -> Result<(), Box> { let mut router = Router::new(); - router.path.constraint::()?; - - let route = RouteBuilder::new().route("/users/{id:u32}").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/users/{id:name}").build()?; - router.insert(&route, 2)?; + router.constraint::()?; + router.insert("/users/{id:u32}", 1)?; + router.insert("/users/{id:name}", 2)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ├─ {id:name} [2] - ╰─ {id:u32} [1] - === Method - Empty - === Chains - *-1-* - *-2-* + ├─ {id:name} [*] + ╰─ {id:u32} [*] "); - let request = RequestBuilder::new().path("/users/123").build()?; - let search = router.search(&request)?; + let search = router.search("/users/123")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users/{id:name}", - expanded: None, - parameters: smallvec![("id", "123")], - }, - method: MethodMatch { method: None }, + route: "/users/{id:name}", + expanded: None, + parameters: smallvec![("id", "123")], }) ); - let request = RequestBuilder::new().path("/users/abc123").build()?; - let search = router.search(&request)?; + let search = router.search("/users/abc123")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users/{id:name}", - expanded: None, - parameters: smallvec![("id", "abc123")], - }, - method: MethodMatch { method: None }, + route: "/users/{id:name}", + expanded: None, + parameters: smallvec![("id", "abc123")], }) ); diff --git a/tests/delete.rs b/tests/delete.rs index 31098ce7..caf6d14b 100644 --- a/tests/delete.rs +++ b/tests/delete.rs @@ -1,31 +1,22 @@ -use similar_asserts::assert_eq; use std::error::Error; -use wayfind::{ - errors::{DeleteError, PathDeleteError}, - RouteBuilder, Router, -}; + +use similar_asserts::assert_eq; +use wayfind::{errors::DeleteError, Router}; #[test] fn test_delete() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/test", 1)?; - let route = RouteBuilder::new().route("/test").build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /test [1] - === Method - Empty - === Chains - *-1-* - "); + insta::assert_snapshot!(router, @"/test [*]"); - let route = RouteBuilder::new().route("/tests").build()?; - let delete = router.delete(&route); - assert_eq!(delete, Err(DeleteError::NotFound)); + let delete = router.delete("/tests"); + assert_eq!( + delete, + Err(DeleteError::NotFound { + route: "/tests".to_owned() + }) + ); insta::assert_snapshot!(router, @r" === Authority @@ -38,14 +29,13 @@ fn test_delete() -> Result<(), Box> { *-1-* "); - let route = RouteBuilder::new().route("(/test)").build()?; - let delete = router.delete(&route); + let delete = router.delete("(/test)"); assert_eq!( delete, - Err(DeleteError::Path(PathDeleteError::Mismatch { + Err(DeleteError::Mismatch { route: "(/test)".to_owned(), inserted: "/test".to_owned(), - })) + }) ); insta::assert_snapshot!(router, @r" @@ -59,9 +49,8 @@ fn test_delete() -> Result<(), Box> { *-1-* "); - let route = RouteBuilder::new().route("/test").build()?; - let delete = router.delete(&route)?; - assert_eq!(delete, 1); + router.delete("/test")?; + // assert_eq!(delete, 1); insta::assert_snapshot!(router, @r" === Authority @@ -80,30 +69,20 @@ fn test_delete() -> Result<(), Box> { #[test] fn test_delete_mismatch() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("(/test)").build()?; - router.insert(&route, 1)?; + router.insert("(/test)", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - / [1] - ╰─ test [1] - === Method - Empty - === Chains - *-1-* + / [*] + ╰─ test [*] "); - let route = RouteBuilder::new().route("/test").build()?; - let delete = router.delete(&route); + let delete = router.delete("/test"); assert_eq!( delete, - Err(DeleteError::Path(PathDeleteError::Mismatch { + Err(DeleteError::Mismatch { route: "/test".to_owned(), inserted: "(/test)".to_owned() - })) + }) ); insta::assert_snapshot!(router, @r" @@ -118,14 +97,13 @@ fn test_delete_mismatch() -> Result<(), Box> { *-1-* "); - let route = RouteBuilder::new().route("/").build()?; - let delete = router.delete(&route); + let delete = router.delete("/"); assert_eq!( delete, - Err(DeleteError::Path(PathDeleteError::Mismatch { + Err(DeleteError::Mismatch { route: "/".to_owned(), inserted: "(/test)".to_owned() - })) + }) ); insta::assert_snapshot!(router, @r" @@ -140,9 +118,8 @@ fn test_delete_mismatch() -> Result<(), Box> { *-1-* "); - let route = RouteBuilder::new().route("(/test)").build()?; - let delete = router.delete(&route)?; - assert_eq!(delete, 1); + router.delete("(/test)")?; + // assert_eq!(delete, 1); insta::assert_snapshot!(router, @r" === Authority @@ -161,45 +138,33 @@ fn test_delete_mismatch() -> Result<(), Box> { #[test] fn test_delete_overlap() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/a(/b)").build()?; - router.insert(&route, 1)?; + router.insert("/a(/b)", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /a [1] - ╰─ /b [1] - === Method - Empty - === Chains - *-1-* + /a [*] + ╰─ /b [*] "); - let route = RouteBuilder::new().route("/a").build()?; - let delete = router.delete(&route); + let delete = router.delete("/a"); assert_eq!( delete, - Err(DeleteError::Path(PathDeleteError::Mismatch { + Err(DeleteError::Mismatch { route: "/a".to_owned(), inserted: "/a(/b)".to_owned(), - })) + }) ); - let route = RouteBuilder::new().route("/a(/b(/c))").build()?; - let delete = router.delete(&route); + let delete = router.delete("/a(/b(/c))"); assert_eq!( delete, - Err(DeleteError::Path(PathDeleteError::Mismatch { + Err(DeleteError::Mismatch { route: "/a(/b(/c))".to_owned(), inserted: "/a(/b)".to_owned(), - })) + }) ); - let route = RouteBuilder::new().route("/a(/b)").build()?; - let delete = router.delete(&route)?; - assert_eq!(delete, 1); + router.delete("/a(/b)")?; + // assert_eq!(delete, 1); insta::assert_snapshot!(router, @r" === Authority @@ -218,26 +183,21 @@ fn test_delete_overlap() -> Result<(), Box> { #[test] fn test_delete_empty() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{id}data").build()?; - router.insert(&route, 1)?; + router.insert("/{id}data", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ╰─ {id} - ╰─ data [1] - === Method - Empty - === Chains - *-1-* + ╰─ data [*] "); - let route = RouteBuilder::new().route("/{id}").build()?; - let delete = router.delete(&route); - assert_eq!(delete, Err(DeleteError::NotFound)); + let delete = router.delete("/{id}"); + assert_eq!( + delete, + Err(DeleteError::NotFound { + route: "/{id}".to_owned() + }) + ); insta::assert_snapshot!(router, @r" === Authority diff --git a/tests/display.rs b/tests/display.rs index a5196713..99403dd1 100644 --- a/tests/display.rs +++ b/tests/display.rs @@ -1,72 +1,42 @@ use std::error::Error; -use wayfind::{RouteBuilder, Router}; + +use wayfind::Router; #[test] fn test_display_router() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/users/{id}").build()?; - router.insert(&route, 3)?; - let route = RouteBuilder::new().route("/users/{id}/profile").build()?; - router.insert(&route, 4)?; - let route = RouteBuilder::new() - .route("/posts/{year}-{month}-{day}") - .build()?; - router.insert(&route, 5)?; - let route = RouteBuilder::new() - .route("/files/{*path}/download") - .build()?; - router.insert(&route, 6)?; - let route = RouteBuilder::new().route("/api/v1(/)").build()?; - router.insert(&route, 7)?; - let route = RouteBuilder::new() - .route("/images/{name}(.{extension})") - .build()?; - router.insert(&route, 8)?; - let route = RouteBuilder::new().route("/{*catch_all}").build()?; - router.insert(&route, 9)?; + router.insert("/", 1)?; + router.insert("/users", 2)?; + router.insert("/users/{id}", 3)?; + router.insert("/users/{id}/profile", 4)?; + router.insert("/posts/{year}-{month}-{day}", 5)?; + router.insert("/files/{*path}/download", 6)?; + router.insert("/api/v1(/)", 7)?; + router.insert("/images/{name}(.{extension})", 8)?; + router.insert("/{*catch_all}", 9)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - / [1] - ├─ api/v1 [7] - │ ╰─ / [7] - ├─ users [2] + / [*] + ├─ api/v1 [*] + │ ╰─ / [*] + ├─ users [*] │ ╰─ / - │ ╰─ {id} [3] - │ ╰─ /profile [4] + │ ╰─ {id} [*] + │ ╰─ /profile [*] ├─ images/ - │ ╰─ {name} [8] + │ ╰─ {name} [*] │ ╰─ . - │ ╰─ {extension} [8] + │ ╰─ {extension} [*] ├─ files/ │ ╰─ {*path} - │ ╰─ /download [6] + │ ╰─ /download [*] ├─ posts/ │ ╰─ {year} │ ╰─ - │ ╰─ {month} │ ╰─ - - │ ╰─ {day} [5] - ╰─ {*catch_all} [9] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* - *-4-* - *-5-* - *-6-* - *-7-* - *-8-* - *-9-* + │ ╰─ {day} [*] + ╰─ {*catch_all} [*] "); Ok(()) diff --git a/tests/dynamic.rs b/tests/dynamic.rs index 27686816..f3009092 100644 --- a/tests/dynamic.rs +++ b/tests/dynamic.rs @@ -1,50 +1,31 @@ +use std::error::Error; + use similar_asserts::assert_eq; use smallvec::smallvec; -use std::error::Error; -use wayfind::{ - AuthorityMatch, Match, MethodMatch, PathMatch, RequestBuilder, RouteBuilder, Router, -}; +use wayfind::{Match, Router}; #[test] fn test_dynamic_simple() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{id}").build()?; - router.insert(&route, 1)?; + router.insert("/{id}", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / - ╰─ {id} [1] - === Method - Empty - === Chains - *-1-* + ╰─ {id} [*] "); - let request = RequestBuilder::new().path("/123").build()?; - let search = router.search(&request)?; + let search = router.search("/123")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{id}", - expanded: None, - parameters: smallvec![("id", "123")], - }, - method: MethodMatch { method: None } + route: "/{id}", + expanded: None, + parameters: smallvec![("id", "123")], }) ); - let request = RequestBuilder::new().path("/").build()?; - let search = router.search(&request)?; + let search = router.search("/")?; assert_eq!(search, None); Ok(()) @@ -53,86 +34,49 @@ fn test_dynamic_simple() -> Result<(), Box> { #[test] fn test_dynamic_multiple() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{year}").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/{year}/{month}").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/{year}/{month}/{day}").build()?; - router.insert(&route, 3)?; + router.insert("/{year}", 1)?; + router.insert("/{year}/{month}", 2)?; + router.insert("/{year}/{month}/{day}", 3)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / - ╰─ {year} [1] + ╰─ {year} [*] ╰─ / - ╰─ {month} [2] + ╰─ {month} [*] ╰─ / - ╰─ {day} [3] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* + ╰─ {day} [*] "); - let request = RequestBuilder::new().path("/2024").build()?; - let search = router.search(&request)?; + let search = router.search("/2024")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{year}", - expanded: None, - parameters: smallvec![("year", "2024")], - }, - method: MethodMatch { method: None } + route: "/{year}", + expanded: None, + parameters: smallvec![("year", "2024")], }) ); - let request = RequestBuilder::new().path("/2024/12").build()?; - let search = router.search(&request)?; + let search = router.search("/2024/12")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{year}/{month}", - expanded: None, - parameters: smallvec![("year", "2024"), ("month", "12")], - }, - method: MethodMatch { method: None } + route: "/{year}/{month}", + expanded: None, + parameters: smallvec![("year", "2024"), ("month", "12")], }) ); - let request = RequestBuilder::new().path("/2024/12/01").build()?; - let search = router.search(&request)?; + let search = router.search("/2024/12/01")?; assert_eq!( search, Some(Match { data: &3, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{year}/{month}/{day}", - expanded: None, - parameters: smallvec![("year", "2024"), ("month", "12"), ("day", "01")], - }, - method: MethodMatch { method: None } + route: "/{year}/{month}/{day}", + expanded: None, + parameters: smallvec![("year", "2024"), ("month", "12"), ("day", "01")], }) ); @@ -142,86 +86,49 @@ fn test_dynamic_multiple() -> Result<(), Box> { #[test] fn test_dynamic_inline() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{year}").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/{year}-{month}").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/{year}-{month}-{day}").build()?; - router.insert(&route, 3)?; + router.insert("/{year}", 1)?; + router.insert("/{year}-{month}", 2)?; + router.insert("/{year}-{month}-{day}", 3)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / - ╰─ {year} [1] + ╰─ {year} [*] ╰─ - - ╰─ {month} [2] + ╰─ {month} [*] ╰─ - - ╰─ {day} [3] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* + ╰─ {day} [*] "); - let request = RequestBuilder::new().path("/2024").build()?; - let search = router.search(&request)?; + let search = router.search("/2024")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{year}", - expanded: None, - parameters: smallvec![("year", "2024")], - }, - method: MethodMatch { method: None } + route: "/{year}", + expanded: None, + parameters: smallvec![("year", "2024")], }) ); - let request = RequestBuilder::new().path("/2024-12").build()?; - let search = router.search(&request)?; + let search = router.search("/2024-12")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{year}-{month}", - expanded: None, - parameters: smallvec![("year", "2024"), ("month", "12")], - }, - method: MethodMatch { method: None } + route: "/{year}-{month}", + expanded: None, + parameters: smallvec![("year", "2024"), ("month", "12")], }) ); - let request = RequestBuilder::new().path("/2024-12-01").build()?; - let search = router.search(&request)?; + let search = router.search("/2024-12-01")?; assert_eq!( search, Some(Match { data: &3, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{year}-{month}-{day}", - expanded: None, - parameters: smallvec![("year", "2024"), ("month", "12"), ("day", "01")], - }, - method: MethodMatch { method: None } + route: "/{year}-{month}-{day}", + expanded: None, + parameters: smallvec![("year", "2024"), ("month", "12"), ("day", "01")], }) ); @@ -231,63 +138,37 @@ fn test_dynamic_inline() -> Result<(), Box> { #[test] fn test_dynamic_greedy() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{file}.{extension}").build()?; - router.insert(&route, 1)?; + router.insert("/{file}.{extension}", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ╰─ {file} ╰─ . - ╰─ {extension} [1] - === Method - Empty - === Chains - *-1-* + ╰─ {extension} [*] "); - let request = RequestBuilder::new().path("/report").build()?; - let search = router.search(&request)?; + let search = router.search("/report")?; assert_eq!(search, None); - let request = RequestBuilder::new().path("/report.pdf").build()?; - let search = router.search(&request)?; + let search = router.search("/report.pdf")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{file}.{extension}", - expanded: None, - parameters: smallvec![("file", "report"), ("extension", "pdf")], - }, - method: MethodMatch { method: None } + route: "/{file}.{extension}", + expanded: None, + parameters: smallvec![("file", "report"), ("extension", "pdf")], }) ); - let request = RequestBuilder::new().path("/report.final.pdf").build()?; - let search = router.search(&request)?; + let search = router.search("/report.final.pdf")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{file}.{extension}", - expanded: None, - parameters: smallvec![("file", "report.final"), ("extension", "pdf")], - }, - method: MethodMatch { method: None } + route: "/{file}.{extension}", + expanded: None, + parameters: smallvec![("file", "report.final"), ("extension", "pdf")], }) ); @@ -297,110 +178,63 @@ fn test_dynamic_greedy() -> Result<(), Box> { #[test] fn test_dynamic_priority() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/robots.txt").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/robots.{extension}").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/{name}.txt").build()?; - router.insert(&route, 3)?; - let route = RouteBuilder::new().route("/{name}.{extension}").build()?; - router.insert(&route, 4)?; + router.insert("/robots.txt", 1)?; + router.insert("/robots.{extension}", 2)?; + router.insert("/{name}.txt", 3)?; + router.insert("/{name}.{extension}", 4)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ├─ robots. - │ ├─ txt [1] - │ ╰─ {extension} [2] + │ ├─ txt [*] + │ ╰─ {extension} [*] ╰─ {name} ╰─ . - ├─ txt [3] - ╰─ {extension} [4] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* - *-4-* + ├─ txt [*] + ╰─ {extension} [*] "); - let request = RequestBuilder::new().path("/robots.txt").build()?; - let search = router.search(&request)?; + let search = router.search("/robots.txt")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/robots.txt", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/robots.txt", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/robots.pdf").build()?; - let search = router.search(&request)?; + let search = router.search("/robots.pdf")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/robots.{extension}", - expanded: None, - parameters: smallvec![("extension", "pdf")], - }, - method: MethodMatch { method: None } + route: "/robots.{extension}", + expanded: None, + parameters: smallvec![("extension", "pdf")], }) ); - let request = RequestBuilder::new().path("/config.txt").build()?; - let search = router.search(&request)?; + let search = router.search("/config.txt")?; assert_eq!( search, Some(Match { data: &3, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{name}.txt", - expanded: None, - parameters: smallvec![("name", "config")], - }, - method: MethodMatch { method: None } + route: "/{name}.txt", + expanded: None, + parameters: smallvec![("name", "config")], }) ); - let request = RequestBuilder::new().path("/config.pdf").build()?; - let search = router.search(&request)?; + let search = router.search("/config.pdf")?; assert_eq!( search, Some(Match { data: &4, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{name}.{extension}", - expanded: None, - parameters: smallvec![("name", "config"), ("extension", "pdf")], - }, - method: MethodMatch { method: None } + route: "/{name}.{extension}", + expanded: None, + parameters: smallvec![("name", "config"), ("extension", "pdf")], }) ); diff --git a/tests/escape.rs b/tests/escape.rs index 05020559..a1a12dd1 100644 --- a/tests/escape.rs +++ b/tests/escape.rs @@ -1,48 +1,28 @@ +use std::error::Error; + use similar_asserts::assert_eq; use smallvec::smallvec; -use std::error::Error; -use wayfind::{ - AuthorityMatch, Match, MethodMatch, PathMatch, RequestBuilder, RouteBuilder, Router, -}; +use wayfind::{Match, Router}; #[test] fn test_escape_parameter() -> Result<(), Box> { let mut router = Router::new(); + router.insert(r"/users/\{id\}", 1)?; // "/users/{id}" - let route = RouteBuilder::new().route(r"/users/\{id\}").build()?; // "/users/{id}" - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users/{id} [1] - === Method - Empty - === Chains - *-1-* - "); + insta::assert_snapshot!(router, @"/users/{id} [*]"); - let request = RequestBuilder::new().path("/users/{id}").build()?; - let search = router.search(&request)?; + let search = router.search("/users/{id}")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: r"/users/\{id\}", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: r"/users/\{id\}", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/users/123").build()?; - let search = router.search(&request)?; + + let search = router.search("/users/123")?; assert_eq!(search, None); Ok(()) @@ -51,42 +31,22 @@ fn test_escape_parameter() -> Result<(), Box> { #[test] fn test_escape_group() -> Result<(), Box> { let mut router = Router::new(); + router.insert(r"/\(not-optional\)", 1)?; // "/(not-optional)" - let route = RouteBuilder::new().route(r"/\(not-optional\)").build()?; // "/(not-optional)" - router.insert(&route, 1)?; + insta::assert_snapshot!(router, @"/(not-optional) [*]"); - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /(not-optional) [1] - === Method - Empty - === Chains - *-1-* - "); - - let request = RequestBuilder::new().path("/(not-optional)").build()?; - let search = router.search(&request)?; + let search = router.search("/(not-optional)")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: r"/\(not-optional\)", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: r"/\(not-optional\)", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/optional").build()?; - let search = router.search(&request)?; + let search = router.search("/optional")?; assert_eq!(search, None); Ok(()) @@ -95,81 +55,47 @@ fn test_escape_group() -> Result<(), Box> { #[test] fn test_escape_nested() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route(r"(/a(/\{param\}))").build()?; // "(/a(/{param}))" - router.insert(&route, 1)?; + router.insert(r"(/a(/\{param\}))", 1)?; // "(/a(/{param}))" insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - / [1] - ╰─ a [1] - ╰─ /{param} [1] - === Method - Empty - === Chains - *-1-* + / [*] + ╰─ a [*] + ╰─ /{param} [*] "); - let request = RequestBuilder::new().path("/a/{param}").build()?; - let search = router.search(&request)?; + let search = router.search("/a/{param}")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: r"(/a(/\{param\}))", - expanded: Some("/a/\\{param\\}"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: r"(/a(/\{param\}))", + expanded: Some("/a/\\{param\\}"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/a/value").build()?; - let search = router.search(&request)?; + let search = router.search("/a/value")?; assert_eq!(search, None); - let request = RequestBuilder::new().path("/a").build()?; - let search = router.search(&request)?; + let search = router.search("/a")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: r"(/a(/\{param\}))", - expanded: Some("/a"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: r"(/a(/\{param\}))", + expanded: Some("/a"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/").build()?; - let search = router.search(&request)?; + let search = router.search("/")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: r"(/a(/\{param\}))", - expanded: Some("/"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: r"(/a(/\{param\}))", + expanded: Some("/"), + parameters: smallvec![], }) ); diff --git a/tests/gitlab.rs b/tests/gitlab.rs deleted file mode 100644 index cf4aab42..00000000 --- a/tests/gitlab.rs +++ /dev/null @@ -1,13819 +0,0 @@ -use gitlab_routes::{constraints, routes}; -use std::error::Error; -use wayfind::Router; - -#[path = "../benches/gitlab_routes.rs"] -pub mod gitlab_routes; - -#[test] -fn test_gitlab_insert() -> Result<(), Box> { - let mut router = Router::new(); - constraints(&mut router); - - for route in routes() { - let route = route.build()?; - router.insert(&route, true)?; - } - - Ok(()) -} - -#[test] -fn test_gitlab_delete() -> Result<(), Box> { - let mut router = Router::new(); - constraints(&mut router); - - for route in routes() { - let route = route.build()?; - router.insert(&route, true)?; - } - - for route in routes() { - let route = route.build()?; - router.delete(&route)?; - } - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - Empty - === Method - Empty - === Chains - Empty - "); - - Ok(()) -} - -#[test] -fn test_gitlab_display() -> Result<(), Box> { - let mut router = Router::new(); - constraints(&mut router); - - for route in routes() { - let route = route.build()?; - router.insert(&route, true)?; - } - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - / [6] - ├─ toogle_engine [1622] - │ ╰─ / - │ ├─ definitions [1620] - │ │ ╰─ . - │ │ ╰─ {format} [1620] - │ ╰─ {id} [1621] - │ ╰─ . - │ ╰─ {format} [1621] - ├─ jwt/auth [5] - │ ╰─ . - │ ╰─ {format} [5] - ├─ dashboard [271] - │ ├─ . - │ │ ╰─ {format} [271] - │ ╰─ / - │ ├─ todos [283] - │ │ ├─ . - │ │ │ ╰─ {format} [283] - │ │ ╰─ / - │ │ ├─ bulk_restore [280] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [280] - │ │ ├─ destroy_all [282] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [282] - │ │ ├─ vue [285] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [285] - │ │ ╰─ {id} [281] - │ │ ├─ /restore [284] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [284] - │ │ ╰─ . - │ │ ╰─ {format} [281] - │ ├─ activity [262] - │ │ ╰─ . - │ │ ╰─ {format} [262] - │ ├─ projects [272] - │ │ ├─ / - │ │ │ ├─ contributed [273] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [273] - │ │ │ ├─ inactive [274] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [274] - │ │ │ ├─ personal [276] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [276] - │ │ │ ├─ removed [277] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [277] - │ │ │ ├─ starred [278] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [278] - │ │ │ ╰─ member [275] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [275] - │ │ ╰─ . - │ │ ╰─ {format} [272] - │ ├─ snippets [279] - │ │ ╰─ . - │ │ ╰─ {format} [279] - │ ├─ groups [268] - │ │ ╰─ . - │ │ ╰─ {format} [268] - │ ├─ issues [263] - │ │ ╰─ . - │ │ ├─ ics [264] - │ │ ╰─ {format} [263] - │ ├─ labels [269] - │ │ ╰─ . - │ │ ╰─ {format} [269] - │ ╰─ m - │ ├─ erge_requests [265] - │ │ ├─ / - │ │ │ ├─ following [266] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [266] - │ │ │ ╰─ search [267] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [267] - │ │ ╰─ . - │ │ ╰─ {format} [265] - │ ╰─ ilestones [270] - │ ╰─ . - │ ╰─ {format} [270] - ├─ explore [293] - │ ├─ . - │ │ ╰─ {format} [293] - │ ╰─ / - │ ├─ dependencies [291] - │ │ ╰─ . - │ │ ╰─ {format} [291] - │ ├─ projects [294] - │ │ ├─ / - │ │ │ ├─ starred [297] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [297] - │ │ │ ╰─ t - │ │ │ ├─ rending [300] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [300] - │ │ │ ╰─ opics [299] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [299] - │ │ │ ╰─ / - │ │ │ ╰─ {topic_name:33} [298] - │ │ │ ╰─ . - │ │ │ ╰─ {format:32} [298] - │ │ ╰─ . - │ │ ╰─ {format} [294] - │ ├─ snippets [301] - │ │ ╰─ . - │ │ ╰─ {format} [301] - │ ├─ catalog [289] - │ │ ├─ . - │ │ │ ╰─ {format} [289] - │ │ ╰─ / - │ │ ├─ {*full_path} - │ │ │ ╰─ . - │ │ │ ╰─ {format} [290] - │ │ ╰─ {*full_path} [290] - │ ╰─ groups [292] - │ ╰─ . - │ ╰─ {format} [292] - ├─ u - │ ├─ sers [1529] - │ │ ├─ . - │ │ │ ╰─ {format} [1529] - │ │ ╰─ / - │ │ ├─ identity_verification [1690] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [1690] - │ │ │ ╰─ / - │ │ │ ├─ toggle_phone_exemption [1692] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1692] - │ │ │ ├─ arkose_labs_challenge [1686] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1686] - │ │ │ ├─ verif - │ │ │ │ ├─ y_ - │ │ │ │ │ ├─ phone_verification_code [1698] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1698] - │ │ │ │ │ ├─ arkose_labs_session [1694] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1694] - │ │ │ │ │ ├─ credit_card [1695] - │ │ │ │ │ │ ├─ _captcha [1696] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1696] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1695] - │ │ │ │ │ ╰─ email_code [1697] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1697] - │ │ │ │ ╰─ ication_state [1693] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1693] - │ │ │ ├─ res - │ │ │ │ ├─ end_email_code [1687] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1687] - │ │ │ │ ╰─ tricted [1688] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1688] - │ │ │ ╰─ s - │ │ │ ├─ end_phone_verification_code [1689] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1689] - │ │ │ ╰─ uccess [1691] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1691] - │ │ ├─ resend_verification_code [1597] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1597] - │ │ ├─ password [778] - │ │ │ ├─ / - │ │ │ │ ├─ complexity [777] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [777] - │ │ │ │ ├─ edit [779] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [779] - │ │ │ │ ╰─ new [780] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [780] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [778] - │ │ ├─ edit [1530] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1530] - │ │ ├─ a - │ │ │ ├─ uth [1471] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ kerberos/negotiate [762] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [762] - │ │ │ │ │ ╰─ geo/sign_ - │ │ │ │ │ ├─ out [1595] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1595] - │ │ │ │ │ ╰─ in [1593] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1593] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1471] - │ │ │ ╰─ lmost_there [254] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [254] - │ │ ├─ c - │ │ │ ├─ onfirmation [256] - │ │ │ │ ├─ /new [258] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [258] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [256] - │ │ │ ╰─ ancel [1528] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1528] - │ │ ├─ s - │ │ │ ├─ uccessful_verification [1598] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1598] - │ │ │ ╰─ ign_ - │ │ │ ├─ out [1596] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1596] - │ │ │ ├─ in [1594] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1594] - │ │ │ ╰─ up [1531] - │ │ │ ├─ / - │ │ │ │ ├─ company [1532] - │ │ │ │ │ ├─ /new [1533] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1533] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1532] - │ │ │ │ ├─ welcome [1536] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1536] - │ │ │ │ ╰─ groups [1534] - │ │ │ │ ├─ /new [1535] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1535] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1534] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1531] - │ │ ├─ u - │ │ │ ├─ pdate_email [1599] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1599] - │ │ │ ╰─ nlock [286] - │ │ │ ├─ /new [287] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [287] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [286] - │ │ ╰─ {username:35} [1513] - │ │ ├─ / - │ │ │ ├─ projects [1666] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1666] - │ │ │ ├─ unfollow [1671] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1671] - │ │ │ ├─ exists [1660] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1660] - │ │ │ ├─ follow [1661] - │ │ │ │ ├─ ers [1662] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1662] - │ │ │ │ ├─ ing [1663] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1663] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1661] - │ │ │ ├─ groups [1665] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1665] - │ │ │ ├─ a - │ │ │ │ ├─ vailable_ - │ │ │ │ │ ├─ project_templates [1656] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1656] - │ │ │ │ │ ╰─ group_templates [1655] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1655] - │ │ │ │ ╰─ ctivity [1654] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1654] - │ │ │ ├─ c - │ │ │ │ ├─ ontributed [1659] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1659] - │ │ │ │ ╰─ alendar [1657] - │ │ │ │ ├─ _activities [1658] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1658] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1657] - │ │ │ ╰─ s - │ │ │ ├─ nippets [1668] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1668] - │ │ │ ╰─ tarred [1670] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1670] - │ │ ╰─ . - │ │ ╰─ {format} [1513] - │ ├─ nsubscribes/ - │ │ ╰─ {email} [1702] - │ │ ╰─ . - │ │ ╰─ {format} [1702] - │ ╰─ ploads/ - │ ├─ -/system/ - │ │ ├─ temp/ - │ │ │ ╰─ {secret} - │ │ │ ╰─ / - │ │ │ ╰─ {filename:0} [1627] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1627] - │ │ ├─ {model:21} - │ │ │ ╰─ / - │ │ │ ╰─ {mounted_as:22} - │ │ │ ╰─ / - │ │ │ ╰─ {id} - │ │ │ ╰─ / - │ │ │ ╰─ {filename:0} [1628] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1628] - │ │ ├─ {model:23} - │ │ │ ╰─ / - │ │ │ ╰─ {mounted_as:24} - │ │ │ ╰─ / - │ │ │ ╰─ {id} - │ │ │ ╰─ / - │ │ │ ╰─ {filename:0} [1629] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1629] - │ │ ├─ {model:25} - │ │ │ ╰─ / - │ │ │ ╰─ {id:3} - │ │ │ ╰─ / - │ │ │ ╰─ {secret} - │ │ │ ╰─ / - │ │ │ ╰─ {filename:0} [1630] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1630] - │ │ ├─ {model:27} - │ │ │ ╰─ / - │ │ │ ╰─ {mounted_as:28} - │ │ │ ╰─ / - │ │ │ ╰─ {id} - │ │ │ ╰─ / - │ │ │ ╰─ {filename:26} [1631] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1631] - │ │ ├─ {model:29} - │ │ │ ╰─ / - │ │ │ ╰─ {mounted_as:22} - │ │ │ ╰─ / - │ │ │ ╰─ {id} - │ │ │ ╰─ / - │ │ │ ╰─ {filename:0} [1632] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1632] - │ │ ╰─ {model:30} - │ │ ╰─ / - │ │ ╰─ {mounted_as:31} - │ │ ╰─ / - │ │ ╰─ {id} - │ │ ╰─ / - │ │ ╰─ {filename:0} [1633] - │ │ ╰─ . - │ │ ╰─ {format} [1633] - │ ╰─ {model:25} [1626] - │ ├─ /authorize [1625] - │ │ ╰─ . - │ │ ╰─ {format} [1625] - │ ╰─ . - │ ╰─ {format} [1626] - ├─ v2 [417] - │ ╰─ / - │ ╰─ {*group_id} - │ ╰─ /dependency_proxy/containers/ - │ ╰─ {*image:19} - │ ╰─ / - │ ├─ manifests/ - │ │ ├─ {*tag} - │ │ │ ╰─ /upload [423] - │ │ │ ╰─ /authorize [419] - │ │ ╰─ {*tag} [421] - │ ╰─ blobs/ - │ ╰─ {sha:20} [420] - │ ╰─ /upload [422] - │ ╰─ /authorize [418] - ├─ .well-known/ - │ ├─ change-password [1518] - │ │ ╰─ . - │ │ ╰─ {format} [1518] - │ ├─ terraform.json [1618] - │ │ ╰─ . - │ │ ╰─ {format} [1618] - │ ├─ security.txt [1703] - │ │ ╰─ . - │ │ ╰─ {format} [1703] - │ ├─ webfinger [723] - │ │ ╰─ . - │ │ ╰─ {format} [723] - │ ╰─ o - │ ├─ auth-authorization-server [721] - │ │ ╰─ . - │ │ ╰─ {format} [721] - │ ╰─ penid-configuration [722] - │ ╰─ . - │ ╰─ {format} [722] - ├─ import/ - │ ├─ url/validate [701] - │ │ ╰─ . - │ │ ╰─ {format} [701] - │ ├─ manifest [693] - │ │ ├─ / - │ │ │ ├─ realtime_changes [695] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [695] - │ │ │ ├─ status [696] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [696] - │ │ │ ├─ upload [697] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [697] - │ │ │ ╰─ new [694] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [694] - │ │ ╰─ . - │ │ ╰─ {format} [693] - │ ├─ fogbugz [665] - │ │ ├─ / - │ │ │ ├─ realtime_changes [668] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [668] - │ │ │ ├─ callback [664] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [664] - │ │ │ ├─ user_map [666] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [666] - │ │ │ ├─ status [669] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [669] - │ │ │ ╰─ new [667] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [667] - │ │ ╰─ . - │ │ ╰─ {format} [665] - │ ├─ history [692] - │ │ ╰─ . - │ │ ╰─ {format} [692] - │ ├─ source_users/ - │ │ ╰─ {reassignment_token} [700] - │ │ ├─ . - │ │ │ ╰─ {format} [700] - │ │ ╰─ / - │ │ ├─ decline [699] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [699] - │ │ ╰─ accept [698] - │ │ ╰─ . - │ │ ╰─ {format} [698] - │ ├─ git - │ │ ├─ lab_ - │ │ │ ├─ project [690] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ authorize [689] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [689] - │ │ │ │ │ ╰─ new [691] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [691] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [690] - │ │ │ ╰─ group [688] - │ │ │ ├─ /authorize [687] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [687] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [688] - │ │ ├─ hub [679] - │ │ │ ├─ _group/status [686] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [686] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [679] - │ │ │ ╰─ / - │ │ │ ├─ personal_access_token [683] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [683] - │ │ │ ├─ realtime_changes [684] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [684] - │ │ │ ├─ failures [681] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [681] - │ │ │ ├─ details [680] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [680] - │ │ │ ├─ status [685] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [685] - │ │ │ ├─ new [682] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [682] - │ │ │ ╰─ c - │ │ │ ├─ ounts [678] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [678] - │ │ │ ╰─ a - │ │ │ ├─ llback [675] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [675] - │ │ │ ╰─ ncel [676] - │ │ │ ├─ _all [677] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [677] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [676] - │ │ ╰─ ea [670] - │ │ ├─ / - │ │ │ ├─ personal_access_token [672] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [672] - │ │ │ ├─ realtime_changes [673] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [673] - │ │ │ ├─ status [674] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [674] - │ │ │ ╰─ new [671] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [671] - │ │ ╰─ . - │ │ ╰─ {format} [670] - │ ╰─ b - │ ├─ ulk_imports [658] - │ │ ├─ / - │ │ │ ├─ realtime_changes [662] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [662] - │ │ │ ├─ configure [657] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [657] - │ │ │ ├─ history [660] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [660] - │ │ │ ├─ status [663] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [663] - │ │ │ ╰─ {id} - │ │ │ ╰─ /history [661] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [661] - │ │ │ ╰─ / - │ │ │ ╰─ {entity_id} - │ │ │ ╰─ /failures [659] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [659] - │ │ ╰─ . - │ │ ╰─ {format} [658] - │ ╰─ itbucket [648] - │ ├─ _server [653] - │ │ ├─ / - │ │ │ ├─ realtime_changes [655] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [655] - │ │ │ ├─ status [656] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [656] - │ │ │ ├─ new [654] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [654] - │ │ │ ╰─ c - │ │ │ ├─ onfigure [652] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [652] - │ │ │ ╰─ allback [651] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [651] - │ │ ╰─ . - │ │ ╰─ {format} [653] - │ ├─ . - │ │ ╰─ {format} [648] - │ ╰─ / - │ ├─ realtime_changes [649] - │ │ ╰─ . - │ │ ╰─ {format} [649] - │ ├─ callback [647] - │ │ ╰─ . - │ │ ╰─ {format} [647] - │ ╰─ status [650] - │ ╰─ . - │ ╰─ {format} [650] - ├─ oauth/ - │ ├─ introspect [760] - │ │ ╰─ . - │ │ ╰─ {format} [760] - │ ├─ userinfo [288] - │ │ ╰─ . - │ │ ╰─ {format} [288] - │ ├─ revoke [761] - │ │ ╰─ . - │ │ ╰─ {format} [761] - │ ├─ token [759] - │ │ ├─ /info [758] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [758] - │ │ ╰─ . - │ │ ╰─ {format} [759] - │ ├─ geo/ - │ │ ├─ callback [756] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [756] - │ │ ├─ logout [757] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [757] - │ │ ╰─ auth [755] - │ │ ╰─ . - │ │ ╰─ {format} [755] - │ ├─ a - │ │ ├─ pplications [742] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [742] - │ │ │ ╰─ / - │ │ │ ├─ new [746] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [746] - │ │ │ ╰─ {id} [743] - │ │ │ ├─ / - │ │ │ │ ├─ renew [747] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [747] - │ │ │ │ ╰─ edit [744] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [744] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [743] - │ │ ╰─ uthorize [748] - │ │ ├─ /native [749] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [749] - │ │ ├─ d_applications [751] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [751] - │ │ │ ╰─ / - │ │ │ ╰─ {id} [750] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [750] - │ │ ├─ _device [754] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [754] - │ │ ╰─ . - │ │ ╰─ {format} [748] - │ ╰─ d - │ ├─ iscovery/keys [720] - │ │ ╰─ . - │ │ ╰─ {format} [720] - │ ╰─ evice [752] - │ ├─ /confirm [753] - │ │ ╰─ . - │ │ ╰─ {format} [753] - │ ╰─ . - │ ╰─ {format} [752] - ├─ rails/ - │ ├─ features [12] - │ ├─ mailers [1462] - │ │ ├─ . - │ │ │ ╰─ {format} [1462] - │ │ ╰─ / - │ │ ╰─ {path} [1463] - │ │ ╰─ . - │ │ ╰─ {format} [1463] - │ ├─ info [1459] - │ │ ├─ / - │ │ │ ├─ properties [1460] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1460] - │ │ │ ╰─ routes [1461] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1461] - │ │ ╰─ . - │ │ ╰─ {format} [1459] - │ ╰─ l - │ ├─ etter_opener [8] - │ ╰─ ookbook [9] - ├─ -/ - │ ├─ http_router/version [4] - │ │ ╰─ . - │ │ ╰─ {format} [4] - │ ├─ kubernetes [252] - │ │ ├─ . - │ │ │ ╰─ {format} [252] - │ │ ╰─ / - │ │ ╰─ {agent_id} [253] - │ │ ├─ . - │ │ │ ╰─ {format} [253] - │ │ ╰─ / - │ │ ├─ {*vueroute} - │ │ │ ╰─ . - │ │ │ ╰─ {format} [253] - │ │ ╰─ {*vueroute} [253] - │ ├─ whats_new [1704] - │ │ ╰─ . - │ │ ╰─ {format} [1704] - │ ├─ liveness [621] - │ │ ╰─ . - │ │ ╰─ {format} [621] - │ ├─ user - │ │ ├─ s/ - │ │ │ ├─ broadcast_message_dismissals [1672] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1672] - │ │ │ ├─ group_callouts [1674] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1674] - │ │ │ ├─ callouts [1673] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1673] - │ │ │ ├─ terms [1701] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1701] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} - │ │ │ │ ╰─ / - │ │ │ │ ├─ decline [1700] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1700] - │ │ │ │ ╰─ accept [1699] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1699] - │ │ │ ╰─ p - │ │ │ ├─ roject_callouts [1685] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1685] - │ │ │ ╰─ ins [1684] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1684] - │ │ ╰─ _settings/ - │ │ ├─ identities [1640] - │ │ │ ├─ /new [1641] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1641] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1640] - │ │ ├─ gpg_keys [1637] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [1637] - │ │ │ ╰─ / - │ │ │ ╰─ {id} [1638] - │ │ │ ├─ /revoke [1639] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1639] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1638] - │ │ ├─ ssh_keys [1650] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [1650] - │ │ │ ╰─ / - │ │ │ ╰─ {id} [1651] - │ │ │ ├─ /revoke [1652] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1652] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1651] - │ │ ├─ a - │ │ │ ├─ uthentication_log [1653] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1653] - │ │ │ ├─ ctive_sessions [1635] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1635] - │ │ │ │ ╰─ / - │ │ │ │ ├─ saml [1636] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1636] - │ │ │ │ ╰─ {id} [1634] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1634] - │ │ │ ╰─ pplications [745] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [745] - │ │ ╰─ p - │ │ ├─ ersonal_access_tokens [1646] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [1646] - │ │ │ ╰─ / - │ │ │ ╰─ {id} - │ │ │ ╰─ /r - │ │ │ ├─ evoke [1647] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1647] - │ │ │ ╰─ otate [1648] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1648] - │ │ ├─ assword [1642] - │ │ │ ├─ / - │ │ │ │ ├─ reset [1645] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1645] - │ │ │ │ ├─ edit [1643] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1643] - │ │ │ │ ╰─ new [1644] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1644] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1642] - │ │ ╰─ rofile [1649] - │ │ ╰─ . - │ │ ╰─ {format} [1649] - │ ├─ ex - │ │ ├─ ternal_redirect [302] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [302] - │ │ ╰─ periment [7] - │ ├─ a - │ │ ├─ rkose/data_exchange_payload [229] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [229] - │ │ ├─ utocomplete/ - │ │ │ ├─ deploy_keys_with_owners [234] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [234] - │ │ │ ├─ namespace_routes [238] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [238] - │ │ │ ├─ group_subgroups [235] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [235] - │ │ │ ├─ award_emojis [233] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [233] - │ │ │ ├─ merge_request_ - │ │ │ │ ├─ source_branches [236] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [236] - │ │ │ │ ╰─ target_branches [237] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [237] - │ │ │ ├─ project - │ │ │ │ ├─ s [241] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [241] - │ │ │ │ ╰─ _ - │ │ │ │ ├─ groups [239] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [239] - │ │ │ │ ╰─ routes [240] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [240] - │ │ │ ╰─ users [243] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [243] - │ │ │ ╰─ / - │ │ │ ╰─ {id} [242] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [242] - │ │ ├─ cme-challenge [15] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [15] - │ │ ╰─ buse_reports [14] - │ │ ├─ /add_category [13] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [13] - │ │ ╰─ . - │ │ ╰─ {format} [14] - │ ├─ c - │ │ ├─ ustomers_dot/proxy/graphql [261] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [261] - │ │ ├─ haos/ - │ │ │ ├─ cpu_spin [245] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [245] - │ │ │ ├─ db_spin [246] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [246] - │ │ │ ├─ leakmem [249] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [249] - │ │ │ ├─ sleep [251] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [251] - │ │ │ ├─ kill [248] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [248] - │ │ │ ├─ quit [250] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [250] - │ │ │ ╰─ gc [247] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [247] - │ │ ╰─ ountr - │ │ ├─ y_states [260] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [260] - │ │ ╰─ ies [259] - │ │ ╰─ . - │ │ ╰─ {format} [259] - │ ├─ g - │ │ ├─ oogle_api/auth/callback [322] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [322] - │ │ ├─ itlab_subscriptions/hand_raise_leads [308] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [308] - │ │ ├─ raphql-explorer [2] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [2] - │ │ ╰─ / - │ │ ╰─ {id} [515] - │ │ ╰─ . - │ │ ╰─ {format} [515] - │ ├─ i - │ │ ├─ de [630] - │ │ │ ├─ ntity_verification [1676] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ toggle_phone_exemption [1678] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1678] - │ │ │ │ │ ├─ verif - │ │ │ │ │ │ ├─ ication_state [1679] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1679] - │ │ │ │ │ │ ╰─ y_ - │ │ │ │ │ │ ├─ phone_verification_code [1682] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1682] - │ │ │ │ │ │ ╰─ credit_card [1680] - │ │ │ │ │ │ ├─ _captcha [1681] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1681] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1680] - │ │ │ │ │ ╰─ s - │ │ │ │ │ ├─ end_phone_verification_code [1675] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1675] - │ │ │ │ │ ╰─ uccess [1677] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1677] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1676] - │ │ │ ╰─ / - │ │ │ ├─ reset_oauth_application_settings [64] - │ │ │ ├─ oauth_redirect [646] - │ │ │ ╰─ project [631] - │ │ │ ╰─ / - │ │ │ ╰─ {project_id:2} [632] - │ │ │ ╰─ / - │ │ │ ├─ blob [633] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*branch} - │ │ │ │ │ ╰─ /- [635] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {*path} [636] - │ │ │ │ ╰─ {*branch} [634] - │ │ │ ├─ edit [637] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*branch} - │ │ │ │ │ ╰─ /- [639] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {*path} [640] - │ │ │ │ ╰─ {*branch} [638] - │ │ │ ├─ tree [642] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*branch} - │ │ │ │ │ ╰─ /- [644] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {*path} [645] - │ │ │ │ ╰─ {*branch} [643] - │ │ │ ╰─ merge_requests/ - │ │ │ ╰─ {merge_request_id:3} [641] - │ │ ╰─ nvites/ - │ │ ╰─ {id:10} [704] - │ │ ├─ . - │ │ │ ╰─ {format} [704] - │ │ ╰─ / - │ │ ├─ decline [703] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [703] - │ │ ╰─ accept [702] - │ │ ╰─ . - │ │ ╰─ {format} [702] - │ ├─ j - │ │ ├─ ira - │ │ │ ├─ _connect [3] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ workspaces/search [718] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [718] - │ │ │ │ │ ├─ app_descriptor [705] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [705] - │ │ │ │ │ ├─ installations [710] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [710] - │ │ │ │ │ ├─ subscriptions [716] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [716] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [717] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [717] - │ │ │ │ │ ├─ repositories/ - │ │ │ │ │ │ ├─ associate [714] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [714] - │ │ │ │ │ │ ╰─ search [715] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [715] - │ │ │ │ │ ├─ public_keys/ - │ │ │ │ │ │ ╰─ {id} [713] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [713] - │ │ │ │ │ ├─ branches/ - │ │ │ │ │ │ ├─ route [707] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [707] - │ │ │ │ │ │ ╰─ new [706] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [706] - │ │ │ │ │ ├─ events/ - │ │ │ │ │ │ ├─ uninstalled [709] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [709] - │ │ │ │ │ │ ╰─ installed [708] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [708] - │ │ │ │ │ ╰─ oauth_ - │ │ │ │ │ ├─ application_id [711] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [711] - │ │ │ │ │ ╰─ callbacks [712] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [712] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [3] - │ │ │ ╰─ / - │ │ │ ╰─ {*namespace_id:53} - │ │ │ ╰─ / - │ │ │ ╰─ {project_id:53} [1464] - │ │ │ ├─ / - │ │ │ │ ├─ commit/ - │ │ │ │ │ ╰─ {id:47} [1465] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1465] - │ │ │ │ ╰─ tree/ - │ │ │ │ ├─ {*id} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1466] - │ │ │ │ ╰─ {*id} [1466] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1464] - │ │ ╰─ wks [719] - │ │ ╰─ . - │ │ ╰─ {format} [719] - │ ├─ m - │ │ ├─ e - │ │ │ ├─ mbers/mailgun/permanent_failures [739] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [739] - │ │ │ ╰─ trics [740] - │ │ │ ├─ /system [741] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [741] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [740] - │ │ ╰─ a - │ │ ├─ ilgun/webhooks [738] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [738] - │ │ ╰─ nifest [1457] - │ │ ╰─ . - │ │ ╰─ {format} [1457] - │ ├─ o - │ │ ├─ rganizations [770] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [770] - │ │ │ ╰─ / - │ │ │ ├─ preview_markdown [772] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [772] - │ │ │ ├─ new [771] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [771] - │ │ │ ╰─ {organization_path} [773] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [773] - │ │ │ ╰─ / - │ │ │ ├─ settings/general [776] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [776] - │ │ │ ├─ activity [768] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [768] - │ │ │ ├─ groups [765] - │ │ │ │ ├─ _and_projects [769] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [769] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [765] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [767] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [767] - │ │ │ │ ╰─ {*id} - │ │ │ │ ╰─ /edit [766] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [766] - │ │ │ ├─ users [774] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [774] - │ │ │ ╰─ projects/ - │ │ │ ╰─ {*namespace_id} - │ │ │ ╰─ / - │ │ │ ╰─ {id:4} - │ │ │ ╰─ /edit [775] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [775] - │ │ ├─ perations [763] - │ │ │ ├─ /environments [764] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [764] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [763] - │ │ ╰─ ffline [1458] - │ │ ╰─ . - │ │ ╰─ {format} [1458] - │ ├─ p - │ │ ├─ hone_verification/telesign_callback [782] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [782] - │ │ ├─ eek [10] - │ │ ├─ ush_from_secondary/ - │ │ │ ╰─ {geo_node_id} - │ │ │ ╰─ / - │ │ │ ├─ {*repository_path:5} - │ │ │ │ ╰─ / - │ │ │ │ ├─ info/ - │ │ │ │ │ ├─ lfs/ - │ │ │ │ │ │ ├─ objects [1558] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ batch [1554] - │ │ │ │ │ │ │ ╰─ {*oid} [1556] - │ │ │ │ │ │ ╰─ locks [1560] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ verify [1570] - │ │ │ │ │ │ ├─ new [1566] - │ │ │ │ │ │ ╰─ {id} [1562] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ unlock [1568] - │ │ │ │ │ │ ╰─ edit [1564] - │ │ │ │ │ ╰─ refs [1548] - │ │ │ │ ├─ ssh- - │ │ │ │ │ ├─ receive-pack [1550] - │ │ │ │ │ ╰─ upload-pack [1552] - │ │ │ │ ╰─ git - │ │ │ │ ├─ lab-lfs/objects/ - │ │ │ │ │ ├─ {*oid:6} - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ {*size:7} - │ │ │ │ │ │ │ ╰─ /authorize [1574] - │ │ │ │ │ │ ╰─ {*size:7} [1576] - │ │ │ │ │ ╰─ {*oid:6} [1572] - │ │ │ │ ╰─ - - │ │ │ │ ├─ receive-pack [1544] - │ │ │ │ ╰─ upload-pack [1546] - │ │ │ ├─ {*repository_path:9} - │ │ │ │ ╰─ /info/refs [1468] - │ │ │ ╰─ {*repository_path:8} [1467] - │ │ ├─ rofile/ - │ │ │ ├─ two_factor_auth [806] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ skip [810] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [810] - │ │ │ │ │ ├─ destroy_ - │ │ │ │ │ │ ├─ otp [808] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [808] - │ │ │ │ │ │ ╰─ webauthn/ - │ │ │ │ │ │ ╰─ {id} [809] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [809] - │ │ │ │ │ ╰─ c - │ │ │ │ │ ├─ reate_webauthn [807] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [807] - │ │ │ │ │ ╰─ odes [805] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [805] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [806] - │ │ │ ├─ u - │ │ │ │ ├─ pdate_username [786] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [786] - │ │ │ │ ╰─ sage_quotas [811] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [811] - │ │ │ ├─ notifications [801] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [801] - │ │ │ ├─ preferences [802] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [802] - │ │ │ ├─ billings [790] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [790] - │ │ │ ├─ emails [797] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ confirmation [255] - │ │ │ │ │ │ ├─ /new [257] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [257] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [255] - │ │ │ │ │ ╰─ {id} [798] - │ │ │ │ │ ├─ /resend_confirmation_instructions [799] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [799] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [798] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [797] - │ │ │ ├─ groups/ - │ │ │ │ ╰─ {*id:2} - │ │ │ │ ╰─ /notifications [800] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:13} [800] - │ │ │ ├─ reset_ - │ │ │ │ ├─ incoming_email_token [784] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [784] - │ │ │ │ ├─ static_object_token [785] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [785] - │ │ │ │ ╰─ feed_token [783] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [783] - │ │ │ ├─ slack/ - │ │ │ │ ├─ slack_link [804] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [804] - │ │ │ │ ╰─ edit [803] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [803] - │ │ │ ├─ a - │ │ │ │ ├─ pplications [1516] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1516] - │ │ │ │ ├─ udit_log [1517] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1517] - │ │ │ │ ├─ ccount [787] - │ │ │ │ │ ├─ /unlink [788] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [788] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [787] - │ │ │ │ ╰─ vatar [789] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [789] - │ │ │ ╰─ c - │ │ │ ├─ omment_templates [795] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [795] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [796] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [796] - │ │ │ ╰─ hat_names [791] - │ │ │ ├─ / - │ │ │ │ ├─ deny [792] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [792] - │ │ │ │ ├─ new [794] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [794] - │ │ │ │ ╰─ {id} [793] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [793] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [791] - │ │ ╰─ / - │ │ ╰─ {id} [1307] - │ │ ╰─ . - │ │ ╰─ {format} [1307] - │ ├─ r - │ │ ├─ unner_setup/platforms [1578] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1578] - │ │ ╰─ e - │ │ ├─ mote_development/workspaces [1537] - │ │ │ ├─ _feature_flag [1543] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1543] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [1537] - │ │ │ ╰─ / - │ │ │ ├─ new [1542] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1542] - │ │ │ ├─ {id} [1538] - │ │ │ │ ├─ /edit [1539] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1539] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1538] - │ │ │ ├─ {workspace_id} - │ │ │ │ ╰─ /workspaces [1540] - │ │ │ │ ├─ /new [1541] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1541] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1540] - │ │ │ ├─ {*vueroute} - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1537] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [1542] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1542] - │ │ │ │ ├─ {id} [1538] - │ │ │ │ │ ├─ /edit [1539] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1539] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1538] - │ │ │ │ ╰─ {workspace_id} - │ │ │ │ ╰─ /workspaces [1540] - │ │ │ │ ├─ /new [1541] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1541] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1540] - │ │ │ ╰─ {*vueroute} [1537] - │ │ ╰─ adiness [622] - │ │ ╰─ . - │ │ ╰─ {format} [622] - │ ├─ s - │ │ ├─ ubscriptions [311] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [311] - │ │ │ ╰─ / - │ │ │ ├─ validate_payment_method [315] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [315] - │ │ │ ├─ groups [304] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [304] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [306] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [306] - │ │ │ │ ╰─ {id} [307] - │ │ │ │ ├─ /edit [305] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [305] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [307] - │ │ │ ├─ new [312] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [312] - │ │ │ ├─ payment_ - │ │ │ │ ├─ method [314] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [314] - │ │ │ │ ╰─ form [313] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [313] - │ │ │ ╰─ buy_ - │ │ │ ├─ minutes [309] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [309] - │ │ │ ╰─ storage [310] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [310] - │ │ ├─ martcard/ - │ │ │ ├─ extract_certificate [1602] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1602] - │ │ │ ├─ verify_certificate [1603] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1603] - │ │ │ ╰─ auth [1601] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1601] - │ │ ├─ nippets [1605] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [1605] - │ │ │ ╰─ / - │ │ │ ├─ preview_markdown [1608] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1608] - │ │ │ ├─ new [1607] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1607] - │ │ │ ├─ {id:3} [1611] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1611] - │ │ │ │ ╰─ / - │ │ │ │ ├─ toggle_award_emoji [1612] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1612] - │ │ │ │ ├─ mark_as_spam [1606] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1606] - │ │ │ │ ├─ edit [1604] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1604] - │ │ │ │ ╰─ raw [1609] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1609] - │ │ │ ╰─ {snippet_id:3} - │ │ │ ╰─ / - │ │ │ ├─ notes [1614] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1614] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id:3} [1616] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ toggle_award_emoji [1617] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1617] - │ │ │ │ │ ╰─ delete_attachment [1615] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1615] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1616] - │ │ │ ╰─ raw/ - │ │ │ ╰─ {ref} - │ │ │ ╰─ / - │ │ │ ╰─ {*path} [1613] - │ │ ├─ andbox/ - │ │ │ ├─ mermaid [1579] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1579] - │ │ │ ╰─ swagger [1580] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1580] - │ │ ├─ / - │ │ │ ╰─ {username:12} [1527] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1527] - │ │ ╰─ e - │ │ ├─ curity [1515] - │ │ │ ├─ / - │ │ │ │ ├─ vulnerabilities [1591] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1591] - │ │ │ │ ├─ dashboard [1588] - │ │ │ │ │ ├─ /settings [1587] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1587] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1588] - │ │ │ │ ╰─ projects [1589] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1589] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [1590] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1590] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1515] - │ │ ╰─ nt_notifications/ - │ │ ╰─ {id:11} - │ │ ╰─ /unsubscribe [1592] - │ │ ╰─ . - │ │ ╰─ {format} [1592] - │ ├─ t - │ │ ├─ imelogs [1619] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1619] - │ │ ╰─ r - │ │ ├─ ack_namespace_visits [1683] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1683] - │ │ ╰─ ial - │ │ ├─ _registrations [1623] - │ │ │ ├─ /new [1624] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1624] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1623] - │ │ ╰─ s [316] - │ │ ├─ / - │ │ │ ├─ duo_ - │ │ │ │ ├─ enterprise [318] - │ │ │ │ │ ├─ /new [319] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [319] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [318] - │ │ │ │ ╰─ pro [320] - │ │ │ │ ├─ /new [321] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [321] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [320] - │ │ │ ╰─ new [317] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [317] - │ │ ╰─ . - │ │ ╰─ {format} [316] - │ ╰─ {model:1} - │ ╰─ / - │ ╰─ {model_id} - │ ╰─ /uploads/ - │ ╰─ {secret} - │ ╰─ / - │ ╰─ {filename:0} [244] - │ ╰─ . - │ ╰─ {format} [244] - ├─ he - │ ├─ alth_check [623] - │ │ ├─ . - │ │ │ ╰─ {format} [623] - │ │ ╰─ / - │ │ ╰─ {checks} [623] - │ │ ╰─ . - │ │ ╰─ {format} [623] - │ ╰─ lp [625] - │ ├─ / - │ │ ├─ instance_configuration [626] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [626] - │ │ ├─ shortcuts [628] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [628] - │ │ ├─ d - │ │ │ ├─ ocs [627] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [627] - │ │ │ ╰─ rawers/ - │ │ │ ├─ {*markdown_file} - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [624] - │ │ │ ╰─ {*markdown_file} [624] - │ │ ├─ {*path} - │ │ │ ╰─ . - │ │ │ ╰─ {format} [629] - │ │ ╰─ {*path} [629] - │ ╰─ . - │ ╰─ {format} [625] - ├─ a - │ ├─ pi/ - │ │ ├─ v4/geo/graphql [324] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [324] - │ │ ╰─ graphql [323] - │ │ ╰─ . - │ │ ╰─ {format} [323] - │ ╰─ dmin [95] - │ ├─ . - │ │ ╰─ {format} [95] - │ ╰─ / - │ ├─ namespace_limits [161] - │ │ ├─ /export_usage [160] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [160] - │ │ ╰─ . - │ │ ╰─ {format} [161] - │ ├─ organizations [162] - │ │ ╰─ . - │ │ ╰─ {format} [162] - │ ├─ version_check [228] - │ │ ╰─ . - │ │ ╰─ {format} [228] - │ ├─ topics [193] - │ │ ├─ . - │ │ │ ╰─ {format} [193] - │ │ ╰─ / - │ │ ├─ preview_markdown [198] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [198] - │ │ ├─ merge [196] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [196] - │ │ ├─ new [197] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [197] - │ │ ├─ {id} [194] - │ │ │ ├─ /edit [195] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [195] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [194] - │ │ ╰─ {topic_id} - │ │ ╰─ /avatar [199] - │ │ ╰─ . - │ │ ╰─ {format} [199] - │ ├─ jobs [150] - │ │ ├─ /cancel_all [149] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [149] - │ │ ╰─ . - │ │ ╰─ {format} [150] - │ ├─ us - │ │ ├─ age_trends [200] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [200] - │ │ ╰─ er - │ │ ├─ _permission_exports [201] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [201] - │ │ ╰─ s [208] - │ │ ├─ . - │ │ │ ╰─ {format} [208] - │ │ ╰─ / - │ │ ├─ new [217] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [217] - │ │ ├─ {user_id:34} - │ │ │ ╰─ / - │ │ │ ├─ keys/ - │ │ │ │ ╰─ {id:34} [151] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [151] - │ │ │ ╰─ i - │ │ │ ├─ mpersonation_tokens [138] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [138] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id:34} - │ │ │ │ ╰─ /revoke [139] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [139] - │ │ │ ╰─ dentities [134] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [134] - │ │ │ ╰─ / - │ │ │ ├─ new [137] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [137] - │ │ │ ╰─ {id:34} [135] - │ │ │ ├─ /edit [136] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [136] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [135] - │ │ ╰─ {id:34} [210] - │ │ ├─ . - │ │ │ ╰─ {format} [210] - │ │ ╰─ / - │ │ ├─ trust [223] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [223] - │ │ ├─ un - │ │ │ ├─ trust [227] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [227] - │ │ │ ├─ lock [226] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [226] - │ │ │ ╰─ b - │ │ │ ├─ lock [225] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [225] - │ │ │ ╰─ an [224] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [224] - │ │ ├─ edit [213] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [213] - │ │ ├─ keys [216] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [216] - │ │ ├─ re - │ │ │ ├─ set_runners_minutes [222] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [222] - │ │ │ ├─ ject [220] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [220] - │ │ │ ╰─ move/ - │ │ │ ╰─ {email_id} [221] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [221] - │ │ ├─ a - │ │ │ ├─ ctivate [202] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [202] - │ │ │ ╰─ pprove [203] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [203] - │ │ ├─ b - │ │ │ ├─ lock [205] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [205] - │ │ │ ╰─ an [204] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [204] - │ │ ├─ c - │ │ │ ├─ ard_match [206] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [206] - │ │ │ ╰─ onfirm [207] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [207] - │ │ ├─ d - │ │ │ ├─ isable_two_factor [212] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [212] - │ │ │ ╰─ e - │ │ │ ├─ stroy_identity_verification_exemption [211] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [211] - │ │ │ ╰─ activate [209] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [209] - │ │ ├─ i - │ │ │ ├─ dentity_verification_exemption [214] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [214] - │ │ │ ╰─ mpersonate [215] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [215] - │ │ ╰─ p - │ │ ├─ hone_match [218] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [218] - │ │ ╰─ rojects [219] - │ │ ╰─ . - │ │ ╰─ {format} [219] - │ ├─ a - │ │ ├─ i/self_hosted_models [22] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [22] - │ │ │ ╰─ / - │ │ │ ├─ terms_and_conditions [23] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [23] - │ │ │ ├─ {*vueroute} - │ │ │ │ ├─ /terms_and_conditions [23] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [23] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [22] - │ │ │ ╰─ {*vueroute} [22] - │ │ ├─ udit_log - │ │ │ ├─ _reports [65] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:14} [65] - │ │ │ ╰─ s [66] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [66] - │ │ ├─ buse_reports [20] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [20] - │ │ │ ╰─ / - │ │ │ ╰─ {id} [19] - │ │ │ ├─ /moderate_user [21] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [21] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [19] - │ │ ╰─ pplication - │ │ ├─ _settings [45] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [45] - │ │ │ ╰─ / - │ │ │ ├─ lets_encrypt_terms_of_service [30] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [30] - │ │ │ ├─ u - │ │ │ │ ├─ pdate_microsoft_application [46] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [46] - │ │ │ │ ╰─ sage_data [47] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [47] - │ │ │ ├─ metrics_and_profiling [31] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [31] - │ │ │ ├─ integrations [29] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [29] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [148] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [148] - │ │ │ │ ╰─ / - │ │ │ │ ├─ overrides [145] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [145] - │ │ │ │ ├─ reset [146] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [146] - │ │ │ │ ├─ edit [144] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [144] - │ │ │ │ ╰─ test [147] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [147] - │ │ │ ├─ preferences [34] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [34] - │ │ │ ├─ templates [44] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [44] - │ │ │ ├─ ge - │ │ │ │ ├─ neral [28] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [28] - │ │ │ │ ╰─ o [115] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [115] - │ │ │ ├─ r - │ │ │ │ ├─ oles_and_permissions [55] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [55] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [56] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [56] - │ │ │ │ │ ╰─ {id} [57] - │ │ │ │ │ ├─ /edit [54] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [54] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [57] - │ │ │ │ ╰─ e - │ │ │ │ ├─ set_ - │ │ │ │ │ ├─ error_tracking_access_token [37] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [37] - │ │ │ │ │ ├─ health_check_token [38] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [38] - │ │ │ │ │ ╰─ registration_token [39] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [39] - │ │ │ │ ╰─ po - │ │ │ │ ├─ sitory [36] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [36] - │ │ │ │ ╰─ rting [35] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [35] - │ │ │ ├─ a - │ │ │ │ ├─ dvanced_search [24] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [24] - │ │ │ │ ├─ ppearance [48] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ p - │ │ │ │ │ │ │ ├─ review_sign_in [52] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [52] - │ │ │ │ │ │ │ ╰─ wa_icon [53] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [53] - │ │ │ │ │ │ ├─ header_logos [50] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [50] - │ │ │ │ │ │ ├─ favicon [49] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [49] - │ │ │ │ │ │ ╰─ logo [51] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [51] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [48] - │ │ │ │ ╰─ nalytics [25] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [25] - │ │ │ ├─ c - │ │ │ │ ├─ lear_repository_check_states [27] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [27] - │ │ │ │ ╰─ i_cd [26] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [26] - │ │ │ ├─ n - │ │ │ │ ├─ amespace_storage [32] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [32] - │ │ │ │ ╰─ etwork [33] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [33] - │ │ │ ╰─ s - │ │ │ ├─ cim_oauth [58] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [58] - │ │ │ ├─ lack [186] - │ │ │ │ ├─ /slack_auth [187] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [187] - │ │ │ │ ├─ _app_manifest_ - │ │ │ │ │ ├─ download [42] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [42] - │ │ │ │ │ ╰─ share [43] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [43] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [186] - │ │ │ ╰─ e - │ │ │ ├─ curity_and_compliance [41] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [41] - │ │ │ ╰─ at_link_payload [40] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [40] - │ │ ╰─ s [59] - │ │ ├─ . - │ │ │ ╰─ {format} [59] - │ │ ╰─ / - │ │ ├─ new [62] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [62] - │ │ ╰─ {id} [60] - │ │ ├─ / - │ │ │ ├─ renew [63] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [63] - │ │ │ ╰─ edit [61] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [61] - │ │ ╰─ . - │ │ ╰─ {format} [60] - │ ├─ b - │ │ ├─ roadcast_messages [74] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [74] - │ │ │ ╰─ / - │ │ │ ├─ preview [77] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [77] - │ │ │ ╰─ {id} [75] - │ │ │ ├─ /edit [76] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [76] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [75] - │ │ ╰─ ackground_ - │ │ ├─ migrations [68] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [68] - │ │ │ ╰─ / - │ │ │ ├─ {id} [72] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [72] - │ │ │ │ ╰─ / - │ │ │ │ ├─ re - │ │ │ │ │ ├─ sume [70] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [70] - │ │ │ │ │ ╰─ try [71] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [71] - │ │ │ │ ╰─ pause [69] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [69] - │ │ │ ╰─ {background_migration_id} - │ │ │ ╰─ /batched_jobs/ - │ │ │ ╰─ {id} [73] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [73] - │ │ ╰─ jobs [67] - │ │ ╰─ . - │ │ ╰─ {format} [67] - │ ├─ c - │ │ ├─ i/variables [78] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [78] - │ │ ├─ lusters [85] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [85] - │ │ │ ╰─ / - │ │ │ ├─ new_cluster_docs [88] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [88] - │ │ │ ├─ c - │ │ │ │ ├─ reate_user [82] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [82] - │ │ │ │ ╰─ onnect [81] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [81] - │ │ │ ├─ {id} [83] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ environments [84] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [84] - │ │ │ │ │ ├─ metrics [86] - │ │ │ │ │ │ ├─ _dashboard [87] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [87] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [86] - │ │ │ │ │ ╰─ cl - │ │ │ │ │ ├─ uster_status [80] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [80] - │ │ │ │ │ ╰─ ear_cache [79] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [79] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [83] - │ │ │ ╰─ {cluster_id} - │ │ │ ╰─ /integration/create_or_update [89] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [89] - │ │ ├─ o - │ │ │ ├─ de_suggestions [1520] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1520] - │ │ │ ╰─ horts [90] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [90] - │ │ ╰─ redentials [92] - │ │ ├─ . - │ │ │ ╰─ {format} [92] - │ │ ╰─ / - │ │ ├─ {id} [91] - │ │ │ ├─ /revoke [94] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [94] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [91] - │ │ ╰─ {credential_id} - │ │ ╰─ /resources/ - │ │ ╰─ {resource_id} - │ │ ╰─ /revoke [93] - │ │ ╰─ . - │ │ ╰─ {format} [93] - │ ├─ d - │ │ ├─ ashboard/stats [96] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [96] - │ │ ╰─ e - │ │ ├─ v_ops_report [1519] - │ │ │ ├─ s [101] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [101] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1519] - │ │ ╰─ ploy_keys [97] - │ │ ├─ . - │ │ │ ╰─ {format} [97] - │ │ ╰─ / - │ │ ├─ new [100] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [100] - │ │ ╰─ {id} [98] - │ │ ├─ /edit [99] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [99] - │ │ ╰─ . - │ │ ╰─ {format} [98] - │ ├─ e - │ │ ├─ mail [106] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [106] - │ │ ╰─ lasticsearch/ - │ │ ├─ cancel_index_deletion [102] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [102] - │ │ ├─ trigger_reindexing [105] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [105] - │ │ ├─ retry_migration [104] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [104] - │ │ ╰─ enqueue_index [103] - │ │ ╰─ . - │ │ ╰─ {format} [103] - │ ├─ g - │ │ ├─ roups [121] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [121] - │ │ │ ╰─ / - │ │ │ ├─ new [125] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [125] - │ │ │ ├─ {*id} - │ │ │ │ ├─ / - │ │ │ │ │ ├─ reset_runners_minutes [126] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:18} [126] - │ │ │ │ │ ├─ members_update [124] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:18} [124] - │ │ │ │ │ ╰─ edit [123] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:18} [123] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:18} [122] - │ │ │ ╰─ {*id} [122] - │ │ ├─ eo [109] - │ │ │ ├─ / - │ │ │ │ ├─ s - │ │ │ │ │ ├─ ettings [116] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [116] - │ │ │ │ │ ╰─ ites [107] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [107] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [111] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [111] - │ │ │ │ │ ╰─ {id} [112] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [112] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ replication [110] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [110] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {replicable_name_plural} [114] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [114] - │ │ │ │ │ ╰─ edit [108] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [108] - │ │ │ │ ╰─ replication [1525] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1525] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {replicable_name_plural} [113] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [113] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [109] - │ │ ╰─ it - │ │ ├─ aly_servers [117] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [117] - │ │ ╰─ lab_duo [118] - │ │ ├─ / - │ │ │ ├─ seat_utilization [120] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [120] - │ │ │ ╰─ configuration [119] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [119] - │ │ ╰─ . - │ │ ╰─ {format} [118] - │ ├─ h - │ │ ├─ ealth_check [127] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [127] - │ │ ╰─ ooks [130] - │ │ ├─ . - │ │ │ ╰─ {format} [130] - │ │ ╰─ / - │ │ ├─ {id} [131] - │ │ │ ├─ / - │ │ │ │ ├─ edit [132] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [132] - │ │ │ │ ╰─ test [133] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [133] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [131] - │ │ ╰─ {hook_id} - │ │ ╰─ /hook_logs/ - │ │ ╰─ {id} [129] - │ │ ├─ /retry [128] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [128] - │ │ ╰─ . - │ │ ╰─ {format} [129] - │ ├─ i - │ │ ├─ n - │ │ │ ├─ stance_review [143] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [143] - │ │ │ ╰─ itial_setup [142] - │ │ │ ├─ /new [141] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [141] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [142] - │ │ ╰─ mpersonation [140] - │ │ ╰─ . - │ │ ╰─ {format} [140] - │ ├─ l - │ │ ├─ icense [156] - │ │ │ ├─ / - │ │ │ │ ├─ sync_seat_link [158] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [158] - │ │ │ │ ├─ usage_export [159] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [159] - │ │ │ │ ╰─ download [157] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [157] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [156] - │ │ ╰─ abels [152] - │ │ ├─ . - │ │ │ ╰─ {format} [152] - │ │ ╰─ / - │ │ ├─ new [155] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [155] - │ │ ╰─ {id} [153] - │ │ ├─ /edit [154] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [154] - │ │ ╰─ . - │ │ ╰─ {format} [153] - │ ├─ p - │ │ ├─ lan_limits [163] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [163] - │ │ ├─ ush_rule [169] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [169] - │ │ ╰─ rojects [166] - │ │ ├─ . - │ │ │ ╰─ {format} [166] - │ │ ╰─ / - │ │ ╰─ {*namespace_id} - │ │ ╰─ / - │ │ ├─ {id:4} [164] - │ │ │ ├─ / - │ │ │ │ ├─ repository_check [167] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [167] - │ │ │ │ ├─ transfer [168] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [168] - │ │ │ │ ╰─ edit [165] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [165] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [164] - │ │ ╰─ {project_id:4} - │ │ ╰─ /runner_projects [171] - │ │ ├─ . - │ │ │ ╰─ {format} [171] - │ │ ╰─ / - │ │ ╰─ {id:4} [172] - │ │ ╰─ . - │ │ ╰─ {format} [172] - │ ├─ r - │ │ ├─ unners [176] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [176] - │ │ │ ╰─ / - │ │ │ ├─ runner_setup_scripts [181] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [181] - │ │ │ ├─ dashboard [173] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [173] - │ │ │ ├─ tag_list [182] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [182] - │ │ │ ├─ new [177] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [177] - │ │ │ ╰─ {id} [174] - │ │ │ ├─ / - │ │ │ │ ├─ re - │ │ │ │ │ ├─ gister [179] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [179] - │ │ │ │ │ ╰─ sume [180] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [180] - │ │ │ │ ├─ pause [178] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [178] - │ │ │ │ ╰─ edit [175] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [175] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [174] - │ │ ╰─ ole_promotion_requests [170] - │ │ ╰─ . - │ │ ╰─ {format} [170] - │ ╰─ s - │ ├─ ubscription [191] - │ │ ╰─ . - │ │ ╰─ {format} [191] - │ ├─ ystem_info [192] - │ │ ╰─ . - │ │ ╰─ {format} [192] - │ ├─ pam_logs [189] - │ │ ├─ . - │ │ │ ╰─ {format} [189] - │ │ ╰─ / - │ │ ╰─ {id} [188] - │ │ ├─ /mark_as_ham [190] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [190] - │ │ ╰─ . - │ │ ╰─ {format} [188] - │ ├─ ession [183] - │ │ ├─ / - │ │ │ ├─ destroy [184] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [184] - │ │ │ ╰─ new [185] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [185] - │ │ ╰─ . - │ │ ╰─ {format} [183] - │ ╰─ idekiq [11] - ├─ f - │ ├─ iles/note/ - │ │ ╰─ {id} - │ │ ╰─ / - │ │ ╰─ {filename:0} [1526] - │ │ ╰─ . - │ │ ╰─ {format} [1526] - │ ╰─ avicon. - │ ├─ ico [1469] - │ │ ╰─ . - │ │ ╰─ {format} [1469] - │ ╰─ png [1470] - │ ╰─ . - │ ╰─ {format} [1470] - ├─ g - │ ├─ itlab_experiment_engine/ - │ │ ╰─ {id} [303] - │ │ ╰─ . - │ │ ╰─ {format} [303] - │ ╰─ roups [326] - │ ├─ . - │ │ ╰─ {format} [326] - │ ╰─ / - │ ├─ new [335] - │ │ ╰─ . - │ │ ╰─ {format} [335] - │ ├─ {*group_id:2} - │ │ ╰─ /-/ - │ │ ├─ analytics/dashboards [366] - │ │ │ ╰─ / - │ │ │ ╰─ {*vueroute} [366] - │ │ ├─ uploads/ - │ │ │ ╰─ {secret} - │ │ │ ╰─ / - │ │ │ ╰─ {filename:0} [601] - │ │ ╰─ wikis/ - │ │ ├─ {*id} - │ │ │ ╰─ / - │ │ │ ├─ preview_markdown [614] - │ │ │ ├─ history [611] - │ │ │ ├─ diff [608] - │ │ │ ├─ edit [609] - │ │ │ ╰─ raw [615] - │ │ ╰─ {*id} [607] - │ ├─ {*group_id} - │ │ ╰─ /-/ - │ │ ├─ w - │ │ │ ├─ ikis [606] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ -/confluence [403] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [403] - │ │ │ │ │ ├─ git_access [610] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [610] - │ │ │ │ │ ├─ templates [616] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [616] - │ │ │ │ │ ├─ pages [613] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [613] - │ │ │ │ │ ╰─ new [612] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [612] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [606] - │ │ │ ╰─ ork_items [619] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [619] - │ │ │ ╰─ / - │ │ │ ╰─ {iid} [620] - │ │ │ ├─ /descriptions/ - │ │ │ │ ╰─ {version_id} [617] - │ │ │ │ ├─ /diff [618] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [618] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [617] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [620] - │ │ ├─ notification_setting [506] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [506] - │ │ ├─ variables [605] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [605] - │ │ ├─ group_ - │ │ │ ├─ members [455] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [455] - │ │ │ │ ╰─ / - │ │ │ │ ├─ bulk_reassignment_file [452] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [452] - │ │ │ │ ├─ request_access [458] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [458] - │ │ │ │ ├─ export_csv [454] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [454] - │ │ │ │ ├─ leave [456] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [456] - │ │ │ │ ╰─ {id} [453] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [453] - │ │ │ │ ╰─ / - │ │ │ │ ├─ approve_access_request [450] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [450] - │ │ │ │ ├─ resend_invite [459] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [459] - │ │ │ │ ├─ override [457] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [457] - │ │ │ │ ├─ unban [460] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [460] - │ │ │ │ ╰─ ban [451] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [451] - │ │ │ ╰─ links/ - │ │ │ ╰─ {id:16} [449] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [449] - │ │ ├─ a - │ │ │ ├─ chievements [345] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [345] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [346] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [346] - │ │ │ │ ╰─ {id} - │ │ │ │ ╰─ /edit [344] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [344] - │ │ │ ├─ vatar [384] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [384] - │ │ │ ├─ dd_ons/discover_duo_ - │ │ │ │ ├─ enterprise [347] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [347] - │ │ │ │ ╰─ pro [348] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [348] - │ │ │ ├─ nalytics [1521] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1521] - │ │ │ │ ╰─ / - │ │ │ │ ├─ type_of_work/tasks_by_type [371] - │ │ │ │ │ ├─ /top_labels [372] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [372] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [371] - │ │ │ │ ├─ merge_request_analytics [368] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [368] - │ │ │ │ ├─ productivity_analytics [369] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [369] - │ │ │ │ ├─ value_stream_analytics [351] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ time_summary [361] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [361] - │ │ │ │ │ │ ├─ cycle_times [358] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [358] - │ │ │ │ │ │ ├─ lead_times [359] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [359] - │ │ │ │ │ │ ├─ summary [360] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [360] - │ │ │ │ │ │ ╰─ value_streams [362] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [362] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [365] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [365] - │ │ │ │ │ │ ├─ {id} [363] - │ │ │ │ │ │ │ ├─ /edit [364] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [364] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [363] - │ │ │ │ │ │ ╰─ {value_stream_id} - │ │ │ │ │ │ ╰─ /stages [355] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [355] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ average [352] - │ │ │ │ │ │ │ ├─ _duration_chart [353] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [353] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [352] - │ │ │ │ │ │ ├─ records [357] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [357] - │ │ │ │ │ │ ├─ median [356] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [356] - │ │ │ │ │ │ ╰─ count [354] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [354] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [351] - │ │ │ │ ├─ repository_analytics [370] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [370] - │ │ │ │ ├─ devops_adoption [367] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [367] - │ │ │ │ ╰─ c - │ │ │ │ ├─ overage_reports [350] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [350] - │ │ │ │ ├─ ycle_analytics [1514] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1514] - │ │ │ │ ╰─ i_cd [349] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [349] - │ │ │ ╰─ u - │ │ │ ├─ tocomplete_sources/ - │ │ │ │ ├─ vulnerabilities [382] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [382] - │ │ │ │ ├─ commands [374] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [374] - │ │ │ │ ├─ labels [378] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [378] - │ │ │ │ ├─ epics [375] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [375] - │ │ │ │ ├─ wikis [383] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [383] - │ │ │ │ ├─ i - │ │ │ │ │ ├─ terations [377] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [377] - │ │ │ │ │ ╰─ ssues [376] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [376] - │ │ │ │ ╰─ m - │ │ │ │ ├─ ilestones [381] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [381] - │ │ │ │ ╰─ e - │ │ │ │ ├─ rge_requests [380] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [380] - │ │ │ │ ╰─ mbers [379] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [379] - │ │ │ ╰─ dit_events [373] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [373] - │ │ ├─ b - │ │ │ ├─ illings [385] - │ │ │ │ ├─ /refresh_seats [386] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [386] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [385] - │ │ │ ╰─ oards [387] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [387] - │ │ │ ╰─ / - │ │ │ ╰─ {id:3} [388] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [388] - │ │ ├─ c - │ │ │ ├─ ustom_emoji [411] - │ │ │ │ ├─ /new [412] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [412] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [411] - │ │ │ ├─ hildren [389] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [389] - │ │ │ ├─ lusters [396] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [396] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new_cluster_docs [399] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [399] - │ │ │ │ ├─ c - │ │ │ │ │ ├─ reate_user [393] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [393] - │ │ │ │ │ ╰─ onnect [392] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [392] - │ │ │ │ ├─ {id} [394] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ environments [395] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [395] - │ │ │ │ │ │ ├─ metrics [397] - │ │ │ │ │ │ │ ├─ _dashboard [398] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [398] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [397] - │ │ │ │ │ │ ╰─ cl - │ │ │ │ │ │ ├─ uster_status [391] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [391] - │ │ │ │ │ │ ╰─ ear_cache [390] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [390] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [394] - │ │ │ │ ╰─ {cluster_id} - │ │ │ │ ╰─ /integration/create_or_update [400] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [400] - │ │ │ ├─ adences [478] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [478] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [479] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [479] - │ │ │ │ ├─ {id} [477] - │ │ │ │ │ ├─ /edit [480] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [480] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [477] - │ │ │ │ ├─ {iteration_cadence_id} - │ │ │ │ │ ╰─ /iterations [481] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ new [482] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [482] - │ │ │ │ │ │ ╰─ {id:3} [483] - │ │ │ │ │ │ ├─ /edit [484] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [484] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [483] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [481] - │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [478] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [479] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [479] - │ │ │ │ │ ├─ {id} [477] - │ │ │ │ │ │ ├─ /edit [480] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [480] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [477] - │ │ │ │ │ ╰─ {iteration_cadence_id} - │ │ │ │ │ ╰─ /iterations [481] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ new [482] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [482] - │ │ │ │ │ │ ╰─ {id:3} [483] - │ │ │ │ │ │ ├─ /edit [484] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [484] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [483] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [481] - │ │ │ │ ╰─ {*vueroute} [478] - │ │ │ ├─ rm/ - │ │ │ │ ├─ contacts [406] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [406] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [407] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [407] - │ │ │ │ │ ╰─ {id} - │ │ │ │ │ ╰─ /edit [405] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [405] - │ │ │ │ ╰─ organizations [409] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [409] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [410] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [410] - │ │ │ │ ╰─ {id} - │ │ │ │ ╰─ /edit [408] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [408] - │ │ │ ╰─ o - │ │ │ ├─ nt - │ │ │ │ ├─ ribution_analytics [404] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [404] - │ │ │ │ ╰─ ainer_registries [516] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [516] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [517] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [517] - │ │ │ ╰─ mment_templates [401] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [401] - │ │ │ ╰─ / - │ │ │ ╰─ {id} [402] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [402] - │ │ ├─ d - │ │ │ ├─ iscover [425] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [425] - │ │ │ ╰─ ep - │ │ │ ├─ loy_tokens/ - │ │ │ │ ╰─ {id:3} - │ │ │ │ ╰─ /revoke [424] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [424] - │ │ │ ╰─ endenc - │ │ │ ├─ y_proxy [416] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [416] - │ │ │ ╰─ ies [413] - │ │ │ ├─ /l - │ │ │ │ ├─ ocations [415] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [415] - │ │ │ │ ╰─ icenses [414] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [414] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [413] - │ │ ├─ e - │ │ │ ├─ arly_access_opt_in [426] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [426] - │ │ │ ╰─ pic - │ │ │ ├─ _boards [427] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [427] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [428] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [428] - │ │ │ ╰─ s [432] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [432] - │ │ │ ╰─ / - │ │ │ ├─ bulk_update [431] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [431] - │ │ │ ├─ new [438] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [438] - │ │ │ ├─ {epic_id:3} - │ │ │ │ ╰─ / - │ │ │ │ ├─ related_epic_links [447] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [447] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id:3} [448] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [448] - │ │ │ │ ├─ issues [429] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [429] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id:3} [430] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [430] - │ │ │ │ ├─ links [442] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [442] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id:3} [443] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [443] - │ │ │ │ ╰─ notes [444] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [444] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id:3} [445] - │ │ │ │ ├─ /toggle_award_emoji [446] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [446] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [445] - │ │ │ ╰─ {id:3} [435] - │ │ │ ├─ / - │ │ │ │ ├─ toggle_ - │ │ │ │ │ ├─ subscription [441] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [441] - │ │ │ │ │ ╰─ award_emoji [440] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [440] - │ │ │ │ ├─ realtime_changes [439] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [439] - │ │ │ │ ├─ edit [437] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [437] - │ │ │ │ ╰─ d - │ │ │ │ ├─ iscussions [436] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [436] - │ │ │ │ ╰─ escriptions/ - │ │ │ │ ╰─ {version_id} [433] - │ │ │ │ ├─ /diff [434] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [434] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [433] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [435] - │ │ ├─ h - │ │ │ ├─ arbor/repositories [462] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [462] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {id:17} [463] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [463] - │ │ │ │ ╰─ {repository_id:17} - │ │ │ │ ╰─ /artifacts [461] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [461] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {artifact_id:17} - │ │ │ │ ╰─ /tags [464] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [464] - │ │ │ ╰─ ooks [467] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [467] - │ │ │ ╰─ / - │ │ │ ├─ {id:3} [468] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ edit [469] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [469] - │ │ │ │ │ ╰─ test [470] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [470] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [468] - │ │ │ ╰─ {hook_id:3} - │ │ │ ╰─ /hook_logs/ - │ │ │ ╰─ {id:3} [466] - │ │ │ ├─ /retry [465] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [465] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [466] - │ │ ├─ i - │ │ │ ├─ n - │ │ │ │ ├─ frastructure_registry [1523] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1523] - │ │ │ │ ╰─ sights [474] - │ │ │ │ ├─ /query [473] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [473] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [474] - │ │ │ ├─ mport [471] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [471] - │ │ │ ├─ terations [486] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [486] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [487] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [487] - │ │ │ │ ╰─ {id:3} [488] - │ │ │ │ ├─ /edit [485] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [485] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [488] - │ │ │ ╰─ ssues - │ │ │ ├─ /bulk_update [475] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [475] - │ │ │ ╰─ _analytics [476] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [476] - │ │ ├─ l - │ │ │ ├─ dap - │ │ │ │ ├─ /sync [496] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [496] - │ │ │ │ ╰─ _group_links [494] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [494] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [495] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [495] - │ │ │ ╰─ abels [489] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [489] - │ │ │ ╰─ / - │ │ │ ├─ new [492] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [492] - │ │ │ ╰─ {id} [490] - │ │ │ ├─ / - │ │ │ │ ├─ toggle_subscription [493] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [493] - │ │ │ │ ╰─ edit [491] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [491] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [490] - │ │ ├─ m - │ │ │ ├─ erge_requests/bulk_update [497] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [497] - │ │ │ ╰─ ilestones [498] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [498] - │ │ │ ╰─ / - │ │ │ ├─ new [504] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [504] - │ │ │ ╰─ {id:0} [499] - │ │ │ ├─ / - │ │ │ │ ├─ merge_requests [503] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [503] - │ │ │ │ ├─ participants [505] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [505] - │ │ │ │ ├─ issues [501] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [501] - │ │ │ │ ├─ labels [502] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [502] - │ │ │ │ ╰─ edit [500] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [500] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [499] - │ │ ├─ p - │ │ │ ├─ ush_rules [514] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [514] - │ │ │ ├─ ackages [508] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [508] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [509] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [509] - │ │ │ ╰─ r - │ │ │ ├─ otected_ - │ │ │ │ ├─ environments [512] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [512] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id} [513] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [513] - │ │ │ │ ╰─ branches [510] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [510] - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {id} [511] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [511] - │ │ │ ╰─ eview_markdown [336] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [336] - │ │ ├─ r - │ │ │ ├─ unners [523] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [523] - │ │ │ │ ╰─ / - │ │ │ │ ├─ dashboard [520] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [520] - │ │ │ │ ├─ new [524] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [524] - │ │ │ │ ╰─ {id} [521] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ re - │ │ │ │ │ │ ├─ gister [526] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [526] - │ │ │ │ │ │ ╰─ sume [527] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [527] - │ │ │ │ │ ├─ pause [525] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [525] - │ │ │ │ │ ╰─ edit [522] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [522] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [521] - │ │ │ ├─ oadmap [519] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [519] - │ │ │ ╰─ e - │ │ │ ├─ leases [518] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [518] - │ │ │ ╰─ store [338] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [338] - │ │ ├─ s - │ │ │ ├─ hared_projects [594] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [594] - │ │ │ ├─ cim_oauth [532] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [532] - │ │ │ ├─ aml [530] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ u - │ │ │ │ │ │ ├─ pdate_microsoft_application [531] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [531] - │ │ │ │ │ │ ╰─ nlink [596] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [596] - │ │ │ │ │ ├─ callback [507] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [507] - │ │ │ │ │ ╰─ sso [595] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [595] - │ │ │ │ ├─ _group_links [528] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [528] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id} [529] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [529] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [530] - │ │ │ ╰─ e - │ │ │ ├─ ttings/ - │ │ │ │ ├─ packages_and_registries [581] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [581] - │ │ │ │ ├─ domain_verification [567] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [567] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [569] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [569] - │ │ │ │ │ ╰─ {id:0} [568] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ clean_certificate [566] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [566] - │ │ │ │ │ │ ├─ retry_auto_ssl [570] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [570] - │ │ │ │ │ │ ╰─ verify [571] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [571] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [568] - │ │ │ │ ├─ merge_requests [580] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [580] - │ │ │ │ ├─ i - │ │ │ │ │ ├─ ntegrations [576] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [576] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [579] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [579] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ reset [577] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [577] - │ │ │ │ │ │ ├─ edit [575] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [575] - │ │ │ │ │ │ ╰─ test [578] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [578] - │ │ │ │ │ ╰─ ssues [593] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [593] - │ │ │ │ ├─ gitlab_duo [572] - │ │ │ │ │ ├─ _usage [1522] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1522] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [572] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ seat_utilization [574] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [574] - │ │ │ │ │ ╰─ configuration [573] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [573] - │ │ │ │ ├─ workspaces [582] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [582] - │ │ │ │ ├─ ci_cd [564] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ deploy_token/create [584] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [584] - │ │ │ │ │ │ ├─ update_auto_devops [565] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [565] - │ │ │ │ │ │ ╰─ r - │ │ │ │ │ │ ├─ eset_registration_token [562] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [562] - │ │ │ │ │ │ ╰─ unner_setup_scripts [563] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [563] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [564] - │ │ │ │ ├─ slack [591] - │ │ │ │ │ ├─ /slack_auth [592] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [592] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [591] - │ │ │ │ ├─ a - │ │ │ │ │ ├─ ccess_tokens [554] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [554] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} - │ │ │ │ │ │ ╰─ /revoke [555] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [555] - │ │ │ │ │ ├─ pplications [557] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [557] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [560] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [560] - │ │ │ │ │ │ ╰─ {id} [558] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ renew [561] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [561] - │ │ │ │ │ │ │ ╰─ edit [559] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [559] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [558] - │ │ │ │ │ ╰─ nalytics [556] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [556] - │ │ │ │ ╰─ r - │ │ │ │ ├─ oles_and_permissions [588] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [588] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [589] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [589] - │ │ │ │ │ ╰─ {id} [590] - │ │ │ │ │ ├─ /edit [587] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [587] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [590] - │ │ │ │ ╰─ epo - │ │ │ │ ├─ sitory [586] - │ │ │ │ │ ├─ /deploy_token/create [585] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [585] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [586] - │ │ │ │ ╰─ rting [583] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [583] - │ │ │ ├─ rvice_accounts [551] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [551] - │ │ │ │ ╰─ / - │ │ │ │ ├─ new [552] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [552] - │ │ │ │ ├─ {id} [550] - │ │ │ │ │ ├─ /edit [553] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [553] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [550] - │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [551] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [552] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [552] - │ │ │ │ │ ╰─ {id} [550] - │ │ │ │ │ ├─ /edit [553] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [553] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [550] - │ │ │ │ ╰─ {*vueroute} [551] - │ │ │ ├─ at_usage [533] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [533] - │ │ │ ╰─ curity/ - │ │ │ ├─ merge_commit_reports [544] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:14} [544] - │ │ │ ├─ vulnerabilities [549] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [549] - │ │ │ ├─ policies [546] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [546] - │ │ │ │ ╰─ / - │ │ │ │ ├─ schema [548] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [548] - │ │ │ │ ├─ new [547] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [547] - │ │ │ │ ╰─ {id:0} - │ │ │ │ ╰─ /edit [545] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [545] - │ │ │ ├─ c - │ │ │ │ ├─ redentials [540] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [540] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id} [539] - │ │ │ │ │ ├─ /revoke [541] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [541] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [539] - │ │ │ │ ╰─ ompliance_ - │ │ │ │ ├─ standards_adherence_reports [537] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:14} [537] - │ │ │ │ ├─ project_framework_reports [536] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:14} [536] - │ │ │ │ ├─ framework_reports [535] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:14} [535] - │ │ │ │ ├─ violation_reports [538] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:14} [538] - │ │ │ │ ╰─ dashboard [534] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [534] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [534] - │ │ │ │ ╰─ {*vueroute} [534] - │ │ │ ╰─ d - │ │ │ ├─ ashboard [542] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [542] - │ │ │ ╰─ iscover [543] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [543] - │ │ ├─ t - │ │ │ ├─ erraform_module_registry [472] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [472] - │ │ │ ├─ wo_factor_auth [598] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [598] - │ │ │ ╰─ odos [597] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [597] - │ │ ╰─ u - │ │ ├─ sage_quotas [602] - │ │ │ ├─ / - │ │ │ │ ├─ subscription_history [604] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:14} [604] - │ │ │ │ ╰─ pending_members [603] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [603] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [602] - │ │ ╰─ ploads [600] - │ │ ├─ /authorize [599] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [599] - │ │ ╰─ . - │ │ ╰─ {format} [600] - │ ├─ {*id} - │ │ ├─ /-/ - │ │ │ ├─ unfoldered_environment_names [343] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [343] - │ │ │ ├─ merge_requests [334] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [334] - │ │ │ ├─ a - │ │ │ │ ├─ ctivity [325] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:15} [325] - │ │ │ │ ╰─ rchived [1524] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [1524] - │ │ │ ├─ projects [337] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [337] - │ │ │ ├─ transfer [342] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [342] - │ │ │ ├─ shared [341] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [341] - │ │ │ ├─ d - │ │ │ │ ├─ ownload_export [329] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:15} [329] - │ │ │ │ ╰─ etails [328] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [328] - │ │ │ ├─ e - │ │ │ │ ├─ xport [331] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:15} [331] - │ │ │ │ ╰─ dit [330] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [330] - │ │ │ ╰─ i - │ │ │ ├─ nactive [340] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:15} [340] - │ │ │ ╰─ ssues [332] - │ │ │ ╰─ . - │ │ │ ├─ ics [333] - │ │ │ ╰─ {format:15} [332] - │ │ ╰─ . - │ │ ╰─ {format:15} [339] - │ ╰─ {*id} [339] - ├─ l - │ ├─ ookbook_engine [729] - │ │ ╰─ / - │ │ ├─ cable [1] - │ │ ├─ embed [731] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [731] - │ │ │ ╰─ / - │ │ │ ├─ {*path} - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [732] - │ │ │ ╰─ {*path} [732] - │ │ ├─ p - │ │ │ ├─ review - │ │ │ │ ├─ s [736] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [736] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*path} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [737] - │ │ │ │ ╰─ {*path} [737] - │ │ │ ╰─ ages [734] - │ │ │ ├─ . - │ │ │ │ ╰─ {format} [734] - │ │ │ ╰─ / - │ │ │ ├─ {*path} - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [735] - │ │ │ ╰─ {*path} [735] - │ │ ├─ inspect/ - │ │ │ ├─ {*path} - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [733] - │ │ │ ╰─ {*path} [733] - │ │ ├─ {*path} - │ │ │ ╰─ . - │ │ │ ╰─ {format} [730] - │ │ ╰─ {*path} [730] - │ ╰─ etteropenerweb_engine [727] - │ ╰─ / - │ ├─ clear [725] - │ │ ╰─ . - │ │ ╰─ {format} [725] - │ ╰─ {id} [728] - │ ├─ . - │ │ ╰─ {format} [728] - │ ╰─ / - │ ├─ delete [726] - │ │ ╰─ . - │ │ ╰─ {format} [726] - │ ├─ attachments/ - │ │ ╰─ {file:0} [724] - │ │ ╰─ . - │ │ ╰─ {format} [724] - │ ╰─ {style} [728] - │ ╰─ . - │ ╰─ {format} [728] - ├─ p - │ ├─ eek_railtie/results [781] - │ │ ╰─ . - │ │ ╰─ {format} [781] - │ ├─ rojects [814] - │ │ ├─ / - │ │ │ ├─ new [821] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [821] - │ │ │ ╰─ {id} [1308] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1308] - │ │ ╰─ . - │ │ ╰─ {format} [814] - │ ╰─ ublic [295] - │ ├─ /projects [296] - │ │ ╰─ . - │ │ ╰─ {format} [296] - │ ╰─ . - │ ╰─ {format} [295] - ├─ s - │ ├─ nippets [1475] - │ │ ├─ . - │ │ │ ╰─ {format} [1475] - │ │ ╰─ / - │ │ ├─ {id:3} - │ │ │ ╰─ /raw [1610] - │ │ ├─ {*rest} - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1475] - │ │ ╰─ {*rest} [1475] - │ ├─ itemap [1600] - │ │ ╰─ . - │ │ ╰─ {format} [1600] - │ ╰─ earch [1586] - │ ├─ . - │ │ ╰─ {format} [1586] - │ ╰─ / - │ ├─ opensearch [1584] - │ │ ╰─ . - │ │ ╰─ {format} [1584] - │ ├─ settings [1585] - │ │ ╰─ . - │ │ ╰─ {format} [1585] - │ ├─ count [1583] - │ │ ╰─ . - │ │ ╰─ {format} [1583] - │ ╰─ a - │ ├─ ggregations [1581] - │ │ ╰─ . - │ │ ╰─ {format} [1581] - │ ╰─ utocomplete [1582] - │ ╰─ . - │ ╰─ {format} [1582] - ├─ {username:35} [1667] - │ ╰─ . - │ ├─ keys [1669] - │ │ ╰─ . - │ │ ╰─ {format} [1669] - │ ├─ gpg [1664] - │ │ ╰─ . - │ │ ╰─ {format} [1664] - │ ╰─ {format} [1667] - ├─ {*repository_path:5} - │ ╰─ / - │ ├─ info/ - │ │ ├─ lfs/ - │ │ │ ├─ objects [1559] - │ │ │ │ ╰─ / - │ │ │ │ ├─ batch [1555] - │ │ │ │ ╰─ {*oid} [1557] - │ │ │ ╰─ locks [1561] - │ │ │ ╰─ / - │ │ │ ├─ verify [1571] - │ │ │ ├─ new [1567] - │ │ │ ╰─ {id} [1563] - │ │ │ ╰─ / - │ │ │ ├─ unlock [1569] - │ │ │ ╰─ edit [1565] - │ │ ╰─ refs [1549] - │ ├─ ssh- - │ │ ├─ receive-pack [1551] - │ │ ╰─ upload-pack [1553] - │ ╰─ git - │ ├─ lab-lfs/objects/ - │ │ ├─ {*oid:6} - │ │ │ ╰─ / - │ │ │ ├─ {*size:7} - │ │ │ │ ╰─ /authorize [1575] - │ │ │ ╰─ {*size:7} [1577] - │ │ ╰─ {*oid:6} [1573] - │ ╰─ - - │ ├─ receive-pack [1545] - │ ╰─ upload-pack [1547] - ├─ {*repository_path:9} - │ ╰─ /info/refs [1474] - ├─ {*namespace_id:2} - │ ╰─ / - │ ├─ {project_id:4} [230] - │ │ ├─ / - │ │ │ ├─ uploads [1429] - │ │ │ │ ├─ / - │ │ │ │ │ ├─ authorize [1428] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1428] - │ │ │ │ │ ╰─ {secret} - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {filename:0} [1430] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1429] - │ │ │ ├─ hooks [1488] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1488] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1488] - │ │ │ │ ╰─ {*rest} [1488] - │ │ │ ├─ wikis [1504] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1504] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1504] - │ │ │ │ ╰─ {*rest} [1504] - │ │ │ ├─ n - │ │ │ │ ├─ ew/ - │ │ │ │ │ ╰─ {*id:46} [1508] - │ │ │ │ ╰─ ote - │ │ │ │ ├─ s [1227] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1227] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id:3} [1229] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ outdated_line_change [1231] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1231] - │ │ │ │ │ │ ├─ toggle_award_emoji [1233] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1233] - │ │ │ │ │ │ ├─ delete_attachment [1228] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1228] - │ │ │ │ │ │ ╰─ resolve [1232] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1232] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1229] - │ │ │ │ ╰─ able/ - │ │ │ │ ╰─ {target_type} - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {target_id} - │ │ │ │ ╰─ /notes [1230] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1230] - │ │ │ ├─ -/ - │ │ │ │ ├─ w - │ │ │ │ │ ├─ ork_items/ - │ │ │ │ │ │ ├─ import_csv [1454] - │ │ │ │ │ │ │ ├─ /authorize [1453] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1453] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1454] - │ │ │ │ │ │ ╰─ {iid} [1455] - │ │ │ │ │ │ ├─ /designs [1456] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {*vueroute} [1456] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1455] - │ │ │ │ │ ╰─ ikis [1442] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ -/confluence [956] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [956] - │ │ │ │ │ │ ├─ git_access [1446] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1446] - │ │ │ │ │ │ ├─ templates [1452] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1452] - │ │ │ │ │ │ ├─ pages [1449] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1449] - │ │ │ │ │ │ ├─ new [1448] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1448] - │ │ │ │ │ │ ├─ {*id} - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ preview_markdown [1450] - │ │ │ │ │ │ │ ├─ history [1447] - │ │ │ │ │ │ │ ├─ diff [1444] - │ │ │ │ │ │ │ ├─ edit [1445] - │ │ │ │ │ │ │ ╰─ raw [1451] - │ │ │ │ │ │ ╰─ {*id} [1443] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1442] - │ │ │ │ ├─ quality/test_cases [1302] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ new [1303] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1303] - │ │ │ │ │ │ ╰─ {id} [1304] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1304] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1302] - │ │ │ │ ├─ t - │ │ │ │ │ ├─ erraform [1419] - │ │ │ │ │ │ ├─ _module_registry [1237] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1237] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} [1238] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1238] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1419] - │ │ │ │ │ ├─ r - │ │ │ │ │ │ ├─ iggers [1426] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1426] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} [1427] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1427] - │ │ │ │ │ │ ├─ acing [1421] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1421] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} [1422] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1422] - │ │ │ │ │ │ ╰─ ee/ - │ │ │ │ │ │ ╰─ {*id:46} [1424] - │ │ │ │ │ ╰─ a - │ │ │ │ │ ├─ rget_branch_rules [1414] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1414] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [1415] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1415] - │ │ │ │ │ ╰─ gs [1411] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [1413] - │ │ │ │ │ ╰─ {id:42} [1412] - │ │ │ │ ├─ v - │ │ │ │ │ ├─ ulnerability_feedback [1434] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ count [1433] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1433] - │ │ │ │ │ │ │ ╰─ {id:3} [1435] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1435] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1434] - │ │ │ │ │ ╰─ a - │ │ │ │ │ ├─ lue_stream_analytics [957] - │ │ │ │ │ │ ├─ /events/ - │ │ │ │ │ │ │ ├─ staging [963] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [963] - │ │ │ │ │ │ │ ├─ review [962] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [962] - │ │ │ │ │ │ │ ├─ issue [959] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [959] - │ │ │ │ │ │ │ ├─ code [958] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [958] - │ │ │ │ │ │ │ ├─ test [964] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [964] - │ │ │ │ │ │ │ ╰─ p - │ │ │ │ │ │ │ ├─ roduction [961] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [961] - │ │ │ │ │ │ │ ╰─ lan [960] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [960] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [957] - │ │ │ │ │ ╰─ riables [1432] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1432] - │ │ │ │ ├─ s - │ │ │ │ │ ├─ ubscriptions [1409] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1409] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [1410] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1410] - │ │ │ │ │ ├─ nippets [1400] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1400] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [1402] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1402] - │ │ │ │ │ │ ├─ {id:3} [1405] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1405] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ toggle_award_emoji [1406] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1406] - │ │ │ │ │ │ │ ├─ mark_as_spam [1401] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1401] - │ │ │ │ │ │ │ ├─ edit [1399] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1399] - │ │ │ │ │ │ │ ╰─ raw [1403] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1403] - │ │ │ │ │ │ ╰─ {snippet_id:3} - │ │ │ │ │ │ ╰─ /raw/ - │ │ │ │ │ │ ╰─ {ref} - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {*path} [1407] - │ │ │ │ │ ├─ tarrers [1408] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1408] - │ │ │ │ │ ├─ chema/ - │ │ │ │ │ │ ╰─ {branch} - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {*filename} [1436] - │ │ │ │ │ ╰─ e - │ │ │ │ │ ├─ rvice_desk/custom_email [1369] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1369] - │ │ │ │ │ ├─ ttings/ - │ │ │ │ │ │ ├─ packages_and_registries [1391] - │ │ │ │ │ │ │ ├─ /cleanup_image_tags [1390] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1390] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1391] - │ │ │ │ │ │ ├─ merge_requests [1386] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1386] - │ │ │ │ │ │ ├─ integrations [1383] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1383] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ {integration_id:0} - │ │ │ │ │ │ │ │ ╰─ /hook_logs/ - │ │ │ │ │ │ │ │ ╰─ {id:0} [1381] - │ │ │ │ │ │ │ │ ├─ /retry [1380] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1380] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1381] - │ │ │ │ │ │ │ ╰─ {id:0} [1385] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1385] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ edit [1382] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1382] - │ │ │ │ │ │ │ ╰─ test [1384] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1384] - │ │ │ │ │ │ ├─ operations [1389] - │ │ │ │ │ │ │ ├─ /reset_ - │ │ │ │ │ │ │ │ ├─ pagerduty_token [1388] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1388] - │ │ │ │ │ │ │ │ ╰─ alerting_token [1387] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1387] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1389] - │ │ │ │ │ │ ├─ repository [1395] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1395] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ deploy_token/create [1394] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1394] - │ │ │ │ │ │ │ ├─ branch_rules [1374] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1374] - │ │ │ │ │ │ │ ╰─ cleanup [1392] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1392] - │ │ │ │ │ │ ├─ ci_cd [1379] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1379] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ deploy_token/create [1393] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1393] - │ │ │ │ │ │ │ ├─ export_job_token_authorizations [1375] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1375] - │ │ │ │ │ │ │ ╰─ r - │ │ │ │ │ │ │ ├─ unner_setup_scripts [1378] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1378] - │ │ │ │ │ │ │ ╰─ eset_ - │ │ │ │ │ │ │ ├─ registration_token [1377] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1377] - │ │ │ │ │ │ │ ╰─ cache [1376] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1376] - │ │ │ │ │ │ ├─ slack [1396] - │ │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ │ ├─ slack_auth [1398] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1398] - │ │ │ │ │ │ │ │ ╰─ edit [1397] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1397] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1396] - │ │ │ │ │ │ ╰─ a - │ │ │ │ │ │ ├─ ccess_tokens [1371] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1371] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} - │ │ │ │ │ │ │ ╰─ /revoke [1372] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1372] - │ │ │ │ │ │ ╰─ nalytics [1373] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1373] - │ │ │ │ │ ╰─ c - │ │ │ │ │ ├─ urity/ - │ │ │ │ │ │ ├─ scanned_resources [1359] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1359] - │ │ │ │ │ │ ├─ policies [1355] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1355] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ schema [1357] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1357] - │ │ │ │ │ │ │ ├─ new [1356] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1356] - │ │ │ │ │ │ │ ╰─ {id:0} - │ │ │ │ │ │ │ ╰─ /edit [1354] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1354] - │ │ │ │ │ │ ├─ vulnerabilit - │ │ │ │ │ │ │ ├─ y_report [1367] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1367] - │ │ │ │ │ │ │ ╰─ ies/ - │ │ │ │ │ │ │ ├─ new [1362] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1362] - │ │ │ │ │ │ │ ├─ {id} [1363] - │ │ │ │ │ │ │ │ ├─ /discussions [1361] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1361] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1363] - │ │ │ │ │ │ │ ╰─ {vulnerability_id} - │ │ │ │ │ │ │ ╰─ /notes [1364] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1364] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id:3} [1365] - │ │ │ │ │ │ │ ├─ /toggle_award_emoji [1366] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1366] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1365] - │ │ │ │ │ │ ├─ co - │ │ │ │ │ │ │ ├─ nfiguration [1344] - │ │ │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ │ │ ├─ corpus_management [1345] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1345] - │ │ │ │ │ │ │ │ │ ├─ profile_library [1348] - │ │ │ │ │ │ │ │ │ │ ├─ /dast_s - │ │ │ │ │ │ │ │ │ │ │ ├─ canner_profiles/ - │ │ │ │ │ │ │ │ │ │ │ │ ├─ new [1350] - │ │ │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1350] - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ {id} - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ /edit [1349] - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1349] - │ │ │ │ │ │ │ │ │ │ │ ╰─ ite_profiles/ - │ │ │ │ │ │ │ │ │ │ │ ├─ new [1352] - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1352] - │ │ │ │ │ │ │ │ │ │ │ ╰─ {id} - │ │ │ │ │ │ │ │ │ │ │ ╰─ /edit [1351] - │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1351] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1348] - │ │ │ │ │ │ │ │ │ ├─ api_fuzzing [1342] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1342] - │ │ │ │ │ │ │ │ │ ├─ dast [1347] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1347] - │ │ │ │ │ │ │ │ │ ╰─ s - │ │ │ │ │ │ │ │ │ ├─ ecret_detection [1360] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1360] - │ │ │ │ │ │ │ │ │ ╰─ ast [1358] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1358] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1344] - │ │ │ │ │ │ │ ╰─ mpliance_dashboard [1343] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1343] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1343] - │ │ │ │ │ │ │ ╰─ {*vueroute} [1343] - │ │ │ │ │ │ ╰─ d - │ │ │ │ │ │ ├─ ashboard [1346] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1346] - │ │ │ │ │ │ ╰─ iscover [1353] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1353] - │ │ │ │ │ ╰─ rets [1341] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1341] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1341] - │ │ │ │ │ ╰─ {*vueroute} [1341] - │ │ │ │ ├─ jobs [1098] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1098] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ artifacts/ - │ │ │ │ │ │ ╰─ {*ref_name_and_path} [868] - │ │ │ │ │ ├─ {job_id:3} - │ │ │ │ │ │ ╰─ /artifacts/ - │ │ │ │ │ │ ├─ download [863] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [863] - │ │ │ │ │ │ ├─ browse [861] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {*path} [861] - │ │ │ │ │ │ ├─ keep [867] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [867] - │ │ │ │ │ │ ├─ external_file/ - │ │ │ │ │ │ │ ╰─ {*path} [864] - │ │ │ │ │ │ ├─ file/ - │ │ │ │ │ │ │ ╰─ {*path} [865] - │ │ │ │ │ │ ╰─ raw/ - │ │ │ │ │ │ ╰─ {*path} [869] - │ │ │ │ │ ╰─ {id:3} [1104] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1104] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ unschedule [1110] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1110] - │ │ │ │ │ ├─ cancel [1096] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1096] - │ │ │ │ │ ├─ status [1105] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1105] - │ │ │ │ │ ├─ viewer [1111] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1111] - │ │ │ │ │ ├─ erase [1097] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1097] - │ │ │ │ │ ├─ p - │ │ │ │ │ │ ├─ roxy [1100] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ├─ ws/authorize [1101] - │ │ │ │ │ │ │ ╰─ {format} [1100] - │ │ │ │ │ │ ╰─ lay [1099] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1099] - │ │ │ │ │ ├─ r - │ │ │ │ │ │ ├─ etry [1103] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1103] - │ │ │ │ │ │ ╰─ aw [1102] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1102] - │ │ │ │ │ ╰─ t - │ │ │ │ │ ├─ race [1109] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:37} [1109] - │ │ │ │ │ ╰─ e - │ │ │ │ │ ├─ st_report_summary [1108] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1108] - │ │ │ │ │ ╰─ rminal [1106] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ├─ ws/authorize [1107] - │ │ │ │ │ ╰─ {format} [1106] - │ │ │ │ ├─ u - │ │ │ │ │ ├─ sage_quotas [1431] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1431] - │ │ │ │ │ ╰─ pdate/ - │ │ │ │ │ ╰─ {*id:46} [901] - │ │ │ │ ├─ de - │ │ │ │ │ ├─ sign_management/designs/ - │ │ │ │ │ │ ╰─ {design_id} - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ r - │ │ │ │ │ │ │ ├─ aw_image [981] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [981] - │ │ │ │ │ │ │ ╰─ esized_image/ - │ │ │ │ │ │ │ ╰─ {id} [982] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [982] - │ │ │ │ │ │ ╰─ {sha} - │ │ │ │ │ │ ╰─ /r - │ │ │ │ │ │ ├─ aw_image [981] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [981] - │ │ │ │ │ │ ╰─ esized_image/ - │ │ │ │ │ │ ╰─ {id} [982] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [982] - │ │ │ │ │ ╰─ p - │ │ │ │ │ ├─ loy_ - │ │ │ │ │ │ ├─ keys [969] - │ │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ │ ├─ enabled_keys [973] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [973] - │ │ │ │ │ │ │ │ ├─ new [974] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [974] - │ │ │ │ │ │ │ │ ├─ available_p - │ │ │ │ │ │ │ │ │ ├─ roject_keys [967] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [967] - │ │ │ │ │ │ │ │ │ ╰─ ublic_keys [968] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [968] - │ │ │ │ │ │ │ │ ╰─ {id:3} [975] - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [975] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ├─ disable [970] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [970] - │ │ │ │ │ │ │ │ ╰─ e - │ │ │ │ │ │ │ │ ├─ nable [972] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [972] - │ │ │ │ │ │ │ │ ╰─ dit [971] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [971] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [969] - │ │ │ │ │ │ ╰─ tokens/ - │ │ │ │ │ │ ╰─ {id:3} - │ │ │ │ │ │ ╰─ /revoke [976] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [976] - │ │ │ │ │ ╰─ endencies [965] - │ │ │ │ │ ├─ /licenses [966] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [966] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [965] - │ │ │ │ ├─ ne - │ │ │ │ │ ├─ twork/ - │ │ │ │ │ │ ╰─ {id:42} [1226] - │ │ │ │ │ ╰─ w/ - │ │ │ │ │ ╰─ {*id:46} [898] - │ │ │ │ ├─ on - │ │ │ │ │ ├─ call_schedules [1048] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1048] - │ │ │ │ │ ╰─ _demand_scans [1235] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1235] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ new [1236] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1236] - │ │ │ │ │ ╰─ {id} - │ │ │ │ │ ╰─ /edit [1234] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1234] - │ │ │ │ ├─ a - │ │ │ │ │ ├─ ws [1505] - │ │ │ │ │ │ ├─ /configuration [885] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [885] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1505] - │ │ │ │ │ ├─ lert_management [834] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [834] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [832] - │ │ │ │ │ │ ├─ /details [833] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [833] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ {*page} - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [833] - │ │ │ │ │ │ │ ╰─ {*page} [833] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [832] - │ │ │ │ │ ├─ r - │ │ │ │ │ │ ├─ tifacts [866] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [866] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} [862] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [862] - │ │ │ │ │ │ ╰─ chive/ - │ │ │ │ │ │ ╰─ {*id:33} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:36} [1324] - │ │ │ │ │ ├─ vatar [884] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [884] - │ │ │ │ │ ├─ nalytics/ - │ │ │ │ │ │ ├─ merge_request_analytics [855] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [855] - │ │ │ │ │ │ ├─ value_stream_analytics [840] - │ │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ │ ├─ time_summary [848] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [848] - │ │ │ │ │ │ │ │ ├─ summary [847] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [847] - │ │ │ │ │ │ │ │ ╰─ value_streams [849] - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [849] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ├─ new [852] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [852] - │ │ │ │ │ │ │ │ ├─ {id} [850] - │ │ │ │ │ │ │ │ │ ├─ /edit [851] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [851] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [850] - │ │ │ │ │ │ │ │ ╰─ {value_stream_id} - │ │ │ │ │ │ │ │ ╰─ /stages [844] - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [844] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ╰─ {id} - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ├─ average [841] - │ │ │ │ │ │ │ │ │ ├─ _duration_chart [842] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [842] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [841] - │ │ │ │ │ │ │ │ ├─ records [846] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [846] - │ │ │ │ │ │ │ │ ├─ median [845] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [845] - │ │ │ │ │ │ │ │ ╰─ count [843] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [843] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [840] - │ │ │ │ │ │ ├─ issues_analytics [854] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [854] - │ │ │ │ │ │ ├─ code_reviews [839] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [839] - │ │ │ │ │ │ ╰─ dashboards [853] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {*vueroute} [853] - │ │ │ │ │ ├─ pprover - │ │ │ │ │ │ ├─ _groups/ - │ │ │ │ │ │ │ ╰─ {id} [856] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [856] - │ │ │ │ │ │ ╰─ s/ - │ │ │ │ │ │ ╰─ {id} [858] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [858] - │ │ │ │ │ ╰─ u - │ │ │ │ │ ├─ to - │ │ │ │ │ │ ├─ mations [883] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [883] - │ │ │ │ │ │ ╰─ complete_sources/ - │ │ │ │ │ │ ├─ vulnerabilities [881] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [881] - │ │ │ │ │ │ ├─ snippets [880] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [880] - │ │ │ │ │ │ ├─ labels [876] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [876] - │ │ │ │ │ │ ├─ epics [873] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [873] - │ │ │ │ │ │ ├─ wikis [882] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [882] - │ │ │ │ │ │ ├─ co - │ │ │ │ │ │ │ ├─ mmands [871] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [871] - │ │ │ │ │ │ │ ╰─ ntacts [872] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [872] - │ │ │ │ │ │ ├─ i - │ │ │ │ │ │ │ ├─ terations [875] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [875] - │ │ │ │ │ │ │ ╰─ ssues [874] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [874] - │ │ │ │ │ │ ╰─ m - │ │ │ │ │ │ ├─ ilestones [879] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [879] - │ │ │ │ │ │ ╰─ e - │ │ │ │ │ │ ├─ rge_requests [878] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [878] - │ │ │ │ │ │ ╰─ mbers [877] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [877] - │ │ │ │ │ ╰─ dit_events [870] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [870] - │ │ │ │ ├─ b - │ │ │ │ │ ├─ adges/release [889] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:48} [889] - │ │ │ │ │ ├─ ranches [904] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ diverging_commit_counts [907] - │ │ │ │ │ │ ├─ new [909] - │ │ │ │ │ │ ├─ {state:45} [908] - │ │ │ │ │ │ ╰─ {id:42} [905] - │ │ │ │ │ ├─ oards [902] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [902] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id:3} [903] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [903] - │ │ │ │ │ ╰─ l - │ │ │ │ │ ├─ ame - │ │ │ │ │ │ ├─ _page/ - │ │ │ │ │ │ │ ╰─ {*id:46} [890] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ {*id:46} - │ │ │ │ │ │ │ ╰─ /streaming [893] - │ │ │ │ │ │ ╰─ {*id:46} [891] - │ │ │ │ │ ╰─ ob/ - │ │ │ │ │ ├─ {*id:46} - │ │ │ │ │ │ ╰─ /diff [896] - │ │ │ │ │ ╰─ {*id:46} [894] - │ │ │ │ ├─ c - │ │ │ │ │ ├─ ycle_analytics [1512] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1512] - │ │ │ │ │ ├─ adences [1089] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1089] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [1090] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1090] - │ │ │ │ │ │ ├─ {id} [1088] - │ │ │ │ │ │ │ ├─ /edit [1091] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1091] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1088] - │ │ │ │ │ │ ├─ {iteration_cadence_id} - │ │ │ │ │ │ │ ╰─ /iterations [1092] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1092] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id:3} [1093] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1093] - │ │ │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1089] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ new [1090] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1090] - │ │ │ │ │ │ │ ├─ {id} [1088] - │ │ │ │ │ │ │ │ ├─ /edit [1091] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1091] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1088] - │ │ │ │ │ │ │ ╰─ {iteration_cadence_id} - │ │ │ │ │ │ │ ╰─ /iterations [1092] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1092] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id:3} [1093] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1093] - │ │ │ │ │ │ ╰─ {*vueroute} [1089] - │ │ │ │ │ ├─ luster - │ │ │ │ │ │ ├─ _agents/ - │ │ │ │ │ │ │ ╰─ {name} [922] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [922] - │ │ │ │ │ │ ╰─ s [929] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [929] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new_cluster_docs [932] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [932] - │ │ │ │ │ │ ├─ c - │ │ │ │ │ │ │ ├─ reate_user [926] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [926] - │ │ │ │ │ │ │ ╰─ onnect [925] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [925] - │ │ │ │ │ │ ├─ {id} [927] - │ │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ │ ├─ environments [928] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [928] - │ │ │ │ │ │ │ │ ├─ metrics [930] - │ │ │ │ │ │ │ │ │ ├─ _dashboard [931] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [931] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [930] - │ │ │ │ │ │ │ │ ╰─ cl - │ │ │ │ │ │ │ │ ├─ uster_status [924] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [924] - │ │ │ │ │ │ │ │ ╰─ ear_cache [923] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [923] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [927] - │ │ │ │ │ │ ╰─ {cluster_id} - │ │ │ │ │ │ ╰─ /integration/create_or_update [933] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [933] - │ │ │ │ │ ├─ reate - │ │ │ │ │ │ ├─ _dir/ - │ │ │ │ │ │ │ ╰─ {*id:46} [1423] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {*id:46} [895] - │ │ │ │ │ ├─ i/ - │ │ │ │ │ │ ├─ prometheus_metrics/histograms [921] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format:37} [921] - │ │ │ │ │ │ ├─ daily_build_group_report_results [918] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format:38} [918] - │ │ │ │ │ │ ├─ editor [920] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [920] - │ │ │ │ │ │ ╰─ lint [919] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [919] - │ │ │ │ │ ╰─ om - │ │ │ │ │ ├─ pare [948] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ diff - │ │ │ │ │ │ │ ├─ _for_path [949] - │ │ │ │ │ │ │ ╰─ s_stream [955] - │ │ │ │ │ │ ├─ signatures [954] - │ │ │ │ │ │ ├─ {from:26} - │ │ │ │ │ │ │ ╰─ .. - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {to:26} [952] - │ │ │ │ │ │ │ ╰─ {to:26} [953] - │ │ │ │ │ │ ╰─ {from} - │ │ │ │ │ │ ╰─ .. - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {to} [950] - │ │ │ │ │ │ ╰─ {to} [951] - │ │ │ │ │ ╰─ m - │ │ │ │ │ ├─ ent_templates [934] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [934] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [935] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [935] - │ │ │ │ │ ╰─ it - │ │ │ │ │ ├─ s [945] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ {*id:46} - │ │ │ │ │ │ │ ╰─ /signatures [947] - │ │ │ │ │ │ ╰─ {*id:46} [946] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id:47} [943] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [943] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ merge_requests [940] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [940] - │ │ │ │ │ ├─ cherry_pick [937] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [937] - │ │ │ │ │ ├─ pipelines [941] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [941] - │ │ │ │ │ ├─ branches [936] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [936] - │ │ │ │ │ ├─ revert [942] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [942] - │ │ │ │ │ ╰─ diff - │ │ │ │ │ ├─ s_stream [944] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [944] - │ │ │ │ │ ╰─ _f - │ │ │ │ │ ├─ or_path [939] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [939] - │ │ │ │ │ ╰─ iles [938] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [938] - │ │ │ │ ├─ e - │ │ │ │ │ ├─ scalation_policies [1047] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1047] - │ │ │ │ │ ├─ rror_tracking [998] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [998] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ projects [1000] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1000] - │ │ │ │ │ │ ╰─ {issue_id} [999] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ stack_trace [1001] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1001] - │ │ │ │ │ │ │ ╰─ details [997] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [997] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [999] - │ │ │ │ │ ├─ nvironments [986] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [986] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ search [991] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [991] - │ │ │ │ │ │ ├─ new [990] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [990] - │ │ │ │ │ │ ├─ folders/ - │ │ │ │ │ │ │ ├─ {*id} - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format:13} [988] - │ │ │ │ │ │ │ ╰─ {*id} [988] - │ │ │ │ │ │ ├─ {environment_id} - │ │ │ │ │ │ │ ╰─ /deployments [978] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [978] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} [980] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [980] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ additional_metrics [977] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [977] - │ │ │ │ │ │ │ ╰─ metrics [979] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [979] - │ │ │ │ │ │ ╰─ {id} [992] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [992] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ cancel_auto_stop [985] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [985] - │ │ │ │ │ │ ├─ terminal [994] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ├─ ws/authorize [995] - │ │ │ │ │ │ │ ╰─ {format} [994] - │ │ │ │ │ │ ├─ edit [987] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [987] - │ │ │ │ │ │ ├─ stop [993] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [993] - │ │ │ │ │ │ ├─ k8s [989] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [989] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [989] - │ │ │ │ │ │ │ ╰─ {*vueroute} [989] - │ │ │ │ │ │ ╰─ prometheus/api/v1/ - │ │ │ │ │ │ ├─ {*proxy_path} - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [996] - │ │ │ │ │ │ ╰─ {*proxy_path} [996] - │ │ │ │ │ ╰─ dit/ - │ │ │ │ │ ╰─ {*id:46} [897] - │ │ │ │ ├─ f - │ │ │ │ │ ├─ eature_flags [1004] - │ │ │ │ │ │ ├─ _ - │ │ │ │ │ │ │ ├─ client/reset_token [1008] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1008] - │ │ │ │ │ │ │ ╰─ user_lists [1010] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1010] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ new [1011] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1011] - │ │ │ │ │ │ │ ╰─ {iid} [1012] - │ │ │ │ │ │ │ ├─ /edit [1009] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1009] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1012] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1004] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [1007] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1007] - │ │ │ │ │ │ ├─ {iid} [1005] - │ │ │ │ │ │ │ ├─ /edit [1006] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1006] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1005] - │ │ │ │ │ │ ╰─ {feature_flag_iid} - │ │ │ │ │ │ ╰─ /issues [1002] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1002] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [1003] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1003] - │ │ │ │ │ ├─ orks [1015] - │ │ │ │ │ │ ├─ /new [1016] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1016] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1015] - │ │ │ │ │ ╰─ i - │ │ │ │ │ ├─ nd_file/ - │ │ │ │ │ │ ╰─ {*id:46} [1014] - │ │ │ │ │ ╰─ les/ - │ │ │ │ │ ╰─ {*id:46} [1013] - │ │ │ │ ├─ g - │ │ │ │ │ ├─ oogle_cloud [1507] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1507] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ artifact_registry [1017] - │ │ │ │ │ │ │ ├─ /projects/ - │ │ │ │ │ │ │ │ ╰─ {project} - │ │ │ │ │ │ │ │ ╰─ /locations/ - │ │ │ │ │ │ │ │ ╰─ {location} - │ │ │ │ │ │ │ │ ╰─ /repositories/ - │ │ │ │ │ │ │ │ ╰─ {repository} - │ │ │ │ │ │ │ │ ╰─ /dockerImages/ - │ │ │ │ │ │ │ │ ╰─ {image} [1018] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1018] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1017] - │ │ │ │ │ │ ├─ service_accounts [1027] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1027] - │ │ │ │ │ │ ├─ configuration [1019] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1019] - │ │ │ │ │ │ ├─ revoke_oauth [1026] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1026] - │ │ │ │ │ │ ├─ gcp_regions [1025] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1025] - │ │ │ │ │ │ ╰─ d - │ │ │ │ │ │ ├─ eployments [1024] - │ │ │ │ │ │ │ ├─ /cloud_ - │ │ │ │ │ │ │ │ ├─ storage [1023] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1023] - │ │ │ │ │ │ │ │ ╰─ run [1022] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1022] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1024] - │ │ │ │ │ │ ╰─ atabases [1020] - │ │ │ │ │ │ ├─ /new/ - │ │ │ │ │ │ │ ╰─ {product} [1021] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1021] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1020] - │ │ │ │ │ ╰─ r - │ │ │ │ │ ├─ oup_links/ - │ │ │ │ │ │ ╰─ {id:16} [1033] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1033] - │ │ │ │ │ ╰─ aphs/ - │ │ │ │ │ ╰─ {id:42} [1032] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ languages [1031] - │ │ │ │ │ ╰─ c - │ │ │ │ │ ├─ ommits [1030] - │ │ │ │ │ ├─ harts [1028] - │ │ │ │ │ ╰─ i [1029] - │ │ │ │ ├─ h - │ │ │ │ │ ├─ arbor/repositories [1035] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1035] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ {id:17} [1036] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1036] - │ │ │ │ │ │ ╰─ {repository_id:17} - │ │ │ │ │ │ ╰─ /artifacts [1034] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1034] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {artifact_id:17} - │ │ │ │ │ │ ╰─ /tags [1037] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1037] - │ │ │ │ │ ╰─ ooks [1040] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1040] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {id:3} [1041] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ edit [1042] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1042] - │ │ │ │ │ │ │ ╰─ test [1043] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1043] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1041] - │ │ │ │ │ ╰─ {hook_id:3} - │ │ │ │ │ ╰─ /hook_logs/ - │ │ │ │ │ ╰─ {id:3} [1039] - │ │ │ │ │ ├─ /retry [1038] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1038] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1039] - │ │ │ │ ├─ i - │ │ │ │ │ ├─ terations [1094] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1094] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id:3} [1095] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1095] - │ │ │ │ │ ├─ mport [1045] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ jira [1044] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1044] - │ │ │ │ │ │ │ ╰─ new [1046] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1046] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1045] - │ │ │ │ │ ├─ ssues [1068] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ├─ ics [1066] - │ │ │ │ │ │ │ ╰─ {format} [1068] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ service_desk [1084] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1084] - │ │ │ │ │ │ ├─ bulk_update [1065] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1065] - │ │ │ │ │ │ ├─ export_csv [1076] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1076] - │ │ │ │ │ │ ├─ new [1080] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1080] - │ │ │ │ │ │ ├─ i - │ │ │ │ │ │ │ ├─ mport_csv [1077] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1077] - │ │ │ │ │ │ │ ╰─ ncident/ - │ │ │ │ │ │ │ ╰─ {id:3} [1052] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1052] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {incident_tab:41} [1052] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1052] - │ │ │ │ │ │ ├─ {issue_id:3} - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ feature_flags [1061] - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1061] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ╰─ {id:3} [1062] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1062] - │ │ │ │ │ │ │ ╰─ links [1063] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1063] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id:3} [1064] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1064] - │ │ │ │ │ │ ╰─ {id:3} [1073] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1073] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ toggle_ - │ │ │ │ │ │ │ ├─ subscription [1087] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1087] - │ │ │ │ │ │ │ ╰─ award_emoji [1086] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1086] - │ │ │ │ │ │ ├─ edit [1075] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1075] - │ │ │ │ │ │ ├─ re - │ │ │ │ │ │ │ ├─ altime_changes [1081] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1081] - │ │ │ │ │ │ │ ├─ lated_branches [1082] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1082] - │ │ │ │ │ │ │ ╰─ order [1083] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1083] - │ │ │ │ │ │ ├─ c - │ │ │ │ │ │ │ ├─ reate_merge_request [1069] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1069] - │ │ │ │ │ │ │ ╰─ an_create_branch [1067] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1067] - │ │ │ │ │ │ ├─ d - │ │ │ │ │ │ │ ├─ iscussions [1074] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1074] - │ │ │ │ │ │ │ ╰─ es - │ │ │ │ │ │ │ ├─ igns [1072] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ╰─ {*vueroute} [1072] - │ │ │ │ │ │ │ ╰─ criptions/ - │ │ │ │ │ │ │ ╰─ {version_id} [1070] - │ │ │ │ │ │ │ ├─ /diff [1071] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1071] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1070] - │ │ │ │ │ │ ├─ m - │ │ │ │ │ │ │ ├─ ark_as_spam [1078] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1078] - │ │ │ │ │ │ │ ╰─ ove [1079] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1079] - │ │ │ │ │ │ ╰─ {incident_tab:41} [1085] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1085] - │ │ │ │ │ ╰─ n - │ │ │ │ │ ├─ frastructure_registry [1511] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1511] - │ │ │ │ │ ├─ tegrations/ - │ │ │ │ │ │ ├─ zentao/issues [1059] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1059] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} [1060] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1060] - │ │ │ │ │ │ ├─ jira/issues [1055] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1055] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id} [1056] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1056] - │ │ │ │ │ │ ╰─ slash_commands [1058] - │ │ │ │ │ │ ├─ /confirm [1057] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1057] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1058] - │ │ │ │ │ ╰─ cident - │ │ │ │ │ ├─ _management/timeline_events/preview_markdown [1050] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1050] - │ │ │ │ │ ╰─ s [1051] - │ │ │ │ │ ├─ /integrations/pagerduty [1049] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1049] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1051] - │ │ │ │ ├─ l - │ │ │ │ │ ├─ earn_gitlab [1122] - │ │ │ │ │ │ ├─ /end_tutorial [1121] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1121] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1122] - │ │ │ │ │ ├─ abels [1112] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1112] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ set_priorities [1119] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1119] - │ │ │ │ │ │ ├─ generate [1115] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1115] - │ │ │ │ │ │ ├─ new [1116] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1116] - │ │ │ │ │ │ ╰─ {id:3} [1113] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ toggle_subscription [1120] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1120] - │ │ │ │ │ │ │ ├─ remove_priority [1118] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1118] - │ │ │ │ │ │ │ ├─ promote [1117] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1117] - │ │ │ │ │ │ │ ╰─ edit [1114] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1114] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1113] - │ │ │ │ │ ╰─ ogs [1123] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1123] - │ │ │ │ ├─ m - │ │ │ │ │ ├─ l/ - │ │ │ │ │ │ ├─ preview_markdown [1211] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1211] - │ │ │ │ │ │ ├─ experiments [1218] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1218] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {iid} [1217] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1217] - │ │ │ │ │ │ ├─ agents [1213] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1213] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ new [1214] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1214] - │ │ │ │ │ │ │ ├─ {id} [1212] - │ │ │ │ │ │ │ │ ├─ /edit [1215] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1215] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1212] - │ │ │ │ │ │ │ ├─ {*vueroute} - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1213] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ├─ new [1214] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1214] - │ │ │ │ │ │ │ │ ╰─ {id} [1212] - │ │ │ │ │ │ │ │ ├─ /edit [1215] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1215] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1212] - │ │ │ │ │ │ │ ╰─ {*vueroute} [1213] - │ │ │ │ │ │ ├─ candidates/ - │ │ │ │ │ │ │ ╰─ {iid} [1216] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1216] - │ │ │ │ │ │ ╰─ models [1224] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1224] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [1225] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1225] - │ │ │ │ │ │ ├─ {model_id} [1222] - │ │ │ │ │ │ │ ├─ /edit [1223] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1223] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1222] - │ │ │ │ │ │ ╰─ {model_model_id} - │ │ │ │ │ │ ╰─ /versions/ - │ │ │ │ │ │ ├─ new [1220] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1220] - │ │ │ │ │ │ ╰─ {model_version_id} [1221] - │ │ │ │ │ │ ├─ /edit [1219] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1219] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1221] - │ │ │ │ │ ├─ attermost [1124] - │ │ │ │ │ │ ├─ /new [1125] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1125] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1124] - │ │ │ │ │ ├─ e - │ │ │ │ │ │ ├─ trics [1197] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1197] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id:0} [1198] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1198] - │ │ │ │ │ │ ╰─ rge - │ │ │ │ │ │ ├─ d_branches [906] - │ │ │ │ │ │ ╰─ _ - │ │ │ │ │ │ ├─ requests [1151] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1151] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ new [1179] - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1179] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ├─ target_projects [1183] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1183] - │ │ │ │ │ │ │ │ ├─ pipelines [1181] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ├─ json [1182] - │ │ │ │ │ │ │ │ │ ╰─ {format} [1181] - │ │ │ │ │ │ │ │ ├─ branch_ - │ │ │ │ │ │ │ │ │ ├─ from [1175] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1175] - │ │ │ │ │ │ │ │ │ ╰─ to [1176] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1176] - │ │ │ │ │ │ │ │ ╰─ diff - │ │ │ │ │ │ │ │ ├─ _for_path [1177] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1177] - │ │ │ │ │ │ │ │ ╰─ s [1180] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ├─ json [1178] - │ │ │ │ │ │ │ │ ╰─ {format} [1180] - │ │ │ │ │ │ │ ├─ diff_for_path [1145] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1145] - │ │ │ │ │ │ │ ├─ bulk_update [1129] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1129] - │ │ │ │ │ │ │ ├─ export_csv [1149] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1149] - │ │ │ │ │ │ │ ├─ {merge_request_id:3} - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ├─ drafts [1191] - │ │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1191] - │ │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ │ ├─ discard [1193] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1193] - │ │ │ │ │ │ │ │ │ ├─ publish [1194] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1194] - │ │ │ │ │ │ │ │ │ ╰─ {id:3} [1192] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1192] - │ │ │ │ │ │ │ │ ╰─ approver - │ │ │ │ │ │ │ │ ├─ _groups/ - │ │ │ │ │ │ │ │ │ ╰─ {id:3} [857] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [857] - │ │ │ │ │ │ │ │ ╰─ s [860] - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [860] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ╰─ {id:3} [859] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [859] - │ │ │ │ │ │ │ ╰─ {id:3} [1144] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1144] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ license_scanning_reports [1152] - │ │ │ │ │ │ │ │ ├─ _collapsed [1153] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1153] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1152] - │ │ │ │ │ │ │ ├─ widget [1174] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1174] - │ │ │ │ │ │ │ ├─ pipeline - │ │ │ │ │ │ │ │ ├─ _status [1156] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1156] - │ │ │ │ │ │ │ │ ╰─ s [1165] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ├─ json [1157] - │ │ │ │ │ │ │ │ ╰─ {format} [1165] - │ │ │ │ │ │ │ ├─ me - │ │ │ │ │ │ │ │ ├─ trics_reports [1155] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1155] - │ │ │ │ │ │ │ │ ╰─ rge [1154] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1154] - │ │ │ │ │ │ │ ├─ re - │ │ │ │ │ │ │ │ ├─ solve_conflicts [1171] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1171] - │ │ │ │ │ │ │ │ ├─ move_wip [1159] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1159] - │ │ │ │ │ │ │ │ ├─ ports [1160] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1160] - │ │ │ │ │ │ │ │ ╰─ base [1158] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1158] - │ │ │ │ │ │ │ ├─ a - │ │ │ │ │ │ │ │ ├─ ccessibility_reports [1126] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1126] - │ │ │ │ │ │ │ │ ├─ ssign_related_issues [1128] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1128] - │ │ │ │ │ │ │ │ ╰─ pi_fuzzing_reports [1127] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1127] - │ │ │ │ │ │ │ ├─ c - │ │ │ │ │ │ │ │ ├─ o - │ │ │ │ │ │ │ │ │ ├─ verage_ - │ │ │ │ │ │ │ │ │ │ ├─ fuzzing_reports [1138] - │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1138] - │ │ │ │ │ │ │ │ │ │ ╰─ reports [1139] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1139] - │ │ │ │ │ │ │ │ │ ├─ dequality_ - │ │ │ │ │ │ │ │ │ │ ├─ mr_diff_reports [1132] - │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1132] - │ │ │ │ │ │ │ │ │ │ ╰─ reports [1133] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1133] - │ │ │ │ │ │ │ │ │ ├─ mmit - │ │ │ │ │ │ │ │ │ │ ├─ _change_content [1134] - │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1134] - │ │ │ │ │ │ │ │ │ │ ╰─ s [1164] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ├─ json [1135] - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1164] - │ │ │ │ │ │ │ │ │ ╰─ n - │ │ │ │ │ │ │ │ │ ├─ flict - │ │ │ │ │ │ │ │ │ │ ├─ _for_path [1170] - │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1170] - │ │ │ │ │ │ │ │ │ │ ╰─ s [1172] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1172] - │ │ │ │ │ │ │ │ │ ╰─ t - │ │ │ │ │ │ │ │ │ ├─ ainer_scanning_reports [1136] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1136] - │ │ │ │ │ │ │ │ │ ╰─ ext_commits [1137] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1137] - │ │ │ │ │ │ │ │ ├─ i_environments_status [1131] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1131] - │ │ │ │ │ │ │ │ ╰─ a - │ │ │ │ │ │ │ │ ├─ ncel_auto_merge [1130] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1130] - │ │ │ │ │ │ │ │ ╰─ ched_widget [1173] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1173] - │ │ │ │ │ │ │ ├─ d - │ │ │ │ │ │ │ │ ├─ ast_reports [1140] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1140] - │ │ │ │ │ │ │ │ ├─ i - │ │ │ │ │ │ │ │ │ ├─ scussions [1147] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1147] - │ │ │ │ │ │ │ │ │ ╰─ ff - │ │ │ │ │ │ │ │ │ ├─ s [1146] - │ │ │ │ │ │ │ │ │ │ ├─ _ - │ │ │ │ │ │ │ │ │ │ │ ├─ metadata [1187] - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1187] - │ │ │ │ │ │ │ │ │ │ │ ├─ stream [1190] - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1190] - │ │ │ │ │ │ │ │ │ │ │ ╰─ batch [1186] - │ │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1186] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ├─ json [1188] - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1146] - │ │ │ │ │ │ │ │ │ ╰─ _ - │ │ │ │ │ │ │ │ │ ├─ for_path [1189] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ├─ json [1185] - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1189] - │ │ │ │ │ │ │ │ │ ╰─ by_file_hash/ - │ │ │ │ │ │ │ │ │ ╰─ {file_hash} [1184] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1184] - │ │ │ │ │ │ │ │ ╰─ e - │ │ │ │ │ │ │ │ ├─ pendency_scanning_reports [1142] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1142] - │ │ │ │ │ │ │ │ ╰─ scriptions/ - │ │ │ │ │ │ │ │ ╰─ {version_id} [1141] - │ │ │ │ │ │ │ │ ├─ /diff [1143] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1143] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1141] - │ │ │ │ │ │ │ ├─ e - │ │ │ │ │ │ │ │ ├─ xposed_artifacts [1150] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1150] - │ │ │ │ │ │ │ │ ╰─ dit [1148] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1148] - │ │ │ │ │ │ │ ├─ s - │ │ │ │ │ │ │ │ ├─ ec - │ │ │ │ │ │ │ │ │ ├─ ret_detection_reports [1162] - │ │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ │ ╰─ {format} [1162] - │ │ │ │ │ │ │ │ │ ╰─ urity_reports [1163] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1163] - │ │ │ │ │ │ │ │ ╰─ a - │ │ │ │ │ │ │ │ ├─ ml_approval [1195] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1195] - │ │ │ │ │ │ │ │ ╰─ st_reports [1161] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1161] - │ │ │ │ │ │ │ ╰─ t - │ │ │ │ │ │ │ ├─ oggle_ - │ │ │ │ │ │ │ │ ├─ subscription [1169] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1169] - │ │ │ │ │ │ │ │ ╰─ award_emoji [1168] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1168] - │ │ │ │ │ │ │ ╰─ e - │ │ │ │ │ │ │ ├─ rraform_reports [1166] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1166] - │ │ │ │ │ │ │ ╰─ st_reports [1167] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1167] - │ │ │ │ │ │ ╰─ trains [1196] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1196] - │ │ │ │ │ ╰─ i - │ │ │ │ │ ├─ lestones [1199] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1199] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [1205] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1205] - │ │ │ │ │ │ ╰─ {id:3} [1200] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ merge_requests [1204] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1204] - │ │ │ │ │ │ │ ├─ p - │ │ │ │ │ │ │ │ ├─ articipants [1206] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1206] - │ │ │ │ │ │ │ │ ╰─ romote [1207] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1207] - │ │ │ │ │ │ │ ├─ issues [1202] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1202] - │ │ │ │ │ │ │ ├─ labels [1203] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1203] - │ │ │ │ │ │ │ ╰─ edit [1201] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1201] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1200] - │ │ │ │ │ ╰─ rror [1208] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ ssh_host_keys [1209] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format:37} [1209] - │ │ │ │ │ │ ╰─ update_now [1210] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1210] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1208] - │ │ │ │ ├─ p - │ │ │ │ │ ├─ ush_rules/ - │ │ │ │ │ │ ╰─ {id:3} [1301] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1301] - │ │ │ │ │ ├─ ipeline - │ │ │ │ │ │ ├─ _schedules [1254] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1254] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ new [1257] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1257] - │ │ │ │ │ │ │ ╰─ {id} [1255] - │ │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ │ ├─ take_ownership [1259] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1259] - │ │ │ │ │ │ │ │ ├─ edit [1256] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1256] - │ │ │ │ │ │ │ │ ╰─ play [1258] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1258] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1255] - │ │ │ │ │ │ ╰─ s [1264] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1264] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ settings [1281] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1281] - │ │ │ │ │ │ ├─ charts [1262] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1262] - │ │ │ │ │ │ ├─ latest [1274] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1274] - │ │ │ │ │ │ ├─ new [1271] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1271] - │ │ │ │ │ │ ├─ {id} [1265] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1265] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ downloadable_artifacts [1266] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1266] - │ │ │ │ │ │ │ ├─ manual_variables [1270] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1270] - │ │ │ │ │ │ │ ├─ test_report [1277] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1277] - │ │ │ │ │ │ │ ├─ failures [1267] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1267] - │ │ │ │ │ │ │ ├─ builds [1260] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1260] - │ │ │ │ │ │ │ ├─ retry [1272] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1272] - │ │ │ │ │ │ │ ├─ license - │ │ │ │ │ │ │ │ ├─ _count [1268] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1268] - │ │ │ │ │ │ │ │ ╰─ s [1269] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1269] - │ │ │ │ │ │ │ ├─ c - │ │ │ │ │ │ │ │ ├─ odequality_report [1263] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1263] - │ │ │ │ │ │ │ │ ╰─ ancel [1261] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1261] - │ │ │ │ │ │ │ ╰─ s - │ │ │ │ │ │ │ ├─ ecurity [1273] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1273] - │ │ │ │ │ │ │ ╰─ ta - │ │ │ │ │ │ │ ├─ tus [1276] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1276] - │ │ │ │ │ │ │ ╰─ ge [1275] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1275] - │ │ │ │ │ │ ├─ {pipeline_id} - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ stages/ - │ │ │ │ │ │ │ │ ╰─ {stage_name} - │ │ │ │ │ │ │ │ ╰─ /play_manual [1278] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1278] - │ │ │ │ │ │ │ ╰─ tests/ - │ │ │ │ │ │ │ ├─ summary [1280] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1280] - │ │ │ │ │ │ │ ╰─ {suite_name} [1279] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1279] - │ │ │ │ │ │ ╰─ {*ref} - │ │ │ │ │ │ ╰─ /latest [1274] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1274] - │ │ │ │ │ ├─ ackage - │ │ │ │ │ │ ├─ _files/ - │ │ │ │ │ │ │ ╰─ {id} - │ │ │ │ │ │ │ ╰─ /download [1239] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1239] - │ │ │ │ │ │ ╰─ s [1241] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1241] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [1240] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1240] - │ │ │ │ │ ╰─ r - │ │ │ │ │ ├─ o - │ │ │ │ │ │ ├─ tected_ - │ │ │ │ │ │ │ ├─ environments [1296] - │ │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1296] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ├─ search [1298] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1298] - │ │ │ │ │ │ │ │ ╰─ {id:3} [1297] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1297] - │ │ │ │ │ │ │ ├─ branches [1294] - │ │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ │ ╰─ {id:42} [1295] - │ │ │ │ │ │ │ ╰─ tags [1299] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {id:42} [1300] - │ │ │ │ │ │ ╰─ ject_members [1284] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1284] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ request_access [1286] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1286] - │ │ │ │ │ │ ├─ leave [1285] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1285] - │ │ │ │ │ │ ╰─ {id:39} [1283] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ approve_access_request [1282] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1282] - │ │ │ │ │ │ │ ╰─ resend_invite [1287] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1287] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1283] - │ │ │ │ │ ╰─ eview - │ │ │ │ │ ├─ _markdown [823] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [823] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {*id:46} [899] - │ │ │ │ ├─ r - │ │ │ │ │ ├─ unners [1334] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1334] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ toggle_ - │ │ │ │ │ │ │ ├─ shared_runners [1340] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1340] - │ │ │ │ │ │ │ ╰─ group_runners [1339] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1339] - │ │ │ │ │ │ ├─ new [1335] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1335] - │ │ │ │ │ │ ╰─ {id} [1332] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ re - │ │ │ │ │ │ │ │ ├─ gister [1337] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1337] - │ │ │ │ │ │ │ │ ╰─ sume [1338] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1338] - │ │ │ │ │ │ │ ├─ pause [1336] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1336] - │ │ │ │ │ │ │ ╰─ edit [1333] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1333] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1332] - │ │ │ │ │ ├─ aw/ - │ │ │ │ │ │ ╰─ {*id:46} [1305] - │ │ │ │ │ ╰─ e - │ │ │ │ │ ├─ quirements_management/requirements [1329] - │ │ │ │ │ │ ├─ /import_csv [1328] - │ │ │ │ │ │ │ ├─ /authorize [1327] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1327] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1328] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1329] - │ │ │ │ │ ├─ pository [1325] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1325] - │ │ │ │ │ ├─ leases [1319] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ permalink/latest [1320] - │ │ │ │ │ │ │ │ ├─ / [1320] - │ │ │ │ │ │ │ │ │ ╰─ {*suffix_path} [1320] - │ │ │ │ │ │ │ │ ╰─ {*suffix_path} [1320] - │ │ │ │ │ │ │ ├─ outbox [18] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [18] - │ │ │ │ │ │ │ ├─ inbox [16] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [16] - │ │ │ │ │ │ │ ├─ new [1321] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1321] - │ │ │ │ │ │ │ ╰─ {tag:40} [1322] - │ │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1322] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ├─ e - │ │ │ │ │ │ │ │ ├─ dit [1318] - │ │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ │ ╰─ {format} [1318] - │ │ │ │ │ │ │ │ ╰─ vidences/ - │ │ │ │ │ │ │ │ ╰─ {id} [1323] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1323] - │ │ │ │ │ │ │ ╰─ downloads/ - │ │ │ │ │ │ │ ╰─ {*filepath} [1317] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ├─ json [17] - │ │ │ │ │ │ ╰─ {format} [1319] - │ │ │ │ │ ╰─ fs/ - │ │ │ │ │ ├─ switch [1311] - │ │ │ │ │ ├─ {id:42} - │ │ │ │ │ │ ╰─ /logs_tree [1309] - │ │ │ │ │ ╰─ {id:43} - │ │ │ │ │ ╰─ /logs_tree/ - │ │ │ │ │ ╰─ {*path:44} [1310] - │ │ │ │ ╰─ {noteable_type} - │ │ │ │ ╰─ / - │ │ │ │ ╰─ {noteable_id} - │ │ │ │ ╰─ /discussions/ - │ │ │ │ ╰─ {id:49} [984] - │ │ │ │ ├─ /resolve [983] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [983] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [984] - │ │ │ ├─ de - │ │ │ │ ├─ pendencies [1483] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1483] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1483] - │ │ │ │ │ ╰─ {*rest} [1483] - │ │ │ │ ╰─ scription_templates/names/ - │ │ │ │ ╰─ {template_type:50} [1417] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format:37} [1417] - │ │ │ ├─ fi - │ │ │ │ ├─ nd_file [1487] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1487] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1487] - │ │ │ │ │ ╰─ {*rest} [1487] - │ │ │ │ ╰─ les [1486] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1486] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1486] - │ │ │ │ ╰─ {*rest} [1486] - │ │ │ ├─ a - │ │ │ │ ├─ udit_events [1477] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1477] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1477] - │ │ │ │ │ ╰─ {*rest} [1477] - │ │ │ │ ╰─ lert - │ │ │ │ ├─ s/notify [835] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [835] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {name} - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {endpoint_identifier:51} [836] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [836] - │ │ │ │ ╰─ _management [1476] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1476] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1476] - │ │ │ │ ╰─ {*rest} [1476] - │ │ │ ├─ b - │ │ │ │ ├─ adges [887] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [887] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {*ref} - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ coverage [886] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:48} [886] - │ │ │ │ │ ╰─ pipeline [888] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:48} [888] - │ │ │ │ ├─ uilds [915] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [915] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ artifacts/ - │ │ │ │ │ │ ╰─ {*ref_name_and_path} [913] - │ │ │ │ │ ├─ {build_id:3} - │ │ │ │ │ │ ╰─ /artifacts/ - │ │ │ │ │ │ ├─ download [911] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [911] - │ │ │ │ │ │ ├─ browse [910] - │ │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ │ ╰─ {*path} [910] - │ │ │ │ │ │ ├─ file/ - │ │ │ │ │ │ │ ╰─ {*path} [912] - │ │ │ │ │ │ ╰─ raw/ - │ │ │ │ │ │ ╰─ {*path} [914] - │ │ │ │ │ ╰─ {id:3} [917] - │ │ │ │ │ ├─ /raw [916] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [916] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [917] - │ │ │ │ ╰─ l - │ │ │ │ ├─ ame/ - │ │ │ │ │ ╰─ {*id:46} [892] - │ │ │ │ ╰─ ob/ - │ │ │ │ ╰─ {*id:46} [900] - │ │ │ ├─ c - │ │ │ │ ├─ ycle_analytics [1482] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1482] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1482] - │ │ │ │ │ ╰─ {*rest} [1482] - │ │ │ │ ├─ lusters [1478] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1478] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1478] - │ │ │ │ │ ╰─ {*rest} [1478] - │ │ │ │ ╰─ o - │ │ │ │ ├─ ntainer_registry [1313] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1313] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {id} [1312] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1312] - │ │ │ │ ╰─ m - │ │ │ │ ├─ pare [1481] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1481] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1481] - │ │ │ │ │ ╰─ {*rest} [1481] - │ │ │ │ ╰─ mit [1479] - │ │ │ │ ├─ s [1480] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1480] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1480] - │ │ │ │ │ ╰─ {*rest} [1480] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1479] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1479] - │ │ │ │ ╰─ {*rest} [1479] - │ │ │ ├─ e - │ │ │ │ ├─ rror_tracking [1485] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1485] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1485] - │ │ │ │ │ ╰─ {*rest} [1485] - │ │ │ │ ├─ nvironments [1484] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1484] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1484] - │ │ │ │ │ ╰─ {*rest} [1484] - │ │ │ │ ╰─ dit/ - │ │ │ │ ╰─ {*id:46} [1506] - │ │ │ ├─ i - │ │ │ │ ├─ de_terminals [1439] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format:37} [1439] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ check_config [1438] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:37} [1438] - │ │ │ │ │ ╰─ {id:3} [1441] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format:37} [1441] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ cancel [1437] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format:37} [1437] - │ │ │ │ │ ╰─ retry [1440] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:37} [1440] - │ │ │ │ ├─ nsights [1054] - │ │ │ │ │ ├─ /query [1053] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1053] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1054] - │ │ │ │ ╰─ ssues [1489] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1489] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1489] - │ │ │ │ ╰─ {*rest} [1489] - │ │ │ ├─ m - │ │ │ │ ├─ erge_requests [1491] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1491] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1491] - │ │ │ │ │ ╰─ {*rest} [1491] - │ │ │ │ ├─ attermost [1490] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1490] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1490] - │ │ │ │ │ ╰─ {*rest} [1490] - │ │ │ │ ╰─ irror [1492] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1492] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1492] - │ │ │ │ ╰─ {*rest} [1492] - │ │ │ ├─ p - │ │ │ │ ├─ ipeline - │ │ │ │ │ ├─ _schedules [1493] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1493] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1493] - │ │ │ │ │ │ ╰─ {*rest} [1493] - │ │ │ │ │ ╰─ s [1494] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1494] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1494] - │ │ │ │ │ ╰─ {*rest} [1494] - │ │ │ │ ├─ ro - │ │ │ │ │ ├─ tected_environments [1495] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1495] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1495] - │ │ │ │ │ │ ╰─ {*rest} [1495] - │ │ │ │ │ ╰─ metheus/ - │ │ │ │ │ ├─ metrics [1289] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ validate_query [1293] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1293] - │ │ │ │ │ │ │ ├─ active_common [1288] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1288] - │ │ │ │ │ │ │ ├─ new [1292] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1292] - │ │ │ │ │ │ │ ╰─ {id:0} [1290] - │ │ │ │ │ │ │ ├─ /edit [1291] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1291] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1290] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1289] - │ │ │ │ │ ╰─ alerts/ - │ │ │ │ │ ├─ notify [837] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [837] - │ │ │ │ │ ╰─ {id:3} - │ │ │ │ │ ╰─ /metrics_dashboard [838] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [838] - │ │ │ │ ╰─ a - │ │ │ │ ├─ ges [1242] - │ │ │ │ │ ├─ / - │ │ │ │ │ │ ├─ new [1243] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1243] - │ │ │ │ │ │ ╰─ domains [1245] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1245] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ├─ new [1248] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1248] - │ │ │ │ │ │ ╰─ {id:0} [1246] - │ │ │ │ │ │ ├─ / - │ │ │ │ │ │ │ ├─ clean_certificate [1244] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1244] - │ │ │ │ │ │ │ ├─ retry_auto_ssl [1249] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1249] - │ │ │ │ │ │ │ ├─ verify [1250] - │ │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ │ ╰─ {format} [1250] - │ │ │ │ │ │ │ ╰─ edit [1247] - │ │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ │ ╰─ {format} [1247] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1246] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1242] - │ │ │ │ ╰─ th_locks [1252] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1252] - │ │ │ │ ╰─ / - │ │ │ │ ├─ toggle [1253] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1253] - │ │ │ │ ╰─ {id} [1251] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1251] - │ │ │ ├─ r - │ │ │ │ ├─ unner - │ │ │ │ │ ├─ _projects [1330] - │ │ │ │ │ │ ├─ . - │ │ │ │ │ │ │ ╰─ {format} [1330] - │ │ │ │ │ │ ╰─ / - │ │ │ │ │ │ ╰─ {id} [1331] - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1331] - │ │ │ │ │ ╰─ s [1496] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1496] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1496] - │ │ │ │ │ ╰─ {*rest} [1496] - │ │ │ │ ├─ aw/ - │ │ │ │ │ ╰─ {*id:46} [1306] - │ │ │ │ ╰─ e - │ │ │ │ ├─ pository [1326] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1326] - │ │ │ │ ├─ store [827] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [827] - │ │ │ │ ├─ gistry/repository/ - │ │ │ │ │ ╰─ {repository_id} - │ │ │ │ │ ╰─ /tags [1316] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ bulk_destroy [1314] - │ │ │ │ │ ╰─ {id:52} [1315] - │ │ │ │ ╰─ fs/ - │ │ │ │ ├─ switch [1510] - │ │ │ │ ├─ {id:42} - │ │ │ │ │ ╰─ /logs_tree [1509] - │ │ │ │ ╰─ {id:43} - │ │ │ │ ╰─ /logs_tree/ - │ │ │ │ ╰─ {*path:44} [1472] - │ │ │ ├─ s - │ │ │ │ ├─ nippets [1499] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1499] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {id:3} - │ │ │ │ │ │ ╰─ /raw [1404] - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1499] - │ │ │ │ │ ╰─ {*rest} [1499] - │ │ │ │ ╰─ e - │ │ │ │ ├─ curity [1497] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1497] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1497] - │ │ │ │ │ ╰─ {*rest} [1497] - │ │ │ │ ╰─ rv - │ │ │ │ ├─ erless [1498] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1498] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1498] - │ │ │ │ │ ╰─ {*rest} [1498] - │ │ │ │ ╰─ ice_ - │ │ │ │ ├─ ping/web_ide_pipelines_count [1370] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1370] - │ │ │ │ ╰─ desk [1368] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [1368] - │ │ │ ├─ t - │ │ │ │ ├─ odos [1420] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1420] - │ │ │ │ ├─ ags [1500] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1500] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1500] - │ │ │ │ │ ╰─ {*rest} [1500] - │ │ │ │ ├─ emplates/ - │ │ │ │ │ ╰─ {template_type:50} [1416] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format:37} [1416] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ╰─ {key:0} [1418] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format:37} [1418] - │ │ │ │ ╰─ r - │ │ │ │ ├─ iggers [1501] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1501] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1501] - │ │ │ │ │ ╰─ {*rest} [1501] - │ │ │ │ ╰─ ee/ - │ │ │ │ ╰─ {*id:46} [1425] - │ │ │ ├─ v - │ │ │ │ ├─ ulnerability_feedback [1503] - │ │ │ │ │ ├─ . - │ │ │ │ │ │ ╰─ {format} [1503] - │ │ │ │ │ ╰─ / - │ │ │ │ │ ├─ {*rest} - │ │ │ │ │ │ ╰─ . - │ │ │ │ │ │ ╰─ {format} [1503] - │ │ │ │ │ ╰─ {*rest} [1503] - │ │ │ │ ╰─ ariables [1502] - │ │ │ │ ├─ . - │ │ │ │ │ ╰─ {format} [1502] - │ │ │ │ ╰─ / - │ │ │ │ ├─ {*rest} - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [1502] - │ │ │ │ ╰─ {*rest} [1502] - │ │ │ ├─ {*all} - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [231] - │ │ │ ╰─ {*all} [231] - │ │ ╰─ . - │ │ ╰─ {format} [230] - │ ╰─ {id:4} [815] - │ ├─ / - │ │ ├─ new_issuable_address [822] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [822] - │ │ ├─ generate_new_export [819] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [819] - │ │ ├─ download_export [816] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [816] - │ │ ├─ housekeeping [820] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [820] - │ │ ├─ un - │ │ │ ├─ foldered_environment_names [831] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [831] - │ │ │ ╰─ archive [830] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [830] - │ │ ├─ re - │ │ │ ├─ move_ - │ │ │ │ ├─ export [825] - │ │ │ │ │ ╰─ . - │ │ │ │ │ ╰─ {format} [825] - │ │ │ │ ╰─ fork [826] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [826] - │ │ │ ╰─ fs [824] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [824] - │ │ ├─ a - │ │ │ ├─ ctivity [812] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [812] - │ │ │ ╰─ rchive [813] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [813] - │ │ ├─ e - │ │ │ ├─ xport [818] - │ │ │ │ ╰─ . - │ │ │ │ ╰─ {format} [818] - │ │ │ ╰─ dit [817] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [817] - │ │ ╰─ t - │ │ ├─ oggle_star [828] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [828] - │ │ ╰─ ransfer [829] - │ │ ╰─ . - │ │ ╰─ {format} [829] - │ ╰─ . - │ ╰─ {format} [815] - ├─ {*namespace_id:53} - │ ╰─ / - │ ╰─ {project_id:53} [1464] - │ ├─ / - │ │ ├─ commit/ - │ │ │ ╰─ {id:47} [1465] - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1465] - │ │ ╰─ tree/ - │ │ ├─ {*id} - │ │ │ ╰─ . - │ │ │ ╰─ {format} [1466] - │ │ ╰─ {*id} [1466] - │ ╰─ . - │ ╰─ {format} [1464] - ├─ {*id} - │ ╰─ . - │ ╰─ {format:18} [327] - ├─ {*repository_path:8} [1473] - ├─ {*unmatched_route} [232] - ╰─ {*id} [327] - === Method - [2] - ╰─ GET [1] - - [3] - ╰─ GET [2] - - [5] - ├─ GET [884] - ╰─ POST [3] - - [6] - ╰─ GET [1927] - - [13] - ╰─ POST [4] - - [14] - ╰─ POST [5] - - [15] - ╰─ GET [6] - - [16] - ╰─ POST [7] - - [17] - ╰─ GET [8] - - [18] - ╰─ GET [9] - - [19] - ├─ DELETE [10] - ├─ GET [13] - ├─ PATCH [14] - ╰─ PUT [15] - - [20] - ╰─ GET [11] - - [21] - ╰─ PUT [12] - - [22] - ╰─ GET [16] - - [23] - ├─ GET [18] - ╰─ POST [17] - - [24] - ├─ GET [19] - ╰─ PATCH [19] - - [25] - ├─ GET [20] - ╰─ PATCH [20] - - [26] - ├─ GET [21] - ╰─ PATCH [21] - - [27] - ╰─ PUT [22] - - [28] - ├─ GET [23] - ╰─ PATCH [23] - - [29] - ├─ GET [24] - ╰─ PATCH [24] - - [30] - ╰─ GET [25] - - [31] - ├─ GET [26] - ╰─ PATCH [26] - - [32] - ├─ GET [27] - ╰─ PATCH [27] - - [33] - ├─ GET [28] - ╰─ PATCH [28] - - [34] - ├─ GET [29] - ╰─ PATCH [29] - - [35] - ├─ GET [30] - ╰─ PATCH [30] - - [36] - ├─ GET [31] - ╰─ PATCH [31] - - [37] - ╰─ PUT [32] - - [38] - ╰─ PUT [33] - - [39] - ╰─ PUT [34] - - [40] - ╰─ GET [35] - - [41] - ├─ GET [36] - ╰─ PATCH [36] - - [42] - ╰─ GET [37] - - [43] - ╰─ GET [38] - - [44] - ├─ GET [39] - ╰─ PATCH [39] - - [45] - ├─ PATCH [40] - ╰─ PUT [41] - - [46] - ╰─ PUT [42] - - [47] - ╰─ GET [43] - - [48] - ├─ GET [50] - ├─ PATCH [51] - ├─ POST [44] - ╰─ PUT [52] - - [49] - ╰─ DELETE [45] - - [50] - ╰─ DELETE [46] - - [51] - ╰─ DELETE [47] - - [52] - ╰─ GET [48] - - [53] - ╰─ DELETE [49] - - [54] - ╰─ GET [53] - - [55] - ╰─ GET [54] - - [56] - ╰─ GET [55] - - [57] - ╰─ GET [56] - - [58] - ╰─ POST [57] - - [59] - ├─ GET [61] - ╰─ POST [58] - - [60] - ├─ DELETE [59] - ├─ GET [65] - ├─ PATCH [66] - ╰─ PUT [67] - - [61] - ╰─ GET [60] - - [62] - ╰─ GET [62] - - [63] - ╰─ PUT [63] - - [64] - ╰─ POST [64] - - [65] - ╰─ GET [68] - - [66] - ╰─ GET [69] - - [67] - ╰─ GET [70] - - [68] - ╰─ GET [71] - - [69] - ╰─ POST [72] - - [70] - ╰─ POST [73] - - [71] - ╰─ POST [74] - - [72] - ╰─ GET [75] - - [73] - ╰─ GET [76] - - [74] - ├─ GET [80] - ╰─ POST [77] - - [75] - ├─ DELETE [78] - ├─ PATCH [82] - ╰─ PUT [83] - - [76] - ╰─ GET [79] - - [77] - ╰─ POST [81] - - [78] - ├─ GET [84] - ├─ PATCH [85] - ╰─ PUT [86] - - [79] - ╰─ DELETE [87] - - [80] - ╰─ GET [88] - - [81] - ╰─ GET [89] - - [82] - ╰─ POST [90] - - [83] - ├─ DELETE [91] - ├─ GET [97] - ├─ PATCH [98] - ╰─ PUT [99] - - [84] - ╰─ GET [92] - - [85] - ╰─ GET [93] - - [86] - ╰─ GET [94] - - [87] - ╰─ GET [95] - - [88] - ╰─ GET [96] - - [89] - ╰─ POST [100] - - [90] - ╰─ GET [101] - - [91] - ╰─ DELETE [102] - - [92] - ╰─ GET [103] - - [93] - ╰─ PUT [104] - - [94] - ╰─ PUT [105] - - [95] - ╰─ GET [106] - - [96] - ╰─ GET [107] - - [97] - ├─ GET [111] - ╰─ POST [108] - - [98] - ├─ DELETE [109] - ├─ PATCH [113] - ╰─ PUT [114] - - [99] - ╰─ GET [110] - - [100] - ╰─ GET [112] - - [101] - ╰─ GET [115] - - [102] - ╰─ POST [116] - - [103] - ╰─ POST [117] - - [104] - ╰─ POST [118] - - [105] - ╰─ POST [119] - - [106] - ├─ GET [121] - ╰─ POST [120] - - [107] - ├─ GET [125] - ╰─ POST [122] - - [108] - ╰─ GET [123] - - [109] - ╰─ GET [124] - - [110] - ╰─ GET [126] - - [111] - ╰─ GET [127] - - [112] - ├─ PATCH [128] - ╰─ PUT [129] - - [113] - ╰─ GET [130] - - [114] - ╰─ GET [131] - - [115] - ╰─ GET [132] - - [116] - ├─ GET [133] - ├─ PATCH [134] - ╰─ PUT [135] - - [117] - ╰─ GET [136] - - [118] - ╰─ GET [137] - - [119] - ╰─ GET [138] - - [120] - ╰─ GET [139] - - [121] - ├─ GET [143] - ╰─ POST [140] - - [122] - ├─ DELETE [141] - ├─ GET [147] - ├─ PATCH [148] - ╰─ PUT [149] - - [123] - ╰─ GET [142] - - [124] - ╰─ PUT [144] - - [125] - ╰─ GET [145] - - [126] - ╰─ POST [146] - - [127] - ╰─ GET [150] - - [128] - ╰─ POST [151] - - [129] - ╰─ GET [152] - - [130] - ├─ GET [156] - ╰─ POST [153] - - [131] - ├─ DELETE [154] - ├─ PATCH [158] - ╰─ PUT [159] - - [132] - ╰─ GET [155] - - [133] - ╰─ POST [157] - - [134] - ├─ GET [163] - ╰─ POST [160] - - [135] - ├─ DELETE [161] - ├─ PATCH [165] - ╰─ PUT [166] - - [136] - ╰─ GET [162] - - [137] - ╰─ GET [164] - - [138] - ├─ GET [168] - ╰─ POST [167] - - [139] - ╰─ PUT [169] - - [140] - ╰─ DELETE [170] - - [141] - ╰─ GET [171] - - [142] - ├─ PATCH [172] - ╰─ PUT [173] - - [143] - ╰─ GET [174] - - [144] - ╰─ GET [175] - - [145] - ╰─ GET [176] - - [146] - ╰─ POST [177] - - [147] - ╰─ PUT [178] - - [148] - ├─ PATCH [179] - ╰─ PUT [180] - - [149] - ╰─ POST [181] - - [150] - ╰─ GET [182] - - [151] - ├─ DELETE [183] - ╰─ GET [184] - - [152] - ├─ GET [188] - ╰─ POST [185] - - [153] - ├─ DELETE [186] - ├─ GET [190] - ├─ PATCH [191] - ╰─ PUT [192] - - [154] - ╰─ GET [187] - - [155] - ╰─ GET [189] - - [156] - ├─ DELETE [194] - ├─ GET [196] - ╰─ POST [193] - - [157] - ╰─ GET [195] - - [158] - ╰─ POST [197] - - [159] - ╰─ GET [198] - - [160] - ╰─ GET [199] - - [161] - ╰─ GET [200] - - [162] - ╰─ GET [201] - - [163] - ╰─ POST [202] - - [164] - ├─ DELETE [203] - ├─ GET [207] - ├─ PATCH [209] - ╰─ PUT [210] - - [165] - ╰─ GET [204] - - [166] - ╰─ GET [205] - - [167] - ╰─ POST [206] - - [168] - ╰─ PUT [208] - - [169] - ├─ GET [211] - ├─ PATCH [212] - ╰─ PUT [213] - - [170] - ╰─ GET [214] - - [171] - ╰─ POST [215] - - [172] - ╰─ DELETE [216] - - [173] - ╰─ GET [217] - - [174] - ├─ DELETE [218] - ├─ GET [226] - ├─ PATCH [228] - ╰─ PUT [229] - - [175] - ╰─ GET [219] - - [176] - ╰─ GET [220] - - [177] - ╰─ GET [221] - - [178] - ╰─ POST [222] - - [179] - ╰─ GET [223] - - [180] - ╰─ POST [224] - - [181] - ╰─ GET [225] - - [182] - ╰─ GET [227] - - [183] - ╰─ POST [230] - - [184] - ╰─ POST [231] - - [185] - ╰─ GET [232] - - [186] - ╰─ DELETE [233] - - [187] - ╰─ GET [234] - - [188] - ╰─ DELETE [235] - - [189] - ╰─ GET [236] - - [190] - ╰─ POST [237] - - [191] - ╰─ GET [238] - - [192] - ╰─ GET [239] - - [193] - ├─ GET [243] - ╰─ POST [240] - - [194] - ├─ DELETE [241] - ├─ PATCH [247] - ╰─ PUT [248] - - [195] - ╰─ GET [242] - - [196] - ╰─ POST [244] - - [197] - ╰─ GET [245] - - [198] - ╰─ POST [246] - - [199] - ╰─ DELETE [249] - - [200] - ╰─ GET [250] - - [201] - ╰─ GET [251] - - [202] - ╰─ PUT [252] - - [203] - ╰─ PUT [253] - - [204] - ╰─ PUT [254] - - [205] - ╰─ PUT [255] - - [206] - ╰─ GET [256] - - [207] - ╰─ PUT [257] - - [208] - ├─ GET [266] - ╰─ POST [258] - - [209] - ╰─ PUT [259] - - [210] - ├─ DELETE [260] - ├─ GET [274] - ├─ PATCH [280] - ╰─ PUT [281] - - [211] - ╰─ DELETE [261] - - [212] - ╰─ PATCH [262] - - [213] - ╰─ GET [263] - - [214] - ╰─ POST [264] - - [215] - ╰─ POST [265] - - [216] - ╰─ GET [267] - - [217] - ╰─ GET [268] - - [218] - ╰─ GET [269] - - [219] - ╰─ GET [270] - - [220] - ╰─ DELETE [271] - - [221] - ╰─ DELETE [272] - - [222] - ╰─ POST [273] - - [223] - ╰─ PUT [275] - - [224] - ╰─ PUT [276] - - [225] - ╰─ PUT [277] - - [226] - ╰─ PUT [278] - - [227] - ╰─ PUT [279] - - [228] - ╰─ GET [282] - - [229] - ╰─ GET [283] - - [230] - ├─ DELETE [284] - ├─ PATCH [287] - ├─ POST [289] - ╰─ PUT [291] - - [231] - ├─ DELETE [285] - ├─ PATCH [288] - ├─ POST [290] - ╰─ PUT [292] - - [232] - ╰─ GET [286] - - [233] - ╰─ GET [293] - - [234] - ╰─ GET [294] - - [235] - ╰─ GET [295] - - [236] - ╰─ GET [296] - - [237] - ╰─ GET [297] - - [238] - ╰─ GET [298] - - [239] - ╰─ GET [299] - - [240] - ╰─ GET [300] - - [241] - ╰─ GET [301] - - [242] - ╰─ GET [302] - - [243] - ╰─ GET [303] - - [244] - ╰─ GET [304] - - [245] - ╰─ GET [305] - - [246] - ╰─ GET [306] - - [247] - ╰─ POST [307] - - [248] - ╰─ GET [308] - - [249] - ╰─ GET [309] - - [250] - ╰─ GET [310] - - [251] - ╰─ GET [311] - - [252] - ╰─ GET [312] - - [253] - ╰─ GET [313] - - [254] - ╰─ GET [314] - - [255] - ├─ GET [319] - ╰─ POST [315] - - [256] - ├─ GET [320] - ╰─ POST [316] - - [257] - ╰─ GET [317] - - [258] - ╰─ GET [318] - - [259] - ╰─ GET [321] - - [260] - ╰─ GET [322] - - [261] - ╰─ POST [323] - - [262] - ╰─ GET [324] - - [263] - ╰─ GET [325] - - [264] - ╰─ GET [326] - - [265] - ╰─ GET [327] - - [266] - ╰─ GET [328] - - [267] - ╰─ GET [329] - - [268] - ╰─ GET [330] - - [269] - ╰─ GET [331] - - [270] - ╰─ GET [332] - - [271] - ╰─ GET [333] - - [272] - ╰─ GET [334] - - [273] - ╰─ GET [335] - - [274] - ╰─ GET [336] - - [275] - ╰─ GET [337] - - [276] - ╰─ GET [338] - - [277] - ╰─ GET [339] - - [278] - ╰─ GET [340] - - [279] - ╰─ GET [341] - - [280] - ╰─ PATCH [342] - - [281] - ╰─ DELETE [343] - - [282] - ╰─ DELETE [344] - - [283] - ╰─ GET [345] - - [284] - ╰─ PATCH [346] - - [285] - ╰─ GET [347] - - [286] - ├─ GET [350] - ╰─ POST [348] - - [287] - ╰─ GET [349] - - [288] - ├─ GET [351] - ├─ OPTIONS [352] - ╰─ POST [353] - - [289] - ╰─ GET [354] - - [290] - ╰─ GET [355] - - [291] - ╰─ GET [356] - - [292] - ╰─ GET [357] - - [293] - ╰─ GET [358] - - [294] - ╰─ GET [359] - - [295] - ╰─ GET [360] - - [296] - ╰─ GET [361] - - [297] - ╰─ GET [362] - - [298] - ╰─ GET [363] - - [299] - ╰─ GET [364] - - [300] - ╰─ GET [365] - - [301] - ╰─ GET [366] - - [302] - ╰─ GET [367] - - [303] - ╰─ GET [368] - - [304] - ╰─ POST [369] - - [305] - ╰─ GET [370] - - [306] - ╰─ GET [371] - - [307] - ├─ PATCH [372] - ╰─ PUT [373] - - [308] - ╰─ POST [374] - - [309] - ╰─ GET [375] - - [310] - ╰─ GET [376] - - [311] - ╰─ POST [377] - - [312] - ╰─ GET [378] - - [313] - ╰─ GET [379] - - [314] - ╰─ GET [380] - - [315] - ╰─ POST [381] - - [316] - ╰─ POST [382] - - [317] - ╰─ GET [383] - - [318] - ╰─ POST [384] - - [319] - ╰─ GET [385] - - [320] - ╰─ POST [386] - - [321] - ╰─ GET [387] - - [322] - ├─ GET [388] - ╰─ POST [388] - - [323] - ├─ GET [389] - ╰─ POST [389] - - [324] - ├─ GET [390] - ╰─ POST [390] - - [325] - ╰─ GET [391] - - [326] - ├─ GET [398] - ╰─ POST [392] - - [327] - ├─ DELETE [393] - ├─ GET [409] - ├─ PATCH [412] - ╰─ PUT [413] - - [328] - ╰─ GET [394] - - [329] - ╰─ GET [395] - - [330] - ╰─ GET [396] - - [331] - ╰─ POST [397] - - [332] - ╰─ GET [399] - - [333] - ╰─ GET [400] - - [334] - ╰─ GET [401] - - [335] - ╰─ GET [402] - - [336] - ╰─ POST [403] - - [337] - ╰─ GET [404] - - [338] - ╰─ POST [405] - - [339] - ╰─ GET [406] - - [340] - ╰─ GET [407] - - [341] - ╰─ GET [408] - - [342] - ╰─ PUT [410] - - [343] - ╰─ GET [411] - - [344] - ╰─ GET [414] - - [345] - ╰─ GET [415] - - [346] - ╰─ GET [416] - - [347] - ╰─ GET [417] - - [348] - ╰─ GET [418] - - [349] - ╰─ GET [419] - - [350] - ╰─ GET [420] - - [351] - ╰─ GET [421] - - [352] - ╰─ GET [422] - - [353] - ╰─ GET [423] - - [354] - ╰─ GET [424] - - [355] - ╰─ GET [425] - - [356] - ╰─ GET [426] - - [357] - ╰─ GET [427] - - [358] - ╰─ GET [428] - - [359] - ╰─ GET [429] - - [360] - ╰─ GET [430] - - [361] - ╰─ GET [431] - - [362] - ├─ GET [435] - ╰─ POST [432] - - [363] - ├─ DELETE [433] - ├─ GET [437] - ├─ PATCH [438] - ╰─ PUT [439] - - [364] - ╰─ GET [434] - - [365] - ╰─ GET [436] - - [366] - ╰─ GET [440] - - [367] - ╰─ GET [441] - - [368] - ╰─ GET [442] - - [369] - ╰─ GET [443] - - [370] - ╰─ GET [444] - - [371] - ╰─ GET [445] - - [372] - ╰─ GET [446] - - [373] - ╰─ GET [447] - - [374] - ╰─ GET [448] - - [375] - ╰─ GET [449] - - [376] - ╰─ GET [450] - - [377] - ╰─ GET [451] - - [378] - ╰─ GET [452] - - [379] - ╰─ GET [453] - - [380] - ╰─ GET [454] - - [381] - ╰─ GET [455] - - [382] - ╰─ GET [456] - - [383] - ╰─ GET [457] - - [384] - ╰─ DELETE [458] - - [385] - ╰─ GET [459] - - [386] - ╰─ POST [460] - - [387] - ╰─ GET [461] - - [388] - ╰─ GET [462] - - [389] - ╰─ GET [463] - - [390] - ╰─ DELETE [464] - - [391] - ╰─ GET [465] - - [392] - ╰─ GET [466] - - [393] - ╰─ POST [467] - - [394] - ├─ DELETE [468] - ├─ GET [474] - ├─ PATCH [475] - ╰─ PUT [476] - - [395] - ╰─ GET [469] - - [396] - ╰─ GET [470] - - [397] - ╰─ GET [471] - - [398] - ╰─ GET [472] - - [399] - ╰─ GET [473] - - [400] - ╰─ POST [477] - - [401] - ╰─ GET [478] - - [402] - ╰─ GET [479] - - [403] - ╰─ GET [480] - - [404] - ╰─ GET [481] - - [405] - ╰─ GET [482] - - [406] - ╰─ GET [483] - - [407] - ╰─ GET [484] - - [408] - ╰─ GET [485] - - [409] - ╰─ GET [486] - - [410] - ╰─ GET [487] - - [411] - ╰─ GET [488] - - [412] - ╰─ GET [489] - - [413] - ╰─ GET [490] - - [414] - ╰─ GET [491] - - [415] - ╰─ GET [492] - - [416] - ├─ GET [493] - ├─ PATCH [494] - ╰─ PUT [495] - - [417] - ╰─ GET [496] - - [418] - ╰─ POST [497] - - [419] - ╰─ POST [498] - - [420] - ╰─ GET [499] - - [421] - ╰─ GET [500] - - [422] - ╰─ POST [501] - - [423] - ╰─ POST [502] - - [424] - ╰─ PUT [503] - - [425] - ╰─ GET [504] - - [426] - ├─ GET [506] - ╰─ POST [505] - - [427] - ╰─ GET [507] - - [428] - ╰─ GET [508] - - [429] - ├─ GET [511] - ╰─ POST [509] - - [430] - ├─ DELETE [510] - ├─ PATCH [512] - ╰─ PUT [513] - - [431] - ╰─ POST [514] - - [432] - ├─ GET [521] - ╰─ POST [515] - - [433] - ╰─ DELETE [516] - - [434] - ╰─ GET [517] - - [435] - ├─ DELETE [518] - ├─ GET [524] - ├─ PATCH [527] - ╰─ PUT [528] - - [436] - ╰─ GET [519] - - [437] - ╰─ GET [520] - - [438] - ╰─ GET [522] - - [439] - ╰─ GET [523] - - [440] - ╰─ POST [525] - - [441] - ╰─ POST [526] - - [442] - ├─ GET [531] - ╰─ POST [529] - - [443] - ├─ DELETE [530] - ├─ PATCH [532] - ╰─ PUT [533] - - [444] - ├─ GET [536] - ╰─ POST [534] - - [445] - ├─ DELETE [535] - ├─ PATCH [538] - ╰─ PUT [539] - - [446] - ╰─ POST [537] - - [447] - ├─ GET [542] - ╰─ POST [540] - - [448] - ╰─ DELETE [541] - - [449] - ├─ DELETE [543] - ├─ PATCH [544] - ╰─ PUT [545] - - [450] - ╰─ POST [546] - - [451] - ╰─ PUT [547] - - [452] - ╰─ GET [548] - - [453] - ├─ DELETE [549] - ├─ PATCH [558] - ╰─ PUT [559] - - [454] - ╰─ GET [550] - - [455] - ╰─ GET [551] - - [456] - ╰─ DELETE [552] - - [457] - ╰─ PATCH [553] - - [458] - ├─ GET [554] - ╰─ POST [555] - - [459] - ╰─ POST [556] - - [460] - ╰─ PUT [557] - - [461] - ╰─ GET [560] - - [462] - ╰─ GET [561] - - [463] - ╰─ GET [562] - - [464] - ╰─ GET [563] - - [465] - ╰─ POST [564] - - [466] - ╰─ GET [565] - - [467] - ├─ GET [569] - ╰─ POST [566] - - [468] - ├─ DELETE [567] - ├─ PATCH [571] - ╰─ PUT [572] - - [469] - ╰─ GET [568] - - [470] - ╰─ POST [570] - - [471] - ╰─ GET [573] - - [472] - ╰─ GET [574] - - [473] - ╰─ POST [575] - - [474] - ╰─ GET [576] - - [475] - ╰─ POST [577] - - [476] - ╰─ GET [578] - - [477] - ├─ DELETE [579] - ├─ GET [582] - ├─ PATCH [588] - ╰─ PUT [590] - - [478] - ├─ GET [580] - ╰─ POST [589] - - [479] - ╰─ GET [581] - - [480] - ╰─ GET [583] - - [481] - ╰─ GET [584] - - [482] - ╰─ GET [585] - - [483] - ╰─ GET [586] - - [484] - ╰─ GET [587] - - [485] - ╰─ GET [591] - - [486] - ╰─ GET [592] - - [487] - ╰─ GET [593] - - [488] - ╰─ GET [594] - - [489] - ├─ GET [598] - ╰─ POST [595] - - [490] - ├─ DELETE [596] - ├─ PATCH [601] - ╰─ PUT [602] - - [491] - ╰─ GET [597] - - [492] - ╰─ GET [599] - - [493] - ╰─ POST [600] - - [494] - ├─ GET [605] - ╰─ POST [603] - - [495] - ╰─ DELETE [604] - - [496] - ╰─ PUT [606] - - [497] - ╰─ POST [607] - - [498] - ├─ GET [611] - ╰─ POST [608] - - [499] - ├─ DELETE [609] - ├─ GET [617] - ├─ PATCH [618] - ╰─ PUT [619] - - [500] - ╰─ GET [610] - - [501] - ╰─ GET [612] - - [502] - ╰─ GET [613] - - [503] - ╰─ GET [614] - - [504] - ╰─ GET [615] - - [505] - ╰─ GET [616] - - [506] - ├─ PATCH [620] - ╰─ PUT [621] - - [507] - ╰─ POST [622] - - [508] - ╰─ GET [623] - - [509] - ╰─ GET [624] - - [510] - ╰─ POST [625] - - [511] - ├─ DELETE [626] - ├─ PATCH [627] - ╰─ PUT [628] - - [512] - ╰─ POST [629] - - [513] - ├─ DELETE [630] - ├─ PATCH [631] - ╰─ PUT [632] - - [514] - ├─ PATCH [633] - ╰─ PUT [634] - - [515] - ╰─ GET [635] - - [516] - ╰─ GET [636] - - [517] - ╰─ GET [637] - - [518] - ╰─ GET [638] - - [519] - ╰─ GET [639] - - [520] - ╰─ GET [640] - - [521] - ├─ DELETE [641] - ├─ GET [648] - ├─ PATCH [649] - ╰─ PUT [650] - - [522] - ╰─ GET [642] - - [523] - ╰─ GET [643] - - [524] - ╰─ GET [644] - - [525] - ╰─ POST [645] - - [526] - ╰─ GET [646] - - [527] - ╰─ POST [647] - - [528] - ├─ GET [653] - ╰─ POST [651] - - [529] - ╰─ DELETE [652] - - [530] - ├─ GET [655] - ├─ PATCH [656] - ├─ POST [654] - ╰─ PUT [657] - - [531] - ╰─ PUT [658] - - [532] - ╰─ POST [659] - - [533] - ╰─ GET [660] - - [534] - ╰─ GET [661] - - [535] - ╰─ GET [662] - - [536] - ╰─ GET [663] - - [537] - ╰─ GET [664] - - [538] - ╰─ GET [665] - - [539] - ╰─ DELETE [666] - - [540] - ╰─ GET [667] - - [541] - ╰─ PUT [668] - - [542] - ╰─ GET [669] - - [543] - ╰─ GET [670] - - [544] - ╰─ GET [671] - - [545] - ╰─ GET [672] - - [546] - ╰─ GET [673] - - [547] - ╰─ GET [674] - - [548] - ╰─ GET [675] - - [549] - ╰─ GET [676] - - [550] - ├─ DELETE [677] - ├─ GET [680] - ├─ PATCH [682] - ╰─ PUT [684] - - [551] - ├─ GET [678] - ╰─ POST [683] - - [552] - ╰─ GET [679] - - [553] - ╰─ GET [681] - - [554] - ├─ GET [686] - ╰─ POST [685] - - [555] - ╰─ PUT [687] - - [556] - ├─ GET [688] - ├─ PATCH [689] - ╰─ PUT [690] - - [557] - ├─ GET [694] - ╰─ POST [691] - - [558] - ├─ DELETE [692] - ├─ GET [697] - ├─ PATCH [698] - ╰─ PUT [699] - - [559] - ╰─ GET [693] - - [560] - ╰─ GET [695] - - [561] - ╰─ PUT [696] - - [562] - ╰─ PUT [700] - - [563] - ╰─ GET [701] - - [564] - ├─ GET [702] - ├─ PATCH [703] - ╰─ PUT [704] - - [565] - ╰─ PATCH [705] - - [566] - ╰─ DELETE [706] - - [567] - ├─ GET [709] - ╰─ POST [707] - - [568] - ├─ DELETE [708] - ├─ GET [712] - ├─ PATCH [713] - ╰─ PUT [714] - - [569] - ╰─ GET [710] - - [570] - ╰─ POST [711] - - [571] - ╰─ POST [715] - - [572] - ╰─ GET [716] - - [573] - ╰─ GET [717] - - [574] - ╰─ GET [718] - - [575] - ╰─ GET [719] - - [576] - ╰─ GET [720] - - [577] - ╰─ POST [721] - - [578] - ╰─ PUT [722] - - [579] - ├─ PATCH [723] - ╰─ PUT [724] - - [580] - ├─ PATCH [725] - ╰─ PUT [726] - - [581] - ╰─ GET [727] - - [582] - ╰─ GET [728] - - [583] - ╰─ GET [729] - - [584] - ╰─ POST [730] - - [585] - ╰─ POST [731] - - [586] - ╰─ GET [732] - - [587] - ╰─ GET [733] - - [588] - ╰─ GET [734] - - [589] - ╰─ GET [735] - - [590] - ╰─ GET [736] - - [591] - ╰─ DELETE [737] - - [592] - ╰─ GET [738] - - [593] - ╰─ GET [739] - - [594] - ╰─ GET [740] - - [595] - ├─ GET [741] - ╰─ POST [742] - - [596] - ╰─ DELETE [743] - - [597] - ╰─ POST [744] - - [598] - ╰─ DELETE [745] - - [599] - ╰─ POST [746] - - [600] - ╰─ POST [747] - - [601] - ╰─ GET [748] - - [602] - ╰─ GET [749] - - [603] - ╰─ GET [750] - - [604] - ╰─ GET [751] - - [605] - ├─ GET [752] - ├─ PATCH [753] - ╰─ PUT [754] - - [606] - ├─ GET [1801] - ╰─ POST [755] - - [607] - ├─ DELETE [756] - ├─ GET [765] - ╰─ PUT [767] - - [608] - ╰─ GET [757] - - [609] - ╰─ GET [758] - - [610] - ╰─ GET [759] - - [611] - ╰─ GET [760] - - [612] - ╰─ GET [761] - - [613] - ╰─ GET [762] - - [614] - ╰─ POST [763] - - [615] - ╰─ GET [764] - - [616] - ╰─ GET [766] - - [617] - ╰─ DELETE [768] - - [618] - ╰─ GET [769] - - [619] - ╰─ GET [770] - - [620] - ╰─ GET [771] - - [621] - ╰─ GET [772] - - [622] - ╰─ GET [773] - - [623] - ╰─ GET [774] - - [624] - ╰─ GET [775] - - [625] - ╰─ GET [776] - - [626] - ╰─ GET [777] - - [627] - ╰─ GET [778] - - [628] - ╰─ GET [779] - - [629] - ╰─ GET [780] - - [630] - ╰─ GET [781] - - [631] - ╰─ GET [782] - - [632] - ╰─ GET [783] - - [633] - ╰─ GET [784] - - [634] - ╰─ GET [785] - - [635] - ╰─ GET [786] - - [636] - ╰─ GET [787] - - [637] - ╰─ GET [788] - - [638] - ╰─ GET [789] - - [639] - ╰─ GET [790] - - [640] - ╰─ GET [791] - - [641] - ╰─ GET [792] - - [642] - ╰─ GET [793] - - [643] - ╰─ GET [794] - - [644] - ╰─ GET [795] - - [645] - ╰─ GET [796] - - [646] - ╰─ GET [797] - - [647] - ╰─ GET [798] - - [648] - ╰─ POST [799] - - [649] - ╰─ GET [800] - - [650] - ╰─ GET [801] - - [651] - ╰─ GET [802] - - [652] - ╰─ POST [803] - - [653] - ╰─ POST [804] - - [654] - ╰─ GET [805] - - [655] - ╰─ GET [806] - - [656] - ╰─ GET [807] - - [657] - ╰─ POST [808] - - [658] - ╰─ POST [809] - - [659] - ╰─ GET [810] - - [660] - ╰─ GET [811] - - [661] - ╰─ GET [812] - - [662] - ╰─ GET [813] - - [663] - ╰─ GET [814] - - [664] - ╰─ POST [815] - - [665] - ╰─ POST [816] - - [666] - ├─ GET [819] - ╰─ POST [817] - - [667] - ╰─ GET [818] - - [668] - ╰─ GET [820] - - [669] - ╰─ GET [821] - - [670] - ╰─ POST [822] - - [671] - ╰─ GET [823] - - [672] - ╰─ POST [824] - - [673] - ╰─ GET [825] - - [674] - ╰─ GET [826] - - [675] - ╰─ GET [827] - - [676] - ╰─ POST [828] - - [677] - ╰─ POST [829] - - [678] - ╰─ GET [830] - - [679] - ╰─ POST [831] - - [680] - ╰─ GET [832] - - [681] - ╰─ GET [833] - - [682] - ╰─ GET [834] - - [683] - ╰─ POST [835] - - [684] - ╰─ GET [836] - - [685] - ╰─ GET [837] - - [686] - ╰─ GET [838] - - [687] - ╰─ POST [839] - - [688] - ╰─ POST [840] - - [689] - ╰─ POST [841] - - [690] - ╰─ POST [842] - - [691] - ╰─ GET [843] - - [692] - ╰─ GET [844] - - [693] - ╰─ POST [845] - - [694] - ╰─ GET [846] - - [695] - ╰─ GET [847] - - [696] - ╰─ GET [848] - - [697] - ╰─ POST [849] - - [698] - ╰─ POST [850] - - [699] - ╰─ POST [851] - - [700] - ╰─ GET [852] - - [701] - ╰─ POST [853] - - [702] - ╰─ POST [854] - - [703] - ├─ GET [855] - ╰─ POST [855] - - [704] - ╰─ GET [856] - - [705] - ╰─ GET [857] - - [706] - ╰─ GET [858] - - [707] - ╰─ GET [859] - - [708] - ╰─ POST [860] - - [709] - ╰─ POST [861] - - [710] - ├─ GET [862] - ╰─ PUT [863] - - [711] - ├─ GET [864] - ╰─ OPTIONS [865] - - [712] - ╰─ GET [866] - - [713] - ╰─ GET [867] - - [714] - ╰─ POST [868] - - [715] - ╰─ GET [869] - - [716] - ├─ GET [873] - ├─ OPTIONS [874] - ╰─ POST [870] - - [717] - ├─ DELETE [872] - ╰─ OPTIONS [871] - - [718] - ╰─ GET [875] - - [719] - ╰─ GET [876] - - [720] - ├─ GET [877] - ╰─ OPTIONS [878] - - [721] - ╰─ GET [879] - - [722] - ├─ GET [880] - ╰─ OPTIONS [881] - - [723] - ├─ GET [882] - ╰─ OPTIONS [883] - - [724] - ╰─ GET [885] - - [725] - ╰─ POST [886] - - [726] - ╰─ POST [887] - - [727] - ╰─ GET [888] - - [728] - ╰─ GET [889] - - [729] - ╰─ GET [890] - - [730] - ╰─ GET [891] - - [731] - ╰─ GET [892] - - [732] - ╰─ GET [893] - - [733] - ╰─ GET [894] - - [734] - ╰─ GET [895] - - [735] - ╰─ GET [896] - - [736] - ╰─ GET [897] - - [737] - ╰─ GET [898] - - [738] - ╰─ POST [899] - - [739] - ╰─ POST [900] - - [740] - ╰─ GET [901] - - [741] - ╰─ GET [902] - - [742] - ├─ GET [907] - ╰─ POST [903] - - [743] - ├─ DELETE [904] - ├─ GET [910] - ├─ PATCH [911] - ╰─ PUT [912] - - [744] - ╰─ GET [905] - - [745] - ╰─ GET [906] - - [746] - ╰─ GET [908] - - [747] - ╰─ PUT [909] - - [748] - ├─ DELETE [914] - ├─ GET [915] - ╰─ POST [913] - - [749] - ╰─ GET [916] - - [750] - ╰─ DELETE [917] - - [751] - ╰─ GET [918] - - [752] - ├─ GET [921] - ╰─ POST [919] - - [753] - ╰─ POST [920] - - [754] - ╰─ POST [922] - - [755] - ╰─ GET [923] - - [756] - ╰─ GET [924] - - [757] - ╰─ GET [925] - - [758] - ╰─ GET [926] - - [759] - ├─ OPTIONS [927] - ╰─ POST [928] - - [760] - ╰─ POST [929] - - [761] - ├─ OPTIONS [930] - ╰─ POST [931] - - [762] - ╰─ GET [932] - - [763] - ├─ DELETE [935] - ├─ GET [938] - ╰─ POST [933] - - [764] - ├─ DELETE [936] - ├─ GET [937] - ╰─ POST [934] - - [765] - ├─ DELETE [940] - ╰─ POST [939] - - [766] - ╰─ GET [941] - - [767] - ╰─ GET [942] - - [768] - ╰─ GET [943] - - [769] - ╰─ GET [944] - - [770] - ╰─ GET [945] - - [771] - ╰─ GET [946] - - [772] - ╰─ POST [947] - - [773] - ╰─ GET [948] - - [774] - ╰─ GET [949] - - [775] - ╰─ GET [950] - - [776] - ╰─ GET [951] - - [777] - ╰─ POST [952] - - [778] - ├─ PATCH [956] - ├─ POST [953] - ╰─ PUT [957] - - [779] - ╰─ GET [954] - - [780] - ╰─ GET [955] - - [781] - ╰─ GET [958] - - [782] - ╰─ POST [959] - - [783] - ╰─ PUT [960] - - [784] - ╰─ PUT [961] - - [785] - ╰─ PUT [962] - - [786] - ╰─ PUT [963] - - [787] - ╰─ GET [964] - - [788] - ╰─ DELETE [965] - - [789] - ╰─ DELETE [966] - - [790] - ╰─ GET [967] - - [791] - ├─ GET [971] - ╰─ POST [968] - - [792] - ╰─ DELETE [969] - - [793] - ╰─ DELETE [970] - - [794] - ╰─ GET [972] - - [795] - ╰─ GET [973] - - [796] - ╰─ GET [974] - - [797] - ├─ GET [977] - ╰─ POST [975] - - [798] - ╰─ DELETE [976] - - [799] - ╰─ PUT [978] - - [800] - ├─ PATCH [979] - ╰─ PUT [980] - - [801] - ├─ GET [981] - ├─ PATCH [982] - ╰─ PUT [983] - - [802] - ├─ GET [984] - ├─ PATCH [985] - ╰─ PUT [986] - - [803] - ╰─ GET [987] - - [804] - ╰─ GET [988] - - [805] - ╰─ POST [989] - - [806] - ├─ DELETE [992] - ├─ GET [995] - ╰─ POST [990] - - [807] - ╰─ POST [991] - - [808] - ╰─ DELETE [993] - - [809] - ╰─ DELETE [994] - - [810] - ╰─ PATCH [996] - - [811] - ╰─ GET [997] - - [812] - ╰─ GET [998] - - [813] - ╰─ POST [999] - - [814] - ├─ GET [1007] - ╰─ POST [1000] - - [815] - ├─ DELETE [1001] - ├─ GET [1015] - ├─ PATCH [1020] - ╰─ PUT [1021] - - [816] - ╰─ GET [1002] - - [817] - ╰─ GET [1003] - - [818] - ╰─ POST [1004] - - [819] - ╰─ POST [1005] - - [820] - ╰─ POST [1006] - - [821] - ╰─ GET [1008] - - [822] - ╰─ PUT [1009] - - [823] - ╰─ POST [1010] - - [824] - ╰─ GET [1011] - - [825] - ╰─ POST [1012] - - [826] - ╰─ DELETE [1013] - - [827] - ╰─ POST [1014] - - [828] - ╰─ POST [1016] - - [829] - ╰─ PUT [1017] - - [830] - ╰─ POST [1018] - - [831] - ╰─ GET [1019] - - [832] - ╰─ GET [1022] - - [833] - ╰─ GET [1023] - - [834] - ╰─ GET [1024] - - [835] - ╰─ POST [1025] - - [836] - ╰─ POST [1026] - - [837] - ╰─ POST [1027] - - [838] - ╰─ GET [1028] - - [839] - ╰─ GET [1029] - - [840] - ╰─ GET [1030] - - [841] - ╰─ GET [1031] - - [842] - ╰─ GET [1032] - - [843] - ╰─ GET [1033] - - [844] - ╰─ GET [1034] - - [845] - ╰─ GET [1035] - - [846] - ╰─ GET [1036] - - [847] - ╰─ GET [1037] - - [848] - ╰─ GET [1038] - - [849] - ├─ GET [1042] - ╰─ POST [1039] - - [850] - ├─ DELETE [1040] - ├─ GET [1044] - ├─ PATCH [1045] - ╰─ PUT [1046] - - [851] - ╰─ GET [1041] - - [852] - ╰─ GET [1043] - - [853] - ╰─ GET [1047] - - [854] - ╰─ GET [1048] - - [855] - ╰─ GET [1049] - - [856] - ╰─ DELETE [1050] - - [857] - ╰─ DELETE [1051] - - [858] - ╰─ DELETE [1052] - - [859] - ╰─ DELETE [1053] - - [860] - ╰─ DELETE [1054] - - [861] - ╰─ GET [1055] - - [862] - ╰─ DELETE [1056] - - [863] - ╰─ GET [1057] - - [864] - ╰─ GET [1058] - - [865] - ╰─ GET [1059] - - [866] - ╰─ GET [1060] - - [867] - ╰─ POST [1061] - - [868] - ╰─ GET [1062] - - [869] - ╰─ GET [1063] - - [870] - ╰─ GET [1064] - - [871] - ╰─ GET [1065] - - [872] - ╰─ GET [1066] - - [873] - ╰─ GET [1067] - - [874] - ╰─ GET [1068] - - [875] - ╰─ GET [1069] - - [876] - ╰─ GET [1070] - - [877] - ╰─ GET [1071] - - [878] - ╰─ GET [1072] - - [879] - ╰─ GET [1073] - - [880] - ╰─ GET [1074] - - [881] - ╰─ GET [1075] - - [882] - ╰─ GET [1076] - - [883] - ╰─ GET [1077] - - [884] - ├─ DELETE [1078] - ╰─ GET [1079] - - [885] - ╰─ GET [1080] - - [886] - ╰─ GET [1081] - - [887] - ╰─ GET [1082] - - [888] - ╰─ GET [1083] - - [889] - ╰─ GET [1084] - - [890] - ╰─ GET [1085] - - [891] - ╰─ GET [1086] - - [892] - ╰─ GET [1087] - - [893] - ╰─ GET [1088] - - [894] - ├─ DELETE [1091] - ├─ GET [1096] - ├─ POST [1089] - ╰─ PUT [1098] - - [895] - ╰─ POST [1090] - - [896] - ╰─ GET [1092] - - [897] - ╰─ GET [1093] - - [898] - ╰─ GET [1094] - - [899] - ╰─ POST [1095] - - [900] - ╰─ GET [1097] - - [901] - ╰─ PUT [1099] - - [902] - ╰─ GET [1100] - - [903] - ╰─ GET [1101] - - [904] - ├─ GET [1106] - ╰─ POST [1102] - - [905] - ╰─ DELETE [1103] - - [906] - ╰─ DELETE [1104] - - [907] - ╰─ GET [1105] - - [908] - ╰─ GET [1107] - - [909] - ╰─ GET [1108] - - [910] - ╰─ GET [1109] - - [911] - ╰─ GET [1110] - - [912] - ╰─ GET [1111] - - [913] - ╰─ GET [1112] - - [914] - ╰─ GET [1113] - - [915] - ╰─ GET [1114] - - [916] - ╰─ GET [1115] - - [917] - ╰─ GET [1116] - - [918] - ╰─ GET [1117] - - [919] - ├─ GET [1119] - ╰─ POST [1118] - - [920] - ╰─ GET [1120] - - [921] - ╰─ POST [1121] - - [922] - ╰─ GET [1122] - - [923] - ╰─ DELETE [1123] - - [924] - ╰─ GET [1124] - - [925] - ╰─ GET [1125] - - [926] - ╰─ POST [1126] - - [927] - ├─ DELETE [1127] - ├─ GET [1133] - ├─ PATCH [1134] - ╰─ PUT [1135] - - [928] - ╰─ GET [1128] - - [929] - ╰─ GET [1129] - - [930] - ╰─ GET [1130] - - [931] - ╰─ GET [1131] - - [932] - ╰─ GET [1132] - - [933] - ╰─ POST [1136] - - [934] - ╰─ GET [1137] - - [935] - ╰─ GET [1138] - - [936] - ╰─ GET [1139] - - [937] - ╰─ POST [1140] - - [938] - ╰─ GET [1141] - - [939] - ╰─ GET [1142] - - [940] - ╰─ GET [1143] - - [941] - ╰─ GET [1144] - - [942] - ╰─ POST [1145] - - [943] - ╰─ GET [1146] - - [944] - ╰─ GET [1147] - - [945] - ╰─ GET [1148] - - [946] - ╰─ GET [1149] - - [947] - ╰─ GET [1150] - - [948] - ├─ GET [1153] - ╰─ POST [1151] - - [949] - ╰─ GET [1152] - - [950] - ╰─ GET [1154] - - [951] - ╰─ GET [1155] - - [952] - ╰─ GET [1156] - - [953] - ╰─ GET [1157] - - [954] - ╰─ GET [1158] - - [955] - ╰─ GET [1159] - - [956] - ╰─ GET [1160] - - [957] - ╰─ GET [1161] - - [958] - ╰─ GET [1162] - - [959] - ╰─ GET [1163] - - [960] - ╰─ GET [1164] - - [961] - ╰─ GET [1165] - - [962] - ╰─ GET [1166] - - [963] - ╰─ GET [1167] - - [964] - ╰─ GET [1168] - - [965] - ╰─ GET [1169] - - [966] - ╰─ GET [1170] - - [967] - ╰─ GET [1171] - - [968] - ╰─ GET [1172] - - [969] - ├─ GET [1178] - ╰─ POST [1173] - - [970] - ╰─ PUT [1174] - - [971] - ╰─ GET [1175] - - [972] - ╰─ PUT [1176] - - [973] - ╰─ GET [1177] - - [974] - ╰─ GET [1179] - - [975] - ├─ PATCH [1180] - ╰─ PUT [1181] - - [976] - ╰─ PUT [1182] - - [977] - ╰─ GET [1183] - - [978] - ╰─ GET [1184] - - [979] - ╰─ GET [1185] - - [980] - ╰─ GET [1186] - - [981] - ╰─ GET [1187] - - [982] - ╰─ GET [1188] - - [983] - ├─ DELETE [1191] - ╰─ POST [1189] - - [984] - ╰─ GET [1190] - - [985] - ╰─ POST [1192] - - [986] - ├─ GET [1196] - ╰─ POST [1193] - - [987] - ╰─ GET [1194] - - [988] - ╰─ GET [1195] - - [989] - ╰─ GET [1197] - - [990] - ╰─ GET [1198] - - [991] - ╰─ GET [1199] - - [992] - ├─ GET [1200] - ├─ PATCH [1204] - ╰─ PUT [1205] - - [993] - ╰─ POST [1201] - - [994] - ╰─ GET [1202] - - [995] - ╰─ GET [1203] - - [996] - ╰─ GET [1206] - - [997] - ╰─ GET [1207] - - [998] - ╰─ GET [1208] - - [999] - ╰─ PUT [1209] - - [1000] - ╰─ GET [1210] - - [1001] - ╰─ GET [1211] - - [1002] - ├─ GET [1214] - ╰─ POST [1212] - - [1003] - ╰─ DELETE [1213] - - [1004] - ├─ GET [1218] - ╰─ POST [1215] - - [1005] - ├─ DELETE [1216] - ├─ GET [1220] - ├─ PATCH [1221] - ╰─ PUT [1222] - - [1006] - ╰─ GET [1217] - - [1007] - ╰─ GET [1219] - - [1008] - ╰─ POST [1223] - - [1009] - ╰─ GET [1224] - - [1010] - ╰─ GET [1225] - - [1011] - ╰─ GET [1226] - - [1012] - ╰─ GET [1227] - - [1013] - ╰─ GET [1228] - - [1014] - ╰─ GET [1229] - - [1015] - ├─ GET [1231] - ╰─ POST [1230] - - [1016] - ╰─ GET [1232] - - [1017] - ╰─ GET [1233] - - [1018] - ╰─ GET [1234] - - [1019] - ╰─ GET [1235] - - [1020] - ├─ GET [1237] - ╰─ POST [1236] - - [1021] - ╰─ GET [1238] - - [1022] - ╰─ GET [1239] - - [1023] - ╰─ GET [1240] - - [1024] - ╰─ GET [1241] - - [1025] - ├─ GET [1243] - ╰─ POST [1242] - - [1026] - ╰─ POST [1244] - - [1027] - ├─ GET [1246] - ╰─ POST [1245] - - [1028] - ╰─ GET [1247] - - [1029] - ╰─ GET [1248] - - [1030] - ╰─ GET [1249] - - [1031] - ╰─ GET [1250] - - [1032] - ╰─ GET [1251] - - [1033] - ├─ DELETE [1252] - ├─ PATCH [1253] - ╰─ PUT [1254] - - [1034] - ╰─ GET [1255] - - [1035] - ╰─ GET [1256] - - [1036] - ╰─ GET [1257] - - [1037] - ╰─ GET [1258] - - [1038] - ╰─ POST [1259] - - [1039] - ╰─ GET [1260] - - [1040] - ├─ GET [1264] - ╰─ POST [1261] - - [1041] - ├─ DELETE [1262] - ├─ PATCH [1266] - ╰─ PUT [1267] - - [1042] - ╰─ GET [1263] - - [1043] - ╰─ POST [1265] - - [1044] - ╰─ GET [1268] - - [1045] - ├─ GET [1271] - ╰─ POST [1269] - - [1046] - ╰─ GET [1270] - - [1047] - ╰─ GET [1272] - - [1048] - ╰─ GET [1273] - - [1049] - ╰─ POST [1274] - - [1050] - ╰─ POST [1275] - - [1051] - ╰─ GET [1276] - - [1052] - ╰─ GET [1277] - - [1053] - ╰─ POST [1278] - - [1054] - ╰─ GET [1279] - - [1055] - ╰─ GET [1280] - - [1056] - ╰─ GET [1281] - - [1057] - ╰─ POST [1282] - - [1058] - ╰─ GET [1283] - - [1059] - ╰─ GET [1284] - - [1060] - ╰─ GET [1285] - - [1061] - ╰─ GET [1286] - - [1062] - ╰─ GET [1287] - - [1063] - ├─ GET [1290] - ╰─ POST [1288] - - [1064] - ╰─ DELETE [1289] - - [1065] - ╰─ POST [1291] - - [1066] - ╰─ GET [1292] - - [1067] - ╰─ GET [1293] - - [1068] - ├─ GET [1304] - ╰─ POST [1294] - - [1069] - ╰─ POST [1295] - - [1070] - ╰─ DELETE [1296] - - [1071] - ╰─ GET [1297] - - [1072] - ╰─ GET [1298] - - [1073] - ├─ DELETE [1299] - ├─ GET [1312] - ├─ PATCH [1316] - ╰─ PUT [1317] - - [1074] - ╰─ GET [1300] - - [1075] - ╰─ GET [1301] - - [1076] - ╰─ POST [1302] - - [1077] - ╰─ POST [1303] - - [1078] - ╰─ POST [1305] - - [1079] - ╰─ POST [1306] - - [1080] - ╰─ GET [1307] - - [1081] - ╰─ GET [1308] - - [1082] - ╰─ GET [1309] - - [1083] - ╰─ PUT [1310] - - [1084] - ╰─ GET [1311] - - [1085] - ╰─ GET [1313] - - [1086] - ╰─ POST [1314] - - [1087] - ╰─ POST [1315] - - [1088] - ├─ DELETE [1318] - ├─ GET [1321] - ├─ PATCH [1325] - ╰─ PUT [1327] - - [1089] - ├─ GET [1319] - ╰─ POST [1326] - - [1090] - ╰─ GET [1320] - - [1091] - ╰─ GET [1322] - - [1092] - ╰─ GET [1323] - - [1093] - ╰─ GET [1324] - - [1094] - ╰─ GET [1328] - - [1095] - ╰─ GET [1329] - - [1096] - ╰─ POST [1330] - - [1097] - ╰─ POST [1331] - - [1098] - ╰─ GET [1332] - - [1099] - ╰─ POST [1333] - - [1100] - ╰─ GET [1334] - - [1101] - ╰─ GET [1335] - - [1102] - ╰─ GET [1336] - - [1103] - ╰─ POST [1337] - - [1104] - ╰─ GET [1338] - - [1105] - ╰─ GET [1339] - - [1106] - ╰─ GET [1340] - - [1107] - ╰─ GET [1341] - - [1108] - ╰─ GET [1342] - - [1109] - ╰─ GET [1343] - - [1110] - ╰─ POST [1344] - - [1111] - ╰─ GET [1345] - - [1112] - ├─ GET [1350] - ╰─ POST [1346] - - [1113] - ├─ DELETE [1347] - ├─ PATCH [1356] - ╰─ PUT [1357] - - [1114] - ╰─ GET [1348] - - [1115] - ╰─ POST [1349] - - [1116] - ╰─ GET [1351] - - [1117] - ╰─ POST [1352] - - [1118] - ╰─ DELETE [1353] - - [1119] - ╰─ POST [1354] - - [1120] - ╰─ POST [1355] - - [1121] - ╰─ GET [1358] - - [1122] - ╰─ GET [1359] - - [1123] - ╰─ GET [1360] - - [1124] - ╰─ POST [1361] - - [1125] - ╰─ GET [1362] - - [1126] - ╰─ GET [1363] - - [1127] - ╰─ GET [1364] - - [1128] - ╰─ POST [1365] - - [1129] - ╰─ POST [1366] - - [1130] - ╰─ POST [1367] - - [1131] - ╰─ GET [1368] - - [1132] - ╰─ GET [1369] - - [1133] - ╰─ GET [1370] - - [1134] - ╰─ GET [1371] - - [1135] - ╰─ GET [1372] - - [1136] - ╰─ GET [1373] - - [1137] - ╰─ GET [1374] - - [1138] - ╰─ GET [1375] - - [1139] - ╰─ GET [1376] - - [1140] - ╰─ GET [1377] - - [1141] - ╰─ DELETE [1378] - - [1142] - ╰─ GET [1379] - - [1143] - ╰─ GET [1380] - - [1144] - ├─ DELETE [1381] - ├─ GET [1401] - ├─ PATCH [1408] - ╰─ PUT [1409] - - [1145] - ╰─ GET [1382] - - [1146] - ╰─ GET [1383] - - [1147] - ╰─ GET [1384] - - [1148] - ╰─ GET [1385] - - [1149] - ╰─ POST [1386] - - [1150] - ╰─ GET [1387] - - [1151] - ├─ GET [1388] - ╰─ POST [1417] - - [1152] - ╰─ GET [1389] - - [1153] - ╰─ GET [1390] - - [1154] - ╰─ POST [1391] - - [1155] - ╰─ GET [1392] - - [1156] - ╰─ GET [1393] - - [1157] - ╰─ GET [1394] - - [1158] - ╰─ POST [1395] - - [1159] - ╰─ POST [1396] - - [1160] - ╰─ GET [1397] - - [1161] - ╰─ GET [1398] - - [1162] - ╰─ GET [1399] - - [1163] - ╰─ GET [1400] - - [1164] - ╰─ GET [1402] - - [1165] - ╰─ GET [1403] - - [1166] - ╰─ GET [1404] - - [1167] - ╰─ GET [1405] - - [1168] - ╰─ POST [1406] - - [1169] - ╰─ POST [1407] - - [1170] - ╰─ GET [1410] - - [1171] - ╰─ POST [1411] - - [1172] - ╰─ GET [1412] - - [1173] - ╰─ GET [1413] - - [1174] - ╰─ GET [1414] - - [1175] - ╰─ GET [1415] - - [1176] - ╰─ GET [1416] - - [1177] - ╰─ GET [1418] - - [1178] - ╰─ GET [1419] - - [1179] - ╰─ GET [1420] - - [1180] - ╰─ GET [1421] - - [1181] - ╰─ GET [1422] - - [1182] - ╰─ GET [1423] - - [1183] - ╰─ GET [1424] - - [1184] - ╰─ GET [1425] - - [1185] - ╰─ GET [1426] - - [1186] - ╰─ GET [1427] - - [1187] - ╰─ GET [1428] - - [1188] - ╰─ GET [1429] - - [1189] - ╰─ GET [1430] - - [1190] - ╰─ GET [1431] - - [1191] - ├─ GET [1435] - ╰─ POST [1432] - - [1192] - ├─ DELETE [1433] - ├─ PATCH [1437] - ╰─ PUT [1438] - - [1193] - ╰─ DELETE [1434] - - [1194] - ╰─ POST [1436] - - [1195] - ╰─ GET [1439] - - [1196] - ╰─ GET [1440] - - [1197] - ╰─ GET [1441] - - [1198] - ╰─ GET [1442] - - [1199] - ├─ GET [1446] - ╰─ POST [1443] - - [1200] - ├─ DELETE [1444] - ├─ GET [1453] - ├─ PATCH [1454] - ╰─ PUT [1455] - - [1201] - ╰─ GET [1445] - - [1202] - ╰─ GET [1447] - - [1203] - ╰─ GET [1448] - - [1204] - ╰─ GET [1449] - - [1205] - ╰─ GET [1450] - - [1206] - ╰─ GET [1451] - - [1207] - ╰─ POST [1452] - - [1208] - ├─ GET [1456] - ├─ PATCH [1458] - ╰─ PUT [1459] - - [1209] - ╰─ GET [1457] - - [1210] - ╰─ POST [1460] - - [1211] - ╰─ POST [1461] - - [1212] - ├─ DELETE [1462] - ├─ GET [1465] - ├─ PATCH [1467] - ╰─ PUT [1469] - - [1213] - ├─ GET [1463] - ╰─ POST [1468] - - [1214] - ╰─ GET [1464] - - [1215] - ╰─ GET [1466] - - [1216] - ├─ DELETE [1470] - ╰─ GET [1471] - - [1217] - ├─ DELETE [1472] - ╰─ GET [1474] - - [1218] - ╰─ GET [1473] - - [1219] - ╰─ GET [1475] - - [1220] - ╰─ GET [1476] - - [1221] - ╰─ GET [1477] - - [1222] - ├─ DELETE [1478] - ╰─ GET [1482] - - [1223] - ╰─ GET [1479] - - [1224] - ╰─ GET [1480] - - [1225] - ╰─ GET [1481] - - [1226] - ╰─ GET [1483] - - [1227] - ╰─ POST [1484] - - [1228] - ╰─ DELETE [1485] - - [1229] - ├─ DELETE [1486] - ├─ PATCH [1492] - ╰─ PUT [1493] - - [1230] - ╰─ GET [1487] - - [1231] - ╰─ GET [1488] - - [1232] - ├─ DELETE [1491] - ╰─ POST [1489] - - [1233] - ╰─ POST [1490] - - [1234] - ╰─ GET [1494] - - [1235] - ╰─ GET [1495] - - [1236] - ╰─ GET [1496] - - [1237] - ╰─ GET [1497] - - [1238] - ╰─ GET [1498] - - [1239] - ╰─ GET [1499] - - [1240] - ├─ DELETE [1500] - ╰─ GET [1502] - - [1241] - ╰─ GET [1501] - - [1242] - ├─ DELETE [1503] - ├─ GET [1505] - ├─ PATCH [1506] - ╰─ PUT [1507] - - [1243] - ╰─ GET [1504] - - [1244] - ╰─ DELETE [1508] - - [1245] - ╰─ POST [1509] - - [1246] - ├─ DELETE [1510] - ├─ GET [1514] - ├─ PATCH [1515] - ╰─ PUT [1516] - - [1247] - ╰─ GET [1511] - - [1248] - ╰─ GET [1512] - - [1249] - ╰─ POST [1513] - - [1250] - ╰─ POST [1517] - - [1251] - ╰─ DELETE [1518] - - [1252] - ╰─ GET [1519] - - [1253] - ╰─ POST [1520] - - [1254] - ├─ GET [1524] - ╰─ POST [1521] - - [1255] - ├─ DELETE [1522] - ├─ PATCH [1528] - ╰─ PUT [1529] - - [1256] - ╰─ GET [1523] - - [1257] - ╰─ GET [1525] - - [1258] - ╰─ POST [1526] - - [1259] - ╰─ POST [1527] - - [1260] - ╰─ GET [1530] - - [1261] - ╰─ POST [1531] - - [1262] - ╰─ GET [1532] - - [1263] - ╰─ GET [1533] - - [1264] - ├─ GET [1538] - ╰─ POST [1534] - - [1265] - ├─ DELETE [1535] - ╰─ GET [1546] - - [1266] - ╰─ GET [1536] - - [1267] - ╰─ GET [1537] - - [1268] - ╰─ GET [1539] - - [1269] - ╰─ GET [1540] - - [1270] - ╰─ GET [1541] - - [1271] - ╰─ GET [1542] - - [1272] - ╰─ POST [1543] - - [1273] - ╰─ GET [1544] - - [1274] - ╰─ GET [1545] - - [1275] - ╰─ GET [1547] - - [1276] - ╰─ GET [1548] - - [1277] - ╰─ GET [1549] - - [1278] - ╰─ POST [1550] - - [1279] - ╰─ GET [1551] - - [1280] - ╰─ GET [1552] - - [1281] - ├─ GET [1553] - ├─ PATCH [1554] - ╰─ PUT [1555] - - [1282] - ╰─ POST [1556] - - [1283] - ├─ DELETE [1557] - ├─ PATCH [1563] - ╰─ PUT [1564] - - [1284] - ╰─ GET [1558] - - [1285] - ╰─ DELETE [1559] - - [1286] - ├─ GET [1560] - ╰─ POST [1561] - - [1287] - ╰─ POST [1562] - - [1288] - ╰─ GET [1565] - - [1289] - ├─ GET [1569] - ╰─ POST [1566] - - [1290] - ├─ DELETE [1567] - ├─ PATCH [1571] - ╰─ PUT [1572] - - [1291] - ╰─ GET [1568] - - [1292] - ╰─ GET [1570] - - [1293] - ╰─ POST [1573] - - [1294] - ├─ GET [1576] - ╰─ POST [1574] - - [1295] - ├─ DELETE [1575] - ├─ GET [1577] - ├─ PATCH [1578] - ╰─ PUT [1579] - - [1296] - ╰─ POST [1580] - - [1297] - ├─ DELETE [1581] - ├─ PATCH [1583] - ╰─ PUT [1584] - - [1298] - ╰─ GET [1582] - - [1299] - ├─ GET [1587] - ╰─ POST [1585] - - [1300] - ├─ DELETE [1586] - ├─ GET [1588] - ├─ PATCH [1589] - ╰─ PUT [1590] - - [1301] - ├─ PATCH [1591] - ╰─ PUT [1592] - - [1302] - ╰─ GET [1593] - - [1303] - ╰─ GET [1594] - - [1304] - ╰─ GET [1595] - - [1305] - ╰─ GET [1596] - - [1306] - ╰─ GET [1597] - - [1307] - ╰─ GET [1598] - - [1308] - ╰─ GET [1599] - - [1309] - ╰─ GET [1600] - - [1310] - ╰─ GET [1601] - - [1311] - ╰─ GET [1602] - - [1312] - ├─ DELETE [1603] - ╰─ GET [1605] - - [1313] - ╰─ GET [1604] - - [1314] - ╰─ DELETE [1606] - - [1315] - ╰─ DELETE [1607] - - [1316] - ╰─ GET [1608] - - [1317] - ╰─ GET [1609] - - [1318] - ╰─ GET [1610] - - [1319] - ╰─ GET [1611] - - [1320] - ╰─ GET [1612] - - [1321] - ╰─ GET [1613] - - [1322] - ╰─ GET [1614] - - [1323] - ╰─ GET [1615] - - [1324] - ╰─ GET [1616] - - [1325] - ╰─ POST [1617] - - [1326] - ╰─ POST [1618] - - [1327] - ╰─ POST [1619] - - [1328] - ╰─ POST [1620] - - [1329] - ╰─ GET [1621] - - [1330] - ╰─ POST [1622] - - [1331] - ╰─ DELETE [1623] - - [1332] - ├─ DELETE [1624] - ├─ GET [1631] - ├─ PATCH [1634] - ╰─ PUT [1635] - - [1333] - ╰─ GET [1625] - - [1334] - ╰─ GET [1626] - - [1335] - ╰─ GET [1627] - - [1336] - ╰─ POST [1628] - - [1337] - ╰─ GET [1629] - - [1338] - ╰─ POST [1630] - - [1339] - ╰─ POST [1632] - - [1340] - ╰─ POST [1633] - - [1341] - ╰─ GET [1636] - - [1342] - ╰─ GET [1637] - - [1343] - ╰─ GET [1638] - - [1344] - ╰─ GET [1639] - - [1345] - ╰─ GET [1640] - - [1346] - ╰─ GET [1641] - - [1347] - ╰─ GET [1642] - - [1348] - ╰─ GET [1643] - - [1349] - ╰─ GET [1644] - - [1350] - ╰─ GET [1645] - - [1351] - ╰─ GET [1646] - - [1352] - ╰─ GET [1647] - - [1353] - ╰─ GET [1648] - - [1354] - ╰─ GET [1649] - - [1355] - ╰─ GET [1650] - - [1356] - ╰─ GET [1651] - - [1357] - ╰─ GET [1652] - - [1358] - ╰─ GET [1653] - - [1359] - ╰─ GET [1654] - - [1360] - ╰─ GET [1655] - - [1361] - ╰─ GET [1656] - - [1362] - ╰─ GET [1657] - - [1363] - ╰─ GET [1658] - - [1364] - ├─ GET [1661] - ╰─ POST [1659] - - [1365] - ├─ DELETE [1660] - ├─ PATCH [1663] - ╰─ PUT [1664] - - [1366] - ╰─ POST [1662] - - [1367] - ╰─ GET [1665] - - [1368] - ├─ GET [1666] - ╰─ PUT [1667] - - [1369] - ├─ DELETE [1669] - ├─ GET [1670] - ├─ PATCH [1671] - ├─ POST [1668] - ╰─ PUT [1672] - - [1370] - ╰─ POST [1673] - - [1371] - ├─ GET [1675] - ╰─ POST [1674] - - [1372] - ╰─ PUT [1676] - - [1373] - ├─ GET [1677] - ├─ PATCH [1678] - ╰─ PUT [1679] - - [1374] - ╰─ GET [1680] - - [1375] - ╰─ GET [1681] - - [1376] - ╰─ POST [1682] - - [1377] - ╰─ PUT [1683] - - [1378] - ╰─ GET [1684] - - [1379] - ├─ GET [1685] - ├─ PATCH [1686] - ╰─ PUT [1687] - - [1380] - ╰─ POST [1688] - - [1381] - ╰─ GET [1689] - - [1382] - ╰─ GET [1690] - - [1383] - ╰─ GET [1691] - - [1384] - ╰─ PUT [1692] - - [1385] - ├─ PATCH [1693] - ╰─ PUT [1694] - - [1386] - ├─ GET [1695] - ├─ PATCH [1696] - ╰─ PUT [1697] - - [1387] - ╰─ POST [1698] - - [1388] - ╰─ POST [1699] - - [1389] - ├─ GET [1700] - ├─ PATCH [1701] - ╰─ PUT [1702] - - [1390] - ╰─ GET [1703] - - [1391] - ╰─ GET [1704] - - [1392] - ╰─ POST [1705] - - [1393] - ╰─ POST [1706] - - [1394] - ╰─ POST [1707] - - [1395] - ├─ GET [1708] - ├─ PATCH [1709] - ╰─ PUT [1710] - - [1396] - ├─ DELETE [1711] - ├─ PATCH [1714] - ╰─ PUT [1715] - - [1397] - ╰─ GET [1712] - - [1398] - ╰─ GET [1713] - - [1399] - ╰─ GET [1716] - - [1400] - ╰─ GET [1717] - - [1401] - ╰─ POST [1718] - - [1402] - ╰─ GET [1719] - - [1403] - ╰─ GET [1720] - - [1404] - ╰─ GET [1721] - - [1405] - ╰─ GET [1722] - - [1406] - ╰─ POST [1723] - - [1407] - ╰─ GET [1724] - - [1408] - ╰─ GET [1725] - - [1409] - ╰─ POST [1726] - - [1410] - ╰─ DELETE [1727] - - [1411] - ├─ GET [1730] - ╰─ POST [1728] - - [1412] - ├─ DELETE [1729] - ╰─ GET [1732] - - [1413] - ╰─ GET [1731] - - [1414] - ├─ GET [1735] - ╰─ POST [1733] - - [1415] - ╰─ DELETE [1734] - - [1416] - ╰─ GET [1736] - - [1417] - ╰─ GET [1737] - - [1418] - ╰─ GET [1738] - - [1419] - ╰─ GET [1739] - - [1420] - ╰─ POST [1740] - - [1421] - ╰─ GET [1741] - - [1422] - ╰─ GET [1742] - - [1423] - ╰─ POST [1743] - - [1424] - ╰─ GET [1744] - - [1425] - ╰─ GET [1745] - - [1426] - ├─ GET [1748] - ╰─ POST [1746] - - [1427] - ├─ DELETE [1747] - ├─ PATCH [1749] - ╰─ PUT [1750] - - [1428] - ╰─ POST [1751] - - [1429] - ╰─ POST [1752] - - [1430] - ╰─ GET [1753] - - [1431] - ╰─ GET [1754] - - [1432] - ├─ GET [1755] - ├─ PATCH [1756] - ╰─ PUT [1757] - - [1433] - ╰─ GET [1758] - - [1434] - ├─ GET [1761] - ╰─ POST [1759] - - [1435] - ├─ DELETE [1760] - ├─ PATCH [1762] - ╰─ PUT [1763] - - [1436] - ╰─ GET [1764] - - [1437] - ╰─ POST [1765] - - [1438] - ╰─ POST [1766] - - [1439] - ╰─ POST [1767] - - [1440] - ╰─ POST [1768] - - [1441] - ╰─ GET [1769] - - [1442] - ├─ GET [1803] - ╰─ POST [1770] - - [1443] - ├─ DELETE [1771] - ├─ GET [1780] - ╰─ PUT [1782] - - [1444] - ╰─ GET [1772] - - [1445] - ╰─ GET [1773] - - [1446] - ╰─ GET [1774] - - [1447] - ╰─ GET [1775] - - [1448] - ╰─ GET [1776] - - [1449] - ╰─ GET [1777] - - [1450] - ╰─ POST [1778] - - [1451] - ╰─ GET [1779] - - [1452] - ╰─ GET [1781] - - [1453] - ╰─ POST [1783] - - [1454] - ╰─ POST [1784] - - [1455] - ╰─ GET [1785] - - [1456] - ╰─ GET [1786] - - [1457] - ╰─ GET [1787] - - [1458] - ╰─ GET [1788] - - [1459] - ╰─ GET [1789] - - [1460] - ╰─ GET [1790] - - [1461] - ╰─ GET [1791] - - [1462] - ╰─ GET [1792] - - [1463] - ╰─ GET [1793] - - [1464] - ╰─ GET [1794] - - [1465] - ╰─ GET [1795] - - [1466] - ╰─ GET [1796] - - [1467] - ╰─ GET [1797] - - [1468] - ╰─ GET [1798] - - [1469] - ╰─ GET [1799] - - [1470] - ╰─ GET [1800] - - [1471] - ╰─ GET [1802] - - [1472] - ╰─ GET [1804] - - [1473] - ╰─ GET [1805] - - [1474] - ╰─ GET [1806] - - [1475] - ├─ DELETE [1807] - ├─ GET [1807] - ├─ PATCH [1807] - ╰─ POST [1807] - - [1476] - ├─ DELETE [1808] - ├─ GET [1808] - ├─ PATCH [1808] - ╰─ POST [1808] - - [1477] - ├─ DELETE [1809] - ├─ GET [1809] - ├─ PATCH [1809] - ╰─ POST [1809] - - [1478] - ├─ DELETE [1810] - ├─ GET [1810] - ├─ PATCH [1810] - ╰─ POST [1810] - - [1479] - ├─ DELETE [1811] - ├─ GET [1811] - ├─ PATCH [1811] - ╰─ POST [1811] - - [1480] - ├─ DELETE [1812] - ├─ GET [1812] - ├─ PATCH [1812] - ╰─ POST [1812] - - [1481] - ├─ DELETE [1813] - ├─ GET [1813] - ├─ PATCH [1813] - ╰─ POST [1813] - - [1482] - ├─ DELETE [1814] - ├─ GET [1814] - ├─ PATCH [1814] - ╰─ POST [1814] - - [1483] - ├─ DELETE [1815] - ├─ GET [1815] - ├─ PATCH [1815] - ╰─ POST [1815] - - [1484] - ├─ DELETE [1816] - ├─ GET [1816] - ├─ PATCH [1816] - ╰─ POST [1816] - - [1485] - ├─ DELETE [1817] - ├─ GET [1817] - ├─ PATCH [1817] - ╰─ POST [1817] - - [1486] - ├─ DELETE [1818] - ├─ GET [1818] - ├─ PATCH [1818] - ╰─ POST [1818] - - [1487] - ├─ DELETE [1819] - ├─ GET [1819] - ├─ PATCH [1819] - ╰─ POST [1819] - - [1488] - ├─ DELETE [1820] - ├─ GET [1820] - ├─ PATCH [1820] - ╰─ POST [1820] - - [1489] - ├─ DELETE [1821] - ├─ GET [1821] - ├─ PATCH [1821] - ╰─ POST [1821] - - [1490] - ├─ DELETE [1822] - ├─ GET [1822] - ├─ PATCH [1822] - ╰─ POST [1822] - - [1491] - ├─ DELETE [1823] - ├─ GET [1823] - ├─ PATCH [1823] - ╰─ POST [1823] - - [1492] - ├─ DELETE [1824] - ├─ GET [1824] - ├─ PATCH [1824] - ╰─ POST [1824] - - [1493] - ├─ DELETE [1825] - ├─ GET [1825] - ├─ PATCH [1825] - ╰─ POST [1825] - - [1494] - ├─ DELETE [1826] - ├─ GET [1826] - ├─ PATCH [1826] - ╰─ POST [1826] - - [1495] - ├─ DELETE [1827] - ├─ GET [1827] - ├─ PATCH [1827] - ╰─ POST [1827] - - [1496] - ├─ DELETE [1828] - ├─ GET [1828] - ├─ PATCH [1828] - ╰─ POST [1828] - - [1497] - ├─ DELETE [1829] - ├─ GET [1829] - ├─ PATCH [1829] - ╰─ POST [1829] - - [1498] - ├─ DELETE [1830] - ├─ GET [1830] - ├─ PATCH [1830] - ╰─ POST [1830] - - [1499] - ├─ DELETE [1831] - ├─ GET [1831] - ├─ PATCH [1831] - ╰─ POST [1831] - - [1500] - ├─ DELETE [1832] - ├─ GET [1832] - ├─ PATCH [1832] - ╰─ POST [1832] - - [1501] - ├─ DELETE [1833] - ├─ GET [1833] - ├─ PATCH [1833] - ╰─ POST [1833] - - [1502] - ├─ DELETE [1834] - ├─ GET [1834] - ├─ PATCH [1834] - ╰─ POST [1834] - - [1503] - ├─ DELETE [1835] - ├─ GET [1835] - ├─ PATCH [1835] - ╰─ POST [1835] - - [1504] - ├─ DELETE [1836] - ├─ GET [1836] - ├─ PATCH [1836] - ╰─ POST [1836] - - [1505] - ╰─ GET [1837] - - [1506] - ╰─ GET [1838] - - [1507] - ╰─ GET [1839] - - [1508] - ╰─ GET [1840] - - [1509] - ╰─ GET [1841] - - [1510] - ╰─ GET [1842] - - [1511] - ╰─ GET [1843] - - [1512] - ╰─ GET [1844] - - [1513] - ╰─ GET [1845] - - [1514] - ╰─ GET [1846] - - [1515] - ╰─ GET [1847] - - [1516] - ╰─ GET [1848] - - [1517] - ╰─ GET [1849] - - [1518] - ╰─ GET [1850] - - [1519] - ╰─ GET [1851] - - [1520] - ╰─ GET [1852] - - [1521] - ╰─ GET [1853] - - [1522] - ╰─ GET [1854] - - [1523] - ╰─ GET [1855] - - [1524] - ╰─ GET [1856] - - [1525] - ╰─ GET [1857] - - [1526] - ╰─ GET [1858] - - [1527] - ╰─ GET [1859] - - [1528] - ╰─ GET [1860] - - [1529] - ├─ DELETE [1862] - ├─ PATCH [1865] - ├─ POST [1861] - ╰─ PUT [1866] - - [1530] - ╰─ GET [1863] - - [1531] - ╰─ GET [1864] - - [1532] - ╰─ POST [1867] - - [1533] - ╰─ GET [1868] - - [1534] - ╰─ POST [1869] - - [1535] - ╰─ GET [1870] - - [1536] - ├─ GET [1871] - ├─ PATCH [1872] - ╰─ PUT [1873] - - [1537] - ├─ GET [1877] - ╰─ POST [1874] - - [1538] - ├─ DELETE [1875] - ├─ GET [1881] - ├─ PATCH [1882] - ╰─ PUT [1883] - - [1539] - ╰─ GET [1876] - - [1540] - ╰─ GET [1878] - - [1541] - ╰─ GET [1879] - - [1542] - ╰─ GET [1880] - - [1543] - ╰─ GET [1884] - - [1544] - ╰─ POST [1885] - - [1545] - ╰─ POST [1886] - - [1546] - ╰─ POST [1887] - - [1547] - ╰─ POST [1888] - - [1548] - ╰─ GET [1889] - - [1549] - ╰─ GET [1890] - - [1550] - ╰─ POST [1891] - - [1551] - ╰─ POST [1892] - - [1552] - ╰─ POST [1893] - - [1553] - ╰─ POST [1894] - - [1554] - ╰─ POST [1895] - - [1555] - ╰─ POST [1896] - - [1556] - ╰─ GET [1897] - - [1557] - ╰─ GET [1898] - - [1558] - ╰─ POST [1899] - - [1559] - ╰─ POST [1900] - - [1560] - ├─ GET [1907] - ╰─ POST [1901] - - [1561] - ├─ GET [1908] - ╰─ POST [1902] - - [1562] - ├─ DELETE [1903] - ├─ GET [1911] - ├─ PATCH [1915] - ╰─ PUT [1917] - - [1563] - ├─ DELETE [1904] - ├─ GET [1912] - ├─ PATCH [1916] - ╰─ PUT [1918] - - [1564] - ╰─ GET [1905] - - [1565] - ╰─ GET [1906] - - [1566] - ╰─ GET [1909] - - [1567] - ╰─ GET [1910] - - [1568] - ╰─ POST [1913] - - [1569] - ╰─ POST [1914] - - [1570] - ╰─ POST [1919] - - [1571] - ╰─ POST [1920] - - [1572] - ╰─ GET [1921] - - [1573] - ╰─ GET [1922] - - [1574] - ╰─ PUT [1923] - - [1575] - ╰─ PUT [1924] - - [1576] - ╰─ PUT [1925] - - [1577] - ╰─ PUT [1926] - - [1578] - ╰─ GET [1928] - - [1579] - ╰─ GET [1929] - - [1580] - ╰─ GET [1930] - - [1581] - ╰─ GET [1931] - - [1582] - ╰─ GET [1932] - - [1583] - ╰─ GET [1933] - - [1584] - ╰─ GET [1934] - - [1585] - ╰─ GET [1935] - - [1586] - ╰─ GET [1936] - - [1587] - ╰─ GET [1937] - - [1588] - ╰─ GET [1938] - - [1589] - ├─ GET [1941] - ╰─ POST [1939] - - [1590] - ╰─ DELETE [1940] - - [1591] - ╰─ GET [1942] - - [1592] - ├─ GET [1943] - ╰─ POST [1943] - - [1593] - ├─ GET [1948] - ╰─ POST [1944] - - [1594] - ├─ GET [1949] - ╰─ POST [1945] - - [1595] - ╰─ POST [1946] - - [1596] - ╰─ POST [1947] - - [1597] - ╰─ POST [1950] - - [1598] - ╰─ GET [1951] - - [1599] - ╰─ PATCH [1952] - - [1600] - ╰─ GET [1953] - - [1601] - ╰─ POST [1954] - - [1602] - ╰─ GET [1955] - - [1603] - ╰─ GET [1956] - - [1604] - ╰─ GET [1957] - - [1605] - ╰─ GET [1958] - - [1606] - ╰─ POST [1959] - - [1607] - ╰─ GET [1960] - - [1608] - ╰─ POST [1961] - - [1609] - ╰─ GET [1962] - - [1610] - ╰─ GET [1963] - - [1611] - ╰─ GET [1964] - - [1612] - ╰─ POST [1965] - - [1613] - ╰─ GET [1966] - - [1614] - ├─ GET [1970] - ╰─ POST [1967] - - [1615] - ╰─ DELETE [1968] - - [1616] - ├─ DELETE [1969] - ├─ PATCH [1972] - ╰─ PUT [1973] - - [1617] - ╰─ POST [1971] - - [1618] - ╰─ GET [1974] - - [1619] - ╰─ GET [1975] - - [1620] - ╰─ GET [1976] - - [1621] - ├─ DELETE [1977] - ├─ GET [1979] - ├─ PATCH [1980] - ╰─ PUT [1981] - - [1622] - ╰─ GET [1978] - - [1623] - ╰─ POST [1982] - - [1624] - ╰─ GET [1983] - - [1625] - ╰─ POST [1984] - - [1626] - ╰─ POST [1985] - - [1627] - ╰─ GET [1986] - - [1628] - ╰─ GET [1987] - - [1629] - ╰─ GET [1988] - - [1630] - ╰─ GET [1989] - - [1631] - ╰─ GET [1990] - - [1632] - ╰─ GET [1991] - - [1633] - ╰─ GET [1992] - - [1634] - ╰─ DELETE [1993] - - [1635] - ╰─ GET [1994] - - [1636] - ╰─ GET [1995] - - [1637] - ├─ GET [1998] - ╰─ POST [1996] - - [1638] - ╰─ DELETE [1997] - - [1639] - ╰─ PUT [1999] - - [1640] - ╰─ POST [2000] - - [1641] - ╰─ GET [2001] - - [1642] - ├─ PATCH [2006] - ├─ POST [2002] - ╰─ PUT [2007] - - [1643] - ╰─ GET [2003] - - [1644] - ╰─ GET [2004] - - [1645] - ╰─ PUT [2005] - - [1646] - ├─ GET [2009] - ╰─ POST [2008] - - [1647] - ╰─ PUT [2010] - - [1648] - ╰─ PUT [2011] - - [1649] - ├─ GET [2012] - ├─ PATCH [2013] - ╰─ PUT [2014] - - [1650] - ├─ GET [2017] - ╰─ POST [2015] - - [1651] - ├─ DELETE [2016] - ╰─ GET [2019] - - [1652] - ╰─ DELETE [2018] - - [1653] - ╰─ GET [2020] - - [1654] - ╰─ GET [2021] - - [1655] - ╰─ GET [2022] - - [1656] - ╰─ GET [2023] - - [1657] - ╰─ GET [2024] - - [1658] - ╰─ GET [2025] - - [1659] - ╰─ GET [2026] - - [1660] - ╰─ GET [2027] - - [1661] - ╰─ POST [2028] - - [1662] - ╰─ GET [2029] - - [1663] - ╰─ GET [2030] - - [1664] - ╰─ GET [2031] - - [1665] - ╰─ GET [2032] - - [1666] - ╰─ GET [2033] - - [1667] - ╰─ GET [2034] - - [1668] - ╰─ GET [2035] - - [1669] - ╰─ GET [2036] - - [1670] - ╰─ GET [2037] - - [1671] - ╰─ POST [2038] - - [1672] - ╰─ POST [2039] - - [1673] - ╰─ POST [2040] - - [1674] - ╰─ POST [2041] - - [1675] - ╰─ POST [2042] - - [1676] - ╰─ GET [2043] - - [1677] - ╰─ GET [2044] - - [1678] - ╰─ PATCH [2045] - - [1679] - ╰─ GET [2046] - - [1680] - ╰─ GET [2047] - - [1681] - ╰─ POST [2048] - - [1682] - ╰─ POST [2049] - - [1683] - ╰─ POST [2050] - - [1684] - ├─ PATCH [2051] - ╰─ PUT [2052] - - [1685] - ╰─ POST [2053] - - [1686] - ╰─ GET [2054] - - [1687] - ╰─ POST [2055] - - [1688] - ╰─ GET [2056] - - [1689] - ╰─ POST [2057] - - [1690] - ╰─ GET [2058] - - [1691] - ╰─ GET [2059] - - [1692] - ╰─ PATCH [2060] - - [1693] - ╰─ GET [2061] - - [1694] - ╰─ POST [2062] - - [1695] - ╰─ GET [2063] - - [1696] - ╰─ POST [2064] - - [1697] - ╰─ POST [2065] - - [1698] - ╰─ POST [2066] - - [1699] - ╰─ POST [2067] - - [1700] - ╰─ POST [2068] - - [1701] - ╰─ GET [2069] - - [1702] - ├─ GET [2071] - ╰─ POST [2070] - - [1703] - ╰─ GET [2072] - - [1704] - ╰─ GET [2073] - === Chains - *-1-* - *-2-1 - *-3-2 - *-4-* - *-5-3 - *-5-884 - *-6-* - *-6-1927 - *-7-* - *-8-* - *-9-* - *-10-* - *-11-* - *-12-* - *-13-4 - *-14-5 - *-15-6 - *-16-7 - *-17-8 - *-18-9 - *-19-10 - *-19-13 - *-19-14 - *-19-15 - *-20-11 - *-21-12 - *-22-16 - *-23-17 - *-23-18 - *-24-19 - *-25-20 - *-26-21 - *-27-22 - *-28-23 - *-29-24 - *-30-25 - *-31-26 - *-32-27 - *-33-28 - *-34-29 - *-35-30 - *-36-31 - *-37-32 - *-38-33 - *-39-34 - *-40-35 - *-41-36 - *-42-37 - *-43-38 - *-44-39 - *-45-40 - *-45-41 - *-46-42 - *-47-43 - *-48-44 - *-48-50 - *-48-51 - *-48-52 - *-49-45 - *-50-46 - *-51-47 - *-52-48 - *-53-49 - *-54-53 - *-55-54 - *-56-55 - *-57-56 - *-58-57 - *-59-58 - *-59-61 - *-60-59 - *-60-65 - *-60-66 - *-60-67 - *-61-60 - *-62-62 - *-63-63 - *-64-64 - *-65-68 - *-66-69 - *-67-70 - *-68-71 - *-69-72 - *-70-73 - *-71-74 - *-72-75 - *-73-76 - *-74-77 - *-74-80 - *-75-78 - *-75-82 - *-75-83 - *-76-79 - *-77-81 - *-78-84 - *-78-85 - *-78-86 - *-79-87 - *-80-88 - *-81-89 - *-82-90 - *-83-91 - *-83-97 - *-83-98 - *-83-99 - *-84-92 - *-85-93 - *-86-94 - *-87-95 - *-88-96 - *-89-100 - *-90-101 - *-91-102 - *-92-103 - *-93-104 - *-94-105 - *-95-106 - *-96-107 - *-97-108 - *-97-111 - *-98-109 - *-98-113 - *-98-114 - *-99-110 - *-100-112 - *-101-115 - *-102-116 - *-103-117 - *-104-118 - *-105-119 - *-106-120 - *-106-121 - *-107-122 - *-107-125 - *-108-123 - *-109-124 - *-110-126 - *-111-127 - *-112-128 - *-112-129 - *-113-130 - *-114-131 - *-115-132 - *-116-133 - *-116-134 - *-116-135 - *-117-136 - *-118-137 - *-119-138 - *-120-139 - *-121-140 - *-121-143 - *-122-141 - *-122-147 - *-122-148 - *-122-149 - *-123-142 - *-124-144 - *-125-145 - *-126-146 - *-127-150 - *-128-151 - *-129-152 - *-130-153 - *-130-156 - *-131-154 - *-131-158 - *-131-159 - *-132-155 - *-133-157 - *-134-160 - *-134-163 - *-135-161 - *-135-165 - *-135-166 - *-136-162 - *-137-164 - *-138-167 - *-138-168 - *-139-169 - *-140-170 - *-141-171 - *-142-172 - *-142-173 - *-143-174 - *-144-175 - *-145-176 - *-146-177 - *-147-178 - *-148-179 - *-148-180 - *-149-181 - *-150-182 - *-151-183 - *-151-184 - *-152-185 - *-152-188 - *-153-186 - *-153-190 - *-153-191 - *-153-192 - *-154-187 - *-155-189 - *-156-193 - *-156-194 - *-156-196 - *-157-195 - *-158-197 - *-159-198 - *-160-199 - *-161-200 - *-162-201 - *-163-202 - *-164-203 - *-164-207 - *-164-209 - *-164-210 - *-165-204 - *-166-205 - *-167-206 - *-168-208 - *-169-211 - *-169-212 - *-169-213 - *-170-214 - *-171-215 - *-172-216 - *-173-217 - *-174-218 - *-174-226 - *-174-228 - *-174-229 - *-175-219 - *-176-220 - *-177-221 - *-178-222 - *-179-223 - *-180-224 - *-181-225 - *-182-227 - *-183-230 - *-184-231 - *-185-232 - *-186-233 - *-187-234 - *-188-235 - *-189-236 - *-190-237 - *-191-238 - *-192-239 - *-193-240 - *-193-243 - *-194-241 - *-194-247 - *-194-248 - *-195-242 - *-196-244 - *-197-245 - *-198-246 - *-199-249 - *-200-250 - *-201-251 - *-202-252 - *-203-253 - *-204-254 - *-205-255 - *-206-256 - *-207-257 - *-208-258 - *-208-266 - *-209-259 - *-210-260 - *-210-274 - *-210-280 - *-210-281 - *-211-261 - *-212-262 - *-213-263 - *-214-264 - *-215-265 - *-216-267 - *-217-268 - *-218-269 - *-219-270 - *-220-271 - *-221-272 - *-222-273 - *-223-275 - *-224-276 - *-225-277 - *-226-278 - *-227-279 - *-228-282 - *-229-283 - *-230-284 - *-230-287 - *-230-289 - *-230-291 - *-231-285 - *-231-288 - *-231-290 - *-231-292 - *-232-286 - *-233-293 - *-234-294 - *-235-295 - *-236-296 - *-237-297 - *-238-298 - *-239-299 - *-240-300 - *-241-301 - *-242-302 - *-243-303 - *-244-304 - *-245-305 - *-246-306 - *-247-307 - *-248-308 - *-249-309 - *-250-310 - *-251-311 - *-252-312 - *-253-313 - *-254-314 - *-255-315 - *-255-319 - *-256-316 - *-256-320 - *-257-317 - *-258-318 - *-259-321 - *-260-322 - *-261-323 - *-262-324 - *-263-325 - *-264-326 - *-265-327 - *-266-328 - *-267-329 - *-268-330 - *-269-331 - *-270-332 - *-271-333 - *-272-334 - *-273-335 - *-274-336 - *-275-337 - *-276-338 - *-277-339 - *-278-340 - *-279-341 - *-280-342 - *-281-343 - *-282-344 - *-283-345 - *-284-346 - *-285-347 - *-286-348 - *-286-350 - *-287-349 - *-288-351 - *-288-352 - *-288-353 - *-289-354 - *-290-355 - *-291-356 - *-292-357 - *-293-358 - *-294-359 - *-295-360 - *-296-361 - *-297-362 - *-298-363 - *-299-364 - *-300-365 - *-301-366 - *-302-367 - *-303-368 - *-304-369 - *-305-370 - *-306-371 - *-307-372 - *-307-373 - *-308-374 - *-309-375 - *-310-376 - *-311-377 - *-312-378 - *-313-379 - *-314-380 - *-315-381 - *-316-382 - *-317-383 - *-318-384 - *-319-385 - *-320-386 - *-321-387 - *-322-388 - *-323-389 - *-324-390 - *-325-391 - *-326-392 - *-326-398 - *-327-393 - *-327-409 - *-327-412 - *-327-413 - *-328-394 - *-329-395 - *-330-396 - *-331-397 - *-332-399 - *-333-400 - *-334-401 - *-335-402 - *-336-403 - *-337-404 - *-338-405 - *-339-406 - *-340-407 - *-341-408 - *-342-410 - *-343-411 - *-344-414 - *-345-415 - *-346-416 - *-347-417 - *-348-418 - *-349-419 - *-350-420 - *-351-421 - *-352-422 - *-353-423 - *-354-424 - *-355-425 - *-356-426 - *-357-427 - *-358-428 - *-359-429 - *-360-430 - *-361-431 - *-362-432 - *-362-435 - *-363-433 - *-363-437 - *-363-438 - *-363-439 - *-364-434 - *-365-436 - *-366-440 - *-367-441 - *-368-442 - *-369-443 - *-370-444 - *-371-445 - *-372-446 - *-373-447 - *-374-448 - *-375-449 - *-376-450 - *-377-451 - *-378-452 - *-379-453 - *-380-454 - *-381-455 - *-382-456 - *-383-457 - *-384-458 - *-385-459 - *-386-460 - *-387-461 - *-388-462 - *-389-463 - *-390-464 - *-391-465 - *-392-466 - *-393-467 - *-394-468 - *-394-474 - *-394-475 - *-394-476 - *-395-469 - *-396-470 - *-397-471 - *-398-472 - *-399-473 - *-400-477 - *-401-478 - *-402-479 - *-403-480 - *-404-481 - *-405-482 - *-406-483 - *-407-484 - *-408-485 - *-409-486 - *-410-487 - *-411-488 - *-412-489 - *-413-490 - *-414-491 - *-415-492 - *-416-493 - *-416-494 - *-416-495 - *-417-496 - *-418-497 - *-419-498 - *-420-499 - *-421-500 - *-422-501 - *-423-502 - *-424-503 - *-425-504 - *-426-505 - *-426-506 - *-427-507 - *-428-508 - *-429-509 - *-429-511 - *-430-510 - *-430-512 - *-430-513 - *-431-514 - *-432-515 - *-432-521 - *-433-516 - *-434-517 - *-435-518 - *-435-524 - *-435-527 - *-435-528 - *-436-519 - *-437-520 - *-438-522 - *-439-523 - *-440-525 - *-441-526 - *-442-529 - *-442-531 - *-443-530 - *-443-532 - *-443-533 - *-444-534 - *-444-536 - *-445-535 - *-445-538 - *-445-539 - *-446-537 - *-447-540 - *-447-542 - *-448-541 - *-449-543 - *-449-544 - *-449-545 - *-450-546 - *-451-547 - *-452-548 - *-453-549 - *-453-558 - *-453-559 - *-454-550 - *-455-551 - *-456-552 - *-457-553 - *-458-554 - *-458-555 - *-459-556 - *-460-557 - *-461-560 - *-462-561 - *-463-562 - *-464-563 - *-465-564 - *-466-565 - *-467-566 - *-467-569 - *-468-567 - *-468-571 - *-468-572 - *-469-568 - *-470-570 - *-471-573 - *-472-574 - *-473-575 - *-474-576 - *-475-577 - *-476-578 - *-477-579 - *-477-582 - *-477-588 - *-477-590 - *-478-580 - *-478-589 - *-479-581 - *-480-583 - *-481-584 - *-482-585 - *-483-586 - *-484-587 - *-485-591 - *-486-592 - *-487-593 - *-488-594 - *-489-595 - *-489-598 - *-490-596 - *-490-601 - *-490-602 - *-491-597 - *-492-599 - *-493-600 - *-494-603 - *-494-605 - *-495-604 - *-496-606 - *-497-607 - *-498-608 - *-498-611 - *-499-609 - *-499-617 - *-499-618 - *-499-619 - *-500-610 - *-501-612 - *-502-613 - *-503-614 - *-504-615 - *-505-616 - *-506-620 - *-506-621 - *-507-622 - *-508-623 - *-509-624 - *-510-625 - *-511-626 - *-511-627 - *-511-628 - *-512-629 - *-513-630 - *-513-631 - *-513-632 - *-514-633 - *-514-634 - *-515-635 - *-516-636 - *-517-637 - *-518-638 - *-519-639 - *-520-640 - *-521-641 - *-521-648 - *-521-649 - *-521-650 - *-522-642 - *-523-643 - *-524-644 - *-525-645 - *-526-646 - *-527-647 - *-528-651 - *-528-653 - *-529-652 - *-530-654 - *-530-655 - *-530-656 - *-530-657 - *-531-658 - *-532-659 - *-533-660 - *-534-661 - *-535-662 - *-536-663 - *-537-664 - *-538-665 - *-539-666 - *-540-667 - *-541-668 - *-542-669 - *-543-670 - *-544-671 - *-545-672 - *-546-673 - *-547-674 - *-548-675 - *-549-676 - *-550-677 - *-550-680 - *-550-682 - *-550-684 - *-551-678 - *-551-683 - *-552-679 - *-553-681 - *-554-685 - *-554-686 - *-555-687 - *-556-688 - *-556-689 - *-556-690 - *-557-691 - *-557-694 - *-558-692 - *-558-697 - *-558-698 - *-558-699 - *-559-693 - *-560-695 - *-561-696 - *-562-700 - *-563-701 - *-564-702 - *-564-703 - *-564-704 - *-565-705 - *-566-706 - *-567-707 - *-567-709 - *-568-708 - *-568-712 - *-568-713 - *-568-714 - *-569-710 - *-570-711 - *-571-715 - *-572-716 - *-573-717 - *-574-718 - *-575-719 - *-576-720 - *-577-721 - *-578-722 - *-579-723 - *-579-724 - *-580-725 - *-580-726 - *-581-727 - *-582-728 - *-583-729 - *-584-730 - *-585-731 - *-586-732 - *-587-733 - *-588-734 - *-589-735 - *-590-736 - *-591-737 - *-592-738 - *-593-739 - *-594-740 - *-595-741 - *-595-742 - *-596-743 - *-597-744 - *-598-745 - *-599-746 - *-600-747 - *-601-748 - *-602-749 - *-603-750 - *-604-751 - *-605-752 - *-605-753 - *-605-754 - *-606-755 - *-606-1801 - *-607-756 - *-607-765 - *-607-767 - *-608-757 - *-609-758 - *-610-759 - *-611-760 - *-612-761 - *-613-762 - *-614-763 - *-615-764 - *-616-766 - *-617-768 - *-618-769 - *-619-770 - *-620-771 - *-621-772 - *-622-773 - *-623-774 - *-624-775 - *-625-776 - *-626-777 - *-627-778 - *-628-779 - *-629-780 - *-630-781 - *-631-782 - *-632-783 - *-633-784 - *-634-785 - *-635-786 - *-636-787 - *-637-788 - *-638-789 - *-639-790 - *-640-791 - *-641-792 - *-642-793 - *-643-794 - *-644-795 - *-645-796 - *-646-797 - *-647-798 - *-648-799 - *-649-800 - *-650-801 - *-651-802 - *-652-803 - *-653-804 - *-654-805 - *-655-806 - *-656-807 - *-657-808 - *-658-809 - *-659-810 - *-660-811 - *-661-812 - *-662-813 - *-663-814 - *-664-815 - *-665-816 - *-666-817 - *-666-819 - *-667-818 - *-668-820 - *-669-821 - *-670-822 - *-671-823 - *-672-824 - *-673-825 - *-674-826 - *-675-827 - *-676-828 - *-677-829 - *-678-830 - *-679-831 - *-680-832 - *-681-833 - *-682-834 - *-683-835 - *-684-836 - *-685-837 - *-686-838 - *-687-839 - *-688-840 - *-689-841 - *-690-842 - *-691-843 - *-692-844 - *-693-845 - *-694-846 - *-695-847 - *-696-848 - *-697-849 - *-698-850 - *-699-851 - *-700-852 - *-701-853 - *-702-854 - *-703-855 - *-704-856 - *-705-857 - *-706-858 - *-707-859 - *-708-860 - *-709-861 - *-710-862 - *-710-863 - *-711-864 - *-711-865 - *-712-866 - *-713-867 - *-714-868 - *-715-869 - *-716-870 - *-716-873 - *-716-874 - *-717-871 - *-717-872 - *-718-875 - *-719-876 - *-720-877 - *-720-878 - *-721-879 - *-722-880 - *-722-881 - *-723-882 - *-723-883 - *-724-885 - *-725-886 - *-726-887 - *-727-888 - *-728-889 - *-729-890 - *-730-891 - *-731-892 - *-732-893 - *-733-894 - *-734-895 - *-735-896 - *-736-897 - *-737-898 - *-738-899 - *-739-900 - *-740-901 - *-741-902 - *-742-903 - *-742-907 - *-743-904 - *-743-910 - *-743-911 - *-743-912 - *-744-905 - *-745-906 - *-746-908 - *-747-909 - *-748-913 - *-748-914 - *-748-915 - *-749-916 - *-750-917 - *-751-918 - *-752-919 - *-752-921 - *-753-920 - *-754-922 - *-755-923 - *-756-924 - *-757-925 - *-758-926 - *-759-927 - *-759-928 - *-760-929 - *-761-930 - *-761-931 - *-762-932 - *-763-933 - *-763-935 - *-763-938 - *-764-934 - *-764-936 - *-764-937 - *-765-939 - *-765-940 - *-766-941 - *-767-942 - *-768-943 - *-769-944 - *-770-945 - *-771-946 - *-772-947 - *-773-948 - *-774-949 - *-775-950 - *-776-951 - *-777-952 - *-778-953 - *-778-956 - *-778-957 - *-779-954 - *-780-955 - *-781-958 - *-782-959 - *-783-960 - *-784-961 - *-785-962 - *-786-963 - *-787-964 - *-788-965 - *-789-966 - *-790-967 - *-791-968 - *-791-971 - *-792-969 - *-793-970 - *-794-972 - *-795-973 - *-796-974 - *-797-975 - *-797-977 - *-798-976 - *-799-978 - *-800-979 - *-800-980 - *-801-981 - *-801-982 - *-801-983 - *-802-984 - *-802-985 - *-802-986 - *-803-987 - *-804-988 - *-805-989 - *-806-990 - *-806-992 - *-806-995 - *-807-991 - *-808-993 - *-809-994 - *-810-996 - *-811-997 - *-812-998 - *-813-999 - *-814-1000 - *-814-1007 - *-815-1001 - *-815-1015 - *-815-1020 - *-815-1021 - *-816-1002 - *-817-1003 - *-818-1004 - *-819-1005 - *-820-1006 - *-821-1008 - *-822-1009 - *-823-1010 - *-824-1011 - *-825-1012 - *-826-1013 - *-827-1014 - *-828-1016 - *-829-1017 - *-830-1018 - *-831-1019 - *-832-1022 - *-833-1023 - *-834-1024 - *-835-1025 - *-836-1026 - *-837-1027 - *-838-1028 - *-839-1029 - *-840-1030 - *-841-1031 - *-842-1032 - *-843-1033 - *-844-1034 - *-845-1035 - *-846-1036 - *-847-1037 - *-848-1038 - *-849-1039 - *-849-1042 - *-850-1040 - *-850-1044 - *-850-1045 - *-850-1046 - *-851-1041 - *-852-1043 - *-853-1047 - *-854-1048 - *-855-1049 - *-856-1050 - *-857-1051 - *-858-1052 - *-859-1053 - *-860-1054 - *-861-1055 - *-862-1056 - *-863-1057 - *-864-1058 - *-865-1059 - *-866-1060 - *-867-1061 - *-868-1062 - *-869-1063 - *-870-1064 - *-871-1065 - *-872-1066 - *-873-1067 - *-874-1068 - *-875-1069 - *-876-1070 - *-877-1071 - *-878-1072 - *-879-1073 - *-880-1074 - *-881-1075 - *-882-1076 - *-883-1077 - *-884-1078 - *-884-1079 - *-885-1080 - *-886-1081 - *-887-1082 - *-888-1083 - *-889-1084 - *-890-1085 - *-891-1086 - *-892-1087 - *-893-1088 - *-894-1089 - *-894-1091 - *-894-1096 - *-894-1098 - *-895-1090 - *-896-1092 - *-897-1093 - *-898-1094 - *-899-1095 - *-900-1097 - *-901-1099 - *-902-1100 - *-903-1101 - *-904-1102 - *-904-1106 - *-905-1103 - *-906-1104 - *-907-1105 - *-908-1107 - *-909-1108 - *-910-1109 - *-911-1110 - *-912-1111 - *-913-1112 - *-914-1113 - *-915-1114 - *-916-1115 - *-917-1116 - *-918-1117 - *-919-1118 - *-919-1119 - *-920-1120 - *-921-1121 - *-922-1122 - *-923-1123 - *-924-1124 - *-925-1125 - *-926-1126 - *-927-1127 - *-927-1133 - *-927-1134 - *-927-1135 - *-928-1128 - *-929-1129 - *-930-1130 - *-931-1131 - *-932-1132 - *-933-1136 - *-934-1137 - *-935-1138 - *-936-1139 - *-937-1140 - *-938-1141 - *-939-1142 - *-940-1143 - *-941-1144 - *-942-1145 - *-943-1146 - *-944-1147 - *-945-1148 - *-946-1149 - *-947-1150 - *-948-1151 - *-948-1153 - *-949-1152 - *-950-1154 - *-951-1155 - *-952-1156 - *-953-1157 - *-954-1158 - *-955-1159 - *-956-1160 - *-957-1161 - *-958-1162 - *-959-1163 - *-960-1164 - *-961-1165 - *-962-1166 - *-963-1167 - *-964-1168 - *-965-1169 - *-966-1170 - *-967-1171 - *-968-1172 - *-969-1173 - *-969-1178 - *-970-1174 - *-971-1175 - *-972-1176 - *-973-1177 - *-974-1179 - *-975-1180 - *-975-1181 - *-976-1182 - *-977-1183 - *-978-1184 - *-979-1185 - *-980-1186 - *-981-1187 - *-982-1188 - *-983-1189 - *-983-1191 - *-984-1190 - *-985-1192 - *-986-1193 - *-986-1196 - *-987-1194 - *-988-1195 - *-989-1197 - *-990-1198 - *-991-1199 - *-992-1200 - *-992-1204 - *-992-1205 - *-993-1201 - *-994-1202 - *-995-1203 - *-996-1206 - *-997-1207 - *-998-1208 - *-999-1209 - *-1000-1210 - *-1001-1211 - *-1002-1212 - *-1002-1214 - *-1003-1213 - *-1004-1215 - *-1004-1218 - *-1005-1216 - *-1005-1220 - *-1005-1221 - *-1005-1222 - *-1006-1217 - *-1007-1219 - *-1008-1223 - *-1009-1224 - *-1010-1225 - *-1011-1226 - *-1012-1227 - *-1013-1228 - *-1014-1229 - *-1015-1230 - *-1015-1231 - *-1016-1232 - *-1017-1233 - *-1018-1234 - *-1019-1235 - *-1020-1236 - *-1020-1237 - *-1021-1238 - *-1022-1239 - *-1023-1240 - *-1024-1241 - *-1025-1242 - *-1025-1243 - *-1026-1244 - *-1027-1245 - *-1027-1246 - *-1028-1247 - *-1029-1248 - *-1030-1249 - *-1031-1250 - *-1032-1251 - *-1033-1252 - *-1033-1253 - *-1033-1254 - *-1034-1255 - *-1035-1256 - *-1036-1257 - *-1037-1258 - *-1038-1259 - *-1039-1260 - *-1040-1261 - *-1040-1264 - *-1041-1262 - *-1041-1266 - *-1041-1267 - *-1042-1263 - *-1043-1265 - *-1044-1268 - *-1045-1269 - *-1045-1271 - *-1046-1270 - *-1047-1272 - *-1048-1273 - *-1049-1274 - *-1050-1275 - *-1051-1276 - *-1052-1277 - *-1053-1278 - *-1054-1279 - *-1055-1280 - *-1056-1281 - *-1057-1282 - *-1058-1283 - *-1059-1284 - *-1060-1285 - *-1061-1286 - *-1062-1287 - *-1063-1288 - *-1063-1290 - *-1064-1289 - *-1065-1291 - *-1066-1292 - *-1067-1293 - *-1068-1294 - *-1068-1304 - *-1069-1295 - *-1070-1296 - *-1071-1297 - *-1072-1298 - *-1073-1299 - *-1073-1312 - *-1073-1316 - *-1073-1317 - *-1074-1300 - *-1075-1301 - *-1076-1302 - *-1077-1303 - *-1078-1305 - *-1079-1306 - *-1080-1307 - *-1081-1308 - *-1082-1309 - *-1083-1310 - *-1084-1311 - *-1085-1313 - *-1086-1314 - *-1087-1315 - *-1088-1318 - *-1088-1321 - *-1088-1325 - *-1088-1327 - *-1089-1319 - *-1089-1326 - *-1090-1320 - *-1091-1322 - *-1092-1323 - *-1093-1324 - *-1094-1328 - *-1095-1329 - *-1096-1330 - *-1097-1331 - *-1098-1332 - *-1099-1333 - *-1100-1334 - *-1101-1335 - *-1102-1336 - *-1103-1337 - *-1104-1338 - *-1105-1339 - *-1106-1340 - *-1107-1341 - *-1108-1342 - *-1109-1343 - *-1110-1344 - *-1111-1345 - *-1112-1346 - *-1112-1350 - *-1113-1347 - *-1113-1356 - *-1113-1357 - *-1114-1348 - *-1115-1349 - *-1116-1351 - *-1117-1352 - *-1118-1353 - *-1119-1354 - *-1120-1355 - *-1121-1358 - *-1122-1359 - *-1123-1360 - *-1124-1361 - *-1125-1362 - *-1126-1363 - *-1127-1364 - *-1128-1365 - *-1129-1366 - *-1130-1367 - *-1131-1368 - *-1132-1369 - *-1133-1370 - *-1134-1371 - *-1135-1372 - *-1136-1373 - *-1137-1374 - *-1138-1375 - *-1139-1376 - *-1140-1377 - *-1141-1378 - *-1142-1379 - *-1143-1380 - *-1144-1381 - *-1144-1401 - *-1144-1408 - *-1144-1409 - *-1145-1382 - *-1146-1383 - *-1147-1384 - *-1148-1385 - *-1149-1386 - *-1150-1387 - *-1151-1388 - *-1151-1417 - *-1152-1389 - *-1153-1390 - *-1154-1391 - *-1155-1392 - *-1156-1393 - *-1157-1394 - *-1158-1395 - *-1159-1396 - *-1160-1397 - *-1161-1398 - *-1162-1399 - *-1163-1400 - *-1164-1402 - *-1165-1403 - *-1166-1404 - *-1167-1405 - *-1168-1406 - *-1169-1407 - *-1170-1410 - *-1171-1411 - *-1172-1412 - *-1173-1413 - *-1174-1414 - *-1175-1415 - *-1176-1416 - *-1177-1418 - *-1178-1419 - *-1179-1420 - *-1180-1421 - *-1181-1422 - *-1182-1423 - *-1183-1424 - *-1184-1425 - *-1185-1426 - *-1186-1427 - *-1187-1428 - *-1188-1429 - *-1189-1430 - *-1190-1431 - *-1191-1432 - *-1191-1435 - *-1192-1433 - *-1192-1437 - *-1192-1438 - *-1193-1434 - *-1194-1436 - *-1195-1439 - *-1196-1440 - *-1197-1441 - *-1198-1442 - *-1199-1443 - *-1199-1446 - *-1200-1444 - *-1200-1453 - *-1200-1454 - *-1200-1455 - *-1201-1445 - *-1202-1447 - *-1203-1448 - *-1204-1449 - *-1205-1450 - *-1206-1451 - *-1207-1452 - *-1208-1456 - *-1208-1458 - *-1208-1459 - *-1209-1457 - *-1210-1460 - *-1211-1461 - *-1212-1462 - *-1212-1465 - *-1212-1467 - *-1212-1469 - *-1213-1463 - *-1213-1468 - *-1214-1464 - *-1215-1466 - *-1216-1470 - *-1216-1471 - *-1217-1472 - *-1217-1474 - *-1218-1473 - *-1219-1475 - *-1220-1476 - *-1221-1477 - *-1222-1478 - *-1222-1482 - *-1223-1479 - *-1224-1480 - *-1225-1481 - *-1226-1483 - *-1227-1484 - *-1228-1485 - *-1229-1486 - *-1229-1492 - *-1229-1493 - *-1230-1487 - *-1231-1488 - *-1232-1489 - *-1232-1491 - *-1233-1490 - *-1234-1494 - *-1235-1495 - *-1236-1496 - *-1237-1497 - *-1238-1498 - *-1239-1499 - *-1240-1500 - *-1240-1502 - *-1241-1501 - *-1242-1503 - *-1242-1505 - *-1242-1506 - *-1242-1507 - *-1243-1504 - *-1244-1508 - *-1245-1509 - *-1246-1510 - *-1246-1514 - *-1246-1515 - *-1246-1516 - *-1247-1511 - *-1248-1512 - *-1249-1513 - *-1250-1517 - *-1251-1518 - *-1252-1519 - *-1253-1520 - *-1254-1521 - *-1254-1524 - *-1255-1522 - *-1255-1528 - *-1255-1529 - *-1256-1523 - *-1257-1525 - *-1258-1526 - *-1259-1527 - *-1260-1530 - *-1261-1531 - *-1262-1532 - *-1263-1533 - *-1264-1534 - *-1264-1538 - *-1265-1535 - *-1265-1546 - *-1266-1536 - *-1267-1537 - *-1268-1539 - *-1269-1540 - *-1270-1541 - *-1271-1542 - *-1272-1543 - *-1273-1544 - *-1274-1545 - *-1275-1547 - *-1276-1548 - *-1277-1549 - *-1278-1550 - *-1279-1551 - *-1280-1552 - *-1281-1553 - *-1281-1554 - *-1281-1555 - *-1282-1556 - *-1283-1557 - *-1283-1563 - *-1283-1564 - *-1284-1558 - *-1285-1559 - *-1286-1560 - *-1286-1561 - *-1287-1562 - *-1288-1565 - *-1289-1566 - *-1289-1569 - *-1290-1567 - *-1290-1571 - *-1290-1572 - *-1291-1568 - *-1292-1570 - *-1293-1573 - *-1294-1574 - *-1294-1576 - *-1295-1575 - *-1295-1577 - *-1295-1578 - *-1295-1579 - *-1296-1580 - *-1297-1581 - *-1297-1583 - *-1297-1584 - *-1298-1582 - *-1299-1585 - *-1299-1587 - *-1300-1586 - *-1300-1588 - *-1300-1589 - *-1300-1590 - *-1301-1591 - *-1301-1592 - *-1302-1593 - *-1303-1594 - *-1304-1595 - *-1305-1596 - *-1306-1597 - *-1307-1598 - *-1308-1599 - *-1309-1600 - *-1310-1601 - *-1311-1602 - *-1312-1603 - *-1312-1605 - *-1313-1604 - *-1314-1606 - *-1315-1607 - *-1316-1608 - *-1317-1609 - *-1318-1610 - *-1319-1611 - *-1320-1612 - *-1321-1613 - *-1322-1614 - *-1323-1615 - *-1324-1616 - *-1325-1617 - *-1326-1618 - *-1327-1619 - *-1328-1620 - *-1329-1621 - *-1330-1622 - *-1331-1623 - *-1332-1624 - *-1332-1631 - *-1332-1634 - *-1332-1635 - *-1333-1625 - *-1334-1626 - *-1335-1627 - *-1336-1628 - *-1337-1629 - *-1338-1630 - *-1339-1632 - *-1340-1633 - *-1341-1636 - *-1342-1637 - *-1343-1638 - *-1344-1639 - *-1345-1640 - *-1346-1641 - *-1347-1642 - *-1348-1643 - *-1349-1644 - *-1350-1645 - *-1351-1646 - *-1352-1647 - *-1353-1648 - *-1354-1649 - *-1355-1650 - *-1356-1651 - *-1357-1652 - *-1358-1653 - *-1359-1654 - *-1360-1655 - *-1361-1656 - *-1362-1657 - *-1363-1658 - *-1364-1659 - *-1364-1661 - *-1365-1660 - *-1365-1663 - *-1365-1664 - *-1366-1662 - *-1367-1665 - *-1368-1666 - *-1368-1667 - *-1369-1668 - *-1369-1669 - *-1369-1670 - *-1369-1671 - *-1369-1672 - *-1370-1673 - *-1371-1674 - *-1371-1675 - *-1372-1676 - *-1373-1677 - *-1373-1678 - *-1373-1679 - *-1374-1680 - *-1375-1681 - *-1376-1682 - *-1377-1683 - *-1378-1684 - *-1379-1685 - *-1379-1686 - *-1379-1687 - *-1380-1688 - *-1381-1689 - *-1382-1690 - *-1383-1691 - *-1384-1692 - *-1385-1693 - *-1385-1694 - *-1386-1695 - *-1386-1696 - *-1386-1697 - *-1387-1698 - *-1388-1699 - *-1389-1700 - *-1389-1701 - *-1389-1702 - *-1390-1703 - *-1391-1704 - *-1392-1705 - *-1393-1706 - *-1394-1707 - *-1395-1708 - *-1395-1709 - *-1395-1710 - *-1396-1711 - *-1396-1714 - *-1396-1715 - *-1397-1712 - *-1398-1713 - *-1399-1716 - *-1400-1717 - *-1401-1718 - *-1402-1719 - *-1403-1720 - *-1404-1721 - *-1405-1722 - *-1406-1723 - *-1407-1724 - *-1408-1725 - *-1409-1726 - *-1410-1727 - *-1411-1728 - *-1411-1730 - *-1412-1729 - *-1412-1732 - *-1413-1731 - *-1414-1733 - *-1414-1735 - *-1415-1734 - *-1416-1736 - *-1417-1737 - *-1418-1738 - *-1419-1739 - *-1420-1740 - *-1421-1741 - *-1422-1742 - *-1423-1743 - *-1424-1744 - *-1425-1745 - *-1426-1746 - *-1426-1748 - *-1427-1747 - *-1427-1749 - *-1427-1750 - *-1428-1751 - *-1429-1752 - *-1430-1753 - *-1431-1754 - *-1432-1755 - *-1432-1756 - *-1432-1757 - *-1433-1758 - *-1434-1759 - *-1434-1761 - *-1435-1760 - *-1435-1762 - *-1435-1763 - *-1436-1764 - *-1437-1765 - *-1438-1766 - *-1439-1767 - *-1440-1768 - *-1441-1769 - *-1442-1770 - *-1442-1803 - *-1443-1771 - *-1443-1780 - *-1443-1782 - *-1444-1772 - *-1445-1773 - *-1446-1774 - *-1447-1775 - *-1448-1776 - *-1449-1777 - *-1450-1778 - *-1451-1779 - *-1452-1781 - *-1453-1783 - *-1454-1784 - *-1455-1785 - *-1456-1786 - *-1457-1787 - *-1458-1788 - *-1459-1789 - *-1460-1790 - *-1461-1791 - *-1462-1792 - *-1463-1793 - *-1464-1794 - *-1465-1795 - *-1466-1796 - *-1467-1797 - *-1468-1798 - *-1469-1799 - *-1470-1800 - *-1471-1802 - *-1472-1804 - *-1473-1805 - *-1474-1806 - *-1475-1807 - *-1476-1808 - *-1477-1809 - *-1478-1810 - *-1479-1811 - *-1480-1812 - *-1481-1813 - *-1482-1814 - *-1483-1815 - *-1484-1816 - *-1485-1817 - *-1486-1818 - *-1487-1819 - *-1488-1820 - *-1489-1821 - *-1490-1822 - *-1491-1823 - *-1492-1824 - *-1493-1825 - *-1494-1826 - *-1495-1827 - *-1496-1828 - *-1497-1829 - *-1498-1830 - *-1499-1831 - *-1500-1832 - *-1501-1833 - *-1502-1834 - *-1503-1835 - *-1504-1836 - *-1505-1837 - *-1506-1838 - *-1507-1839 - *-1508-1840 - *-1509-1841 - *-1510-1842 - *-1511-1843 - *-1512-1844 - *-1513-1845 - *-1514-1846 - *-1515-1847 - *-1516-1848 - *-1517-1849 - *-1518-1850 - *-1519-1851 - *-1520-1852 - *-1521-1853 - *-1522-1854 - *-1523-1855 - *-1524-1856 - *-1525-1857 - *-1526-1858 - *-1527-1859 - *-1528-1860 - *-1529-1861 - *-1529-1862 - *-1529-1865 - *-1529-1866 - *-1530-1863 - *-1531-1864 - *-1532-1867 - *-1533-1868 - *-1534-1869 - *-1535-1870 - *-1536-1871 - *-1536-1872 - *-1536-1873 - *-1537-1874 - *-1537-1877 - *-1538-1875 - *-1538-1881 - *-1538-1882 - *-1538-1883 - *-1539-1876 - *-1540-1878 - *-1541-1879 - *-1542-1880 - *-1543-1884 - *-1544-1885 - *-1545-1886 - *-1546-1887 - *-1547-1888 - *-1548-1889 - *-1549-1890 - *-1550-1891 - *-1551-1892 - *-1552-1893 - *-1553-1894 - *-1554-1895 - *-1555-1896 - *-1556-1897 - *-1557-1898 - *-1558-1899 - *-1559-1900 - *-1560-1901 - *-1560-1907 - *-1561-1902 - *-1561-1908 - *-1562-1903 - *-1562-1911 - *-1562-1915 - *-1562-1917 - *-1563-1904 - *-1563-1912 - *-1563-1916 - *-1563-1918 - *-1564-1905 - *-1565-1906 - *-1566-1909 - *-1567-1910 - *-1568-1913 - *-1569-1914 - *-1570-1919 - *-1571-1920 - *-1572-1921 - *-1573-1922 - *-1574-1923 - *-1575-1924 - *-1576-1925 - *-1577-1926 - *-1578-1928 - *-1579-1929 - *-1580-1930 - *-1581-1931 - *-1582-1932 - *-1583-1933 - *-1584-1934 - *-1585-1935 - *-1586-1936 - *-1587-1937 - *-1588-1938 - *-1589-1939 - *-1589-1941 - *-1590-1940 - *-1591-1942 - *-1592-1943 - *-1593-1944 - *-1593-1948 - *-1594-1945 - *-1594-1949 - *-1595-1946 - *-1596-1947 - *-1597-1950 - *-1598-1951 - *-1599-1952 - *-1600-1953 - *-1601-1954 - *-1602-1955 - *-1603-1956 - *-1604-1957 - *-1605-1958 - *-1606-1959 - *-1607-1960 - *-1608-1961 - *-1609-1962 - *-1610-1963 - *-1611-1964 - *-1612-1965 - *-1613-1966 - *-1614-1967 - *-1614-1970 - *-1615-1968 - *-1616-1969 - *-1616-1972 - *-1616-1973 - *-1617-1971 - *-1618-1974 - *-1619-1975 - *-1620-1976 - *-1621-1977 - *-1621-1979 - *-1621-1980 - *-1621-1981 - *-1622-1978 - *-1623-1982 - *-1624-1983 - *-1625-1984 - *-1626-1985 - *-1627-1986 - *-1628-1987 - *-1629-1988 - *-1630-1989 - *-1631-1990 - *-1632-1991 - *-1633-1992 - *-1634-1993 - *-1635-1994 - *-1636-1995 - *-1637-1996 - *-1637-1998 - *-1638-1997 - *-1639-1999 - *-1640-2000 - *-1641-2001 - *-1642-2002 - *-1642-2006 - *-1642-2007 - *-1643-2003 - *-1644-2004 - *-1645-2005 - *-1646-2008 - *-1646-2009 - *-1647-2010 - *-1648-2011 - *-1649-2012 - *-1649-2013 - *-1649-2014 - *-1650-2015 - *-1650-2017 - *-1651-2016 - *-1651-2019 - *-1652-2018 - *-1653-2020 - *-1654-2021 - *-1655-2022 - *-1656-2023 - *-1657-2024 - *-1658-2025 - *-1659-2026 - *-1660-2027 - *-1661-2028 - *-1662-2029 - *-1663-2030 - *-1664-2031 - *-1665-2032 - *-1666-2033 - *-1667-2034 - *-1668-2035 - *-1669-2036 - *-1670-2037 - *-1671-2038 - *-1672-2039 - *-1673-2040 - *-1674-2041 - *-1675-2042 - *-1676-2043 - *-1677-2044 - *-1678-2045 - *-1679-2046 - *-1680-2047 - *-1681-2048 - *-1682-2049 - *-1683-2050 - *-1684-2051 - *-1684-2052 - *-1685-2053 - *-1686-2054 - *-1687-2055 - *-1688-2056 - *-1689-2057 - *-1690-2058 - *-1691-2059 - *-1692-2060 - *-1693-2061 - *-1694-2062 - *-1695-2063 - *-1696-2064 - *-1697-2065 - *-1698-2066 - *-1699-2067 - *-1700-2068 - *-1701-2069 - *-1702-2070 - *-1702-2071 - *-1703-2072 - *-1704-2073 - "); - - Ok(()) -} diff --git a/tests/insert.rs b/tests/insert.rs index 48f41272..f33d8f58 100644 --- a/tests/insert.rs +++ b/tests/insert.rs @@ -1,42 +1,21 @@ -use similar_asserts::assert_eq; use std::error::Error; + +use similar_asserts::assert_eq; use wayfind::{ - errors::{InsertError, PathConstraintError, PathInsertError, PathTemplateError}, - AuthorityId, DataChain, MethodId, PathConstraint, PathId, RouteBuilder, Router, + errors::{ConstraintError, InsertError, TemplateError}, + Constraint, Router, }; #[test] fn test_insert_conflict() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/test", 1)?; - let route = RouteBuilder::new().route("/test").build()?; - router.insert(&route, 1)?; + let insert = router.insert("/test", 2); + assert_eq!(insert, Err(InsertError::Conflict)); - let route = RouteBuilder::new().route("/test").build()?; - let insert = router.insert(&route, 2); - assert_eq!( - insert, - Err(InsertError::Conflict { - chain: DataChain { - authority: AuthorityId(None), - path: PathId(1), - method: MethodId(None), - } - }) - ); - - let route = RouteBuilder::new().route("(/test)").build()?; - let insert = router.insert(&route, 3); - assert_eq!( - insert, - Err(InsertError::Conflict { - chain: DataChain { - authority: AuthorityId(None), - path: PathId(1), - method: MethodId(None), - } - }) - ); + let insert = router.insert("(/test)", 3); + assert_eq!(insert, Err(InsertError::Conflict)); insta::assert_snapshot!(router, @r" === Authority @@ -55,48 +34,16 @@ fn test_insert_conflict() -> Result<(), Box> { #[test] fn test_insert_conflict_expanded() -> Result<(), Box> { let mut router = Router::new(); + router.insert("(/test)", 1)?; - let route = RouteBuilder::new().route("(/test)").build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new().route("/test").build()?; - let insert = router.insert(&route, 2); - assert_eq!( - insert, - Err(InsertError::Conflict { - chain: DataChain { - authority: AuthorityId(None), - path: PathId(1), - method: MethodId(None), - } - }) - ); + let insert = router.insert("/test", 2); + assert_eq!(insert, Err(InsertError::Conflict)); - let route = RouteBuilder::new().route("(/test)").build()?; - let insert = router.insert(&route, 2); - assert_eq!( - insert, - Err(InsertError::Conflict { - chain: DataChain { - authority: AuthorityId(None), - path: PathId(1), - method: MethodId(None), - } - }) - ); + let insert = router.insert("(/test)", 2); + assert_eq!(insert, Err(InsertError::Conflict)); - let route = RouteBuilder::new().route("(/best)").build()?; - let insert = router.insert(&route, 3); - assert_eq!( - insert, - Err(InsertError::Conflict { - chain: DataChain { - authority: AuthorityId(None), - path: PathId(1), - method: MethodId(None), - } - }) - ); + let insert = router.insert("(/best)", 3); + assert_eq!(insert, Err(InsertError::Conflict)); insta::assert_snapshot!(router, @r" === Authority @@ -116,22 +63,10 @@ fn test_insert_conflict_expanded() -> Result<(), Box> { #[test] fn test_insert_conflict_multiple_expanded() -> Result<(), Box> { let mut router = Router::new(); + router.insert("(/hello)", 1)?; - let route = RouteBuilder::new().route("(/hello)").build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new().route("(/world)").build()?; - let insert = router.insert(&route, 2); - assert_eq!( - insert, - Err(InsertError::Conflict { - chain: DataChain { - authority: AuthorityId(None), - path: PathId(1), - method: MethodId(None), - } - }) - ); + let insert = router.insert("(/world)", 2); + assert_eq!(insert, Err(InsertError::Conflict)); insta::assert_snapshot!(router, @r" === Authority @@ -152,22 +87,10 @@ fn test_insert_conflict_multiple_expanded() -> Result<(), Box> { #[test] fn test_insert_conflict_end_wildcard() -> Result<(), Box> { let mut router = Router::new(); + router.insert("(/{*catch_all})", 1)?; - let route = RouteBuilder::new().route("(/{*catch_all})").build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new().route("/{*catch_all}").build()?; - let insert = router.insert(&route, 2); - assert_eq!( - insert, - Err(InsertError::Conflict { - chain: DataChain { - authority: AuthorityId(None), - path: PathId(1), - method: MethodId(None), - } - }) - ); + let insert = router.insert("/{*catch_all}", 2); + assert_eq!(insert, Err(InsertError::Conflict)); insta::assert_snapshot!(router, @r" === Authority @@ -185,23 +108,13 @@ fn test_insert_conflict_end_wildcard() -> Result<(), Box> { } #[test] -fn test_insert_overlapping() -> Result<(), Box> { +fn test_insert_conflict_overlapping() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/a(/b)", 1)?; + router.insert("/x/y", 2)?; - let route = RouteBuilder::new().route("/a(/b)").build()?; - router.insert(&route, 1)?; - - let route = RouteBuilder::new().route("/x/y").build()?; - router.insert(&route, 2)?; - - let route = RouteBuilder::new().route("(/a(/b))(/x/y)").build()?; - let insert = router.insert(&route, 3); - assert_eq!( - insert, - Err(InsertError::Path(PathInsertError::OverlappingRoutes { - ids: vec![PathId(1), PathId(2)] - })) - ); + let insert = router.insert("(/a(/b))(/x/y)", 3); + assert_eq!(insert, Err(InsertError::Conflict)); insta::assert_snapshot!(router, @r" === Authority @@ -225,41 +138,26 @@ fn test_insert_overlapping() -> Result<(), Box> { fn test_insert_duplicate_parameter() { let mut router = Router::new(); - let route = RouteBuilder::new() - .route("/{*id}/users/{id}") - .build() - .unwrap(); - let insert = router.insert(&route, 3); + let insert = router.insert("/{*id}/users/{id}", 3); assert_eq!( insert, - Err(InsertError::Path(PathInsertError::Template( - PathTemplateError::DuplicateParameter { - route: "/{*id}/users/{id}".to_owned(), - name: "id".to_owned(), - first: 1, - first_length: 5, - second: 13, - second_length: 4 - } - ))) + Err(InsertError::Template(TemplateError::DuplicateParameter { + route: "/{*id}/users/{id}".to_owned(), + name: "id".to_owned(), + first: 1, + first_length: 5, + second: 13, + second_length: 4 + })) ); - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - Empty - === Method - Empty - === Chains - Empty - "); + insta::assert_snapshot!(router, @""); } #[test] fn test_insert_constraint_conflict() { struct MyConstraint; - impl PathConstraint for MyConstraint { + impl Constraint for MyConstraint { const NAME: &'static str = "u32"; fn check(segment: &str) -> bool { segment.parse::().is_ok() @@ -267,10 +165,10 @@ fn test_insert_constraint_conflict() { } let mut router: Router<'_, usize> = Router::new(); - let constraint = router.path.constraint::(); + let constraint = router.constraint::(); assert_eq!( constraint, - Err(PathConstraintError::DuplicateName { + Err(ConstraintError::DuplicateName { name: "u32", existing_type: "u32", new_type: "insert::test_insert_constraint_conflict::MyConstraint" diff --git a/tests/method.rs b/tests/method.rs deleted file mode 100644 index 014bf440..00000000 --- a/tests/method.rs +++ /dev/null @@ -1,839 +0,0 @@ -use similar_asserts::assert_eq; -use smallvec::smallvec; -use std::error::Error; -use wayfind::{ - errors::{ - DeleteError, InsertError, MethodDeleteError, MethodInsertError, MethodSearchError, - SearchError, - }, - AuthorityMatch, Match, MethodMatch, PathMatch, RequestBuilder, RouteBuilder, Router, -}; - -#[test] -fn test_method_simple() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let request = RequestBuilder::new().path("/users").method("GET").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { - method: Some("GET") - } - }) - ); - - Ok(()) -} - -#[test] -fn test_method_not_allowed() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let request = RequestBuilder::new() - .path("/users") - .method("POST") - .build()?; - let search = router.search(&request); - assert_eq!( - search, - Err(SearchError::Method(MethodSearchError::NotAllowed)) - ); - - Ok(()) -} - -#[test] -fn test_method_multiple() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET", "POST"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ├─ GET [1] - ╰─ POST [1] - === Chains - *-1-1 - "); - - let request = RequestBuilder::new().path("/users").method("GET").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { - method: Some("GET") - } - }) - ); - - let request = RequestBuilder::new() - .path("/users") - .method("POST") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { - method: Some("POST") - } - }) - ); - - let request = RequestBuilder::new() - .path("/users") - .method("DELETE") - .build()?; - let search = router.search(&request); - assert_eq!( - search, - Err(SearchError::Method(MethodSearchError::NotAllowed)) - ); - - Ok(()) -} - -#[test] -fn test_method_empty() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec![]) - .build()?; - - let insert = router.insert(&route, 1); - assert_eq!(insert, Err(InsertError::Method(MethodInsertError::Empty))); - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - Empty - === Chains - Empty - "); - - Ok(()) -} - -#[test] -fn test_method_none() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - Empty - === Chains - *-1-* - "); - - let request = RequestBuilder::new().path("/users").method("GET").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - let request = RequestBuilder::new() - .path("/users") - .method("POST") - .build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} - -#[test] -fn test_method_same_path() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["PUT"]) - .build()?; - router.insert(&route, 2)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ├─ GET [1] - ╰─ PUT [2] - === Chains - *-1-1 - *-1-2 - "); - - let request = RequestBuilder::new().path("/users").method("GET").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { - method: Some("GET") - } - }) - ); - - let request = RequestBuilder::new().path("/users").method("PUT").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { - method: Some("PUT") - } - }) - ); - - Ok(()) -} - -#[test] -fn test_method_same_route_catch() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 2)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-* - *-1-1 - "); - - let request = RequestBuilder::new().path("/users").method("GET").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { - method: Some("GET") - } - }) - ); - - let request = RequestBuilder::new().path("/users").method("PUT").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} - -#[test] -fn test_method_same_route_catch_backwards() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 2)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - Empty - === Chains - *-1-* - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-* - *-1-1 - "); - - let request = RequestBuilder::new().path("/users").method("GET").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { - method: Some("GET") - } - }) - ); - - let request = RequestBuilder::new().path("/users").method("PUT").build()?; - let search = router.search(&request)?; - assert_eq!( - search, - Some(Match { - data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } - }) - ); - - Ok(()) -} - -#[test] -fn test_method_conflict_direct() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - let insert = router.insert(&route, 1); - assert_eq!( - insert, - Err(InsertError::Method(MethodInsertError::Conflict)) - ); - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - Ok(()) -} - -#[test] -fn test_method_conflict_list_inner() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET", "PUT"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ├─ GET [1] - ╰─ PUT [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["PUT"]) - .build()?; - let insert = router.insert(&route, 1); - assert_eq!( - insert, - Err(InsertError::Method(MethodInsertError::Conflict)) - ); - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ├─ GET [1] - ╰─ PUT [1] - === Chains - *-1-1 - "); - - Ok(()) -} - -#[test] -fn test_method_conflict_list_outer() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["PUT", "GET"]) - .build()?; - let search = router.insert(&route, 1); - assert_eq!( - search, - Err(InsertError::Method(MethodInsertError::Conflict)) - ); - - Ok(()) -} - -#[test] -fn test_method_delete() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.delete(&route)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - Empty - === Method - Empty - === Chains - Empty - "); - - Ok(()) -} - -#[test] -fn test_method_delete_list() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET", "POST"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ├─ GET [1] - ╰─ POST [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET", "POST"]) - .build()?; - router.delete(&route)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - Empty - === Method - Empty - === Chains - Empty - "); - - Ok(()) -} - -#[test] -fn test_method_delete_mismatch_list_inner() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET", "PUT"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ├─ GET [1] - ╰─ PUT [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["PUT"]) - .build()?; - let delete = router.delete(&route); - assert_eq!( - delete, - Err(DeleteError::Method(MethodDeleteError::Mismatch)) - ); - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ├─ GET [1] - ╰─ PUT [1] - === Chains - *-1-1 - "); - - Ok(()) -} - -#[test] -fn test_method_delete_mismatch_list_outer() -> Result<(), Box> { - let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["GET"]) - .build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - let route = RouteBuilder::new() - .route("/users") - .methods(vec!["PUT", "GET"]) - .build()?; - let delete = router.delete(&route); - assert_eq!( - delete, - Err(DeleteError::Method(MethodDeleteError::Mismatch)) - ); - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - [1] - ╰─ GET [1] - === Chains - *-1-1 - "); - - Ok(()) -} diff --git a/tests/optimize.rs b/tests/optimize.rs index 6d4d9458..d55b3695 100644 --- a/tests/optimize.rs +++ b/tests/optimize.rs @@ -1,64 +1,35 @@ use std::error::Error; -use wayfind::{RouteBuilder, Router}; + +use wayfind::Router; #[test] fn test_optimize_removal() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users/{id}").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/users/{id}/profile").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/users/{id}/settings").build()?; - router.insert(&route, 3)?; + router.insert("/users/{id}", 1)?; + router.insert("/users/{id}/profile", 2)?; + router.insert("/users/{id}/settings", 3)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ╰─ {id} [1] + ╰─ {id} [*] ╰─ / - ├─ settings [3] - ╰─ profile [2] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* + ├─ settings [*] + ╰─ profile [*] "); - let route = RouteBuilder::new().route("/users/{id}/profile").build()?; - router.delete(&route)?; + router.delete("/users/{id}/profile")?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ╰─ {id} [1] - ╰─ /settings [3] - === Method - Empty - === Chains - *-1-* - *-3-* + ╰─ {id} [*] + ╰─ /settings [*] "); - let route = RouteBuilder::new().route("/users/{id}/settings").build()?; - router.delete(&route)?; + router.delete("/users/{id}/settings")?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ╰─ {id} [1] - === Method - Empty - === Chains - *-1-* + ╰─ {id} [*] "); Ok(()) @@ -67,48 +38,26 @@ fn test_optimize_removal() -> Result<(), Box> { #[test] fn test_optimize_data() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users/{id}").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/users/{id}/profile").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/users/{id}/settings").build()?; - router.insert(&route, 3)?; + router.insert("/users/{id}", 1)?; + router.insert("/users/{id}/profile", 2)?; + router.insert("/users/{id}/settings", 3)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ╰─ {id} [1] + ╰─ {id} [*] ╰─ / - ├─ settings [3] - ╰─ profile [2] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* + ├─ settings [*] + ╰─ profile [*] "); - let route = RouteBuilder::new().route("/users/{id}").build()?; - router.delete(&route)?; + router.delete("/users/{id}")?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ ╰─ {id} ╰─ / - ├─ settings [3] - ╰─ profile [2] - === Method - Empty - === Chains - *-2-* - *-3-* + ├─ settings [*] + ╰─ profile [*] "); Ok(()) @@ -117,43 +66,21 @@ fn test_optimize_data() -> Result<(), Box> { #[test] fn test_optimize_compression() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/abc").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/a").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/ab").build()?; - router.insert(&route, 3)?; + router.insert("/abc", 1)?; + router.insert("/a", 2)?; + router.insert("/ab", 3)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /a [2] - ╰─ b [3] - ╰─ c [1] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* + /a [*] + ╰─ b [*] + ╰─ c [*] "); - let route = RouteBuilder::new().route("/ab").build()?; - router.delete(&route)?; + router.delete("/ab")?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /a [2] - ╰─ bc [1] - === Method - Empty - === Chains - *-1-* - *-2-* + /a [*] + ╰─ bc [*] "); Ok(()) diff --git a/tests/optional.rs b/tests/optional.rs index 734cea8a..5ff4c128 100644 --- a/tests/optional.rs +++ b/tests/optional.rs @@ -1,66 +1,40 @@ +use std::error::Error; + use similar_asserts::assert_eq; use smallvec::smallvec; -use std::error::Error; -use wayfind::{ - AuthorityMatch, Match, MethodMatch, PathMatch, RequestBuilder, RouteBuilder, Router, -}; +use wayfind::{Match, Router}; #[test] fn test_optional_starting() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("(/{lang})/users").build()?; - router.insert(&route, 1)?; + router.insert("(/{lang})/users", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / - ├─ users [1] + ├─ users [*] ╰─ {lang} - ╰─ /users [1] - === Method - Empty - === Chains - *-1-* + ╰─ /users [*] "); - let request = RequestBuilder::new().path("/en/users").build()?; - let search = router.search(&request)?; + let search = router.search("/en/users")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/{lang})/users", - expanded: Some("/{lang}/users"), - parameters: smallvec![("lang", "en")], - }, - method: MethodMatch { method: None } + route: "(/{lang})/users", + expanded: Some("/{lang}/users"), + parameters: smallvec![("lang", "en")], }) ); - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; + let search = router.search("/users")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/{lang})/users", - expanded: Some("/users"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/{lang})/users", + expanded: Some("/users"), + parameters: smallvec![], }) ); @@ -70,57 +44,32 @@ fn test_optional_starting() -> Result<(), Box> { #[test] fn test_optional_ending() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users(/)").build()?; - router.insert(&route, 1)?; + router.insert("/users(/)", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - ╰─ / [1] - === Method - Empty - === Chains - *-1-* + /users [*] + ╰─ / [*] "); - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; + let search = router.search("/users")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users(/)", - expanded: Some("/users"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users(/)", + expanded: Some("/users"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/users/").build()?; - let search = router.search(&request)?; + let search = router.search("/users/")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users(/)", - expanded: Some("/users/"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users(/)", + expanded: Some("/users/"), + parameters: smallvec![], }) ); @@ -130,97 +79,56 @@ fn test_optional_ending() -> Result<(), Box> { #[test] fn test_optional_nested() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("(/a(/b(/c)))").build()?; - router.insert(&route, 1)?; + router.insert("(/a(/b(/c)))", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - / [1] - ╰─ a [1] - ╰─ /b [1] - ╰─ /c [1] - === Method - Empty - === Chains - *-1-* + / [*] + ╰─ a [*] + ╰─ /b [*] + ╰─ /c [*] "); - let request = RequestBuilder::new().path("/a/b/c").build()?; - let search = router.search(&request)?; + let search = router.search("/a/b/c")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a(/b(/c)))", - expanded: Some("/a/b/c"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a(/b(/c)))", + expanded: Some("/a/b/c"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/a/b").build()?; - let search = router.search(&request)?; + let search = router.search("/a/b")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a(/b(/c)))", - expanded: Some("/a/b"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a(/b(/c)))", + expanded: Some("/a/b"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/a").build()?; - let search = router.search(&request)?; + let search = router.search("/a")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a(/b(/c)))", - expanded: Some("/a"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a(/b(/c)))", + expanded: Some("/a"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/").build()?; - let search = router.search(&request)?; + let search = router.search("/")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a(/b(/c)))", - expanded: Some("/"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a(/b(/c)))", + expanded: Some("/"), + parameters: smallvec![], }) ); @@ -230,57 +138,32 @@ fn test_optional_nested() -> Result<(), Box> { #[test] fn test_optional_only() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("(/test)").build()?; - router.insert(&route, 1)?; + router.insert("(/test)", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - / [1] - ╰─ test [1] - === Method - Empty - === Chains - *-1-* + / [*] + ╰─ test [*] "); - let request = RequestBuilder::new().path("/test").build()?; - let search = router.search(&request)?; + let search = router.search("/test")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/test)", - expanded: Some("/test"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/test)", + expanded: Some("/test"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/").build()?; - let search = router.search(&request)?; + let search = router.search("/")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/test)", - expanded: Some("/"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/test)", + expanded: Some("/"), + parameters: smallvec![], }) ); @@ -290,178 +173,105 @@ fn test_optional_only() -> Result<(), Box> { #[test] fn test_optional_touching() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("(/a)(/b)(/c)").build()?; - router.insert(&route, 1)?; + router.insert("(/a)(/b)(/c)", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - / [1] - ├─ a [1] + / [*] + ├─ a [*] │ ╰─ / - │ ├─ b [1] - │ │ ╰─ /c [1] - │ ╰─ c [1] - ├─ b [1] - │ ╰─ /c [1] - ╰─ c [1] - === Method - Empty - === Chains - *-1-* + │ ├─ b [*] + │ │ ╰─ /c [*] + │ ╰─ c [*] + ├─ b [*] + │ ╰─ /c [*] + ╰─ c [*] "); - let request = RequestBuilder::new().path("/a/b/c").build()?; - let search = router.search(&request)?; + let search = router.search("/a/b/c")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/a/b/c"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/a/b/c"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/a/b").build()?; - let search = router.search(&request)?; + let search = router.search("/a/b")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/a/b"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/a/b"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/a/c").build()?; - let search = router.search(&request)?; + let search = router.search("/a/c")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/a/c"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/a/c"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/a").build()?; - let search = router.search(&request)?; + let search = router.search("/a")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/a"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/a"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/b/c").build()?; - let search = router.search(&request)?; + let search = router.search("/b/c")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/b/c"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/b/c"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/b").build()?; - let search = router.search(&request)?; + let search = router.search("/b")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/b"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/b"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/c").build()?; - let search = router.search(&request)?; + let search = router.search("/c")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/c"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/c"), + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/").build()?; - let search = router.search(&request)?; + let search = router.search("/")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "(/a)(/b)(/c)", - expanded: Some("/"), - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "(/a)(/b)(/c)", + expanded: Some("/"), + parameters: smallvec![], }) ); diff --git a/tests/static.rs b/tests/static.rs index 474e25e7..3e2d1632 100644 --- a/tests/static.rs +++ b/tests/static.rs @@ -1,49 +1,28 @@ +use std::error::Error; + use similar_asserts::assert_eq; use smallvec::smallvec; -use std::error::Error; -use wayfind::{ - AuthorityMatch, Match, MethodMatch, PathMatch, RequestBuilder, RouteBuilder, Router, -}; +use wayfind::{Match, Router}; #[test] fn test_static_simple() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/users", 1)?; - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users [1] - === Method - Empty - === Chains - *-1-* - "); + insta::assert_snapshot!(router, @"/users [*]"); - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; + let search = router.search("/users")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/user").build()?; - let search = router.search(&request)?; + let search = router.search("/user")?; assert_eq!(search, None); Ok(()) @@ -52,69 +31,40 @@ fn test_static_simple() -> Result<(), Box> { #[test] fn test_static_overlapping() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/user").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 2)?; + router.insert("/user", 1)?; + router.insert("/users", 2)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /user [1] - ╰─ s [2] - === Method - Empty - === Chains - *-1-* - *-2-* + /user [*] + ╰─ s [*] "); - let request = RequestBuilder::new().path("/user").build()?; - let search = router.search(&request)?; + let search = router.search("/user")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/user", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/user", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; + let search = router.search("/users")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/use").build()?; - let search = router.search(&request)?; + let search = router.search("/use")?; assert_eq!(search, None); - let request = RequestBuilder::new().path("/userss").build()?; - let search = router.search(&request)?; + let search = router.search("/userss")?; assert_eq!(search, None); Ok(()) @@ -123,70 +73,41 @@ fn test_static_overlapping() -> Result<(), Box> { #[test] fn test_static_overlapping_slash() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/user_1").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/user/1").build()?; - router.insert(&route, 2)?; + router.insert("/user_1", 1)?; + router.insert("/user/1", 2)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /user - ├─ /1 [2] - ╰─ _1 [1] - === Method - Empty - === Chains - *-1-* - *-2-* + ├─ /1 [*] + ╰─ _1 [*] "); - let request = RequestBuilder::new().path("/user_1").build()?; - let search = router.search(&request)?; + let search = router.search("/user_1")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/user_1", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/user_1", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/user/1").build()?; - let search = router.search(&request)?; + let search = router.search("/user/1")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/user/1", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/user/1", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/user").build()?; - let search = router.search(&request)?; + let search = router.search("/user")?; assert_eq!(search, None); - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; + let search = router.search("/users")?; assert_eq!(search, None); Ok(()) @@ -196,97 +117,59 @@ fn test_static_overlapping_slash() -> Result<(), Box> { fn test_static_split_multibyte() -> Result<(), Box> { let mut router = Router::new(); - let route = RouteBuilder::new().route("/👨‍👩‍👧").build()?; // Family: Man, Woman, Girl - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/👨‍👩‍👦").build()?; // Family: Man, Woman, Boy - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/👩‍👩‍👧").build()?; // Family: Woman, Woman, Girl - router.insert(&route, 3)?; - let route = RouteBuilder::new().route("/👩‍👩‍👦").build()?; // Family: Woman, Woman, Boy - router.insert(&route, 4)?; - let route = RouteBuilder::new().route("/👨‍👨‍👧").build()?; // Family: Man, Man, Girl - router.insert(&route, 5)?; - let route = RouteBuilder::new().route("/👨‍👨‍👦").build()?; // Family: Man, Man, Boy - router.insert(&route, 6)?; + router.insert("/👨‍👩‍👧", 1)?; // Family: Man, Woman, Girl + router.insert("/👨‍👩‍👦", 2)?; // Family: Man, Woman, Boy + router.insert("/👩‍👩‍👧", 3)?; // Family: Woman, Woman, Girl + router.insert("/👩‍👩‍👦", 4)?; // Family: Woman, Woman, Boy + router.insert("/👨‍👨‍👧", 5)?; // Family: Man, Man, Girl + router.insert("/👨‍👨‍👦", 6)?; // Family: Man, Man, Boy insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /� ├─ �‍👩‍� - │ ├─ � [4] - │ ╰─ � [3] + │ ├─ � [*] + │ ╰─ � [*] ╰─ �‍� ├─ �‍� - │ ├─ � [6] - │ ╰─ � [5] + │ ├─ � [*] + │ ╰─ � [*] ╰─ �‍� - ├─ � [2] - ╰─ � [1] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* - *-4-* - *-5-* - *-6-* + ├─ � [*] + ╰─ � [*] "); - let request = RequestBuilder::new().path("/👨‍👩‍👧").build()?; // Family: Man, Woman, Girl - let search = router.search(&request)?; + let search = router.search("/👨‍👩‍👧")?; // Family: Man, Woman, Girl assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/👨‍👩‍👧", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/👨‍👩‍👧", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/👨‍👩‍👦").build()?; // Family: Man, Woman, Boy - let search = router.search(&request)?; + let search = router.search("/👨‍👩‍👦")?; // Family: Man, Woman, Boy assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/👨‍👩‍👦", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/👨‍👩‍👦", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/👨").build()?; // Man - let search = router.search(&request)?; + let search = router.search("/👨")?; // Man assert_eq!(search, None); - let request = RequestBuilder::new().path("/👨‍👨").build()?; // Man Woman - let search = router.search(&request)?; + let search = router.search("/👨‍👨")?; // Man Woman assert_eq!(search, None); - let request = RequestBuilder::new().path("/👨👩👧").build()?; // Man, Woman, Girl - let search = router.search(&request)?; + let search = router.search("/👨👩👧")?; // Man, Woman, Girl assert_eq!(search, None); - let request = RequestBuilder::new().path("/👨‍👨‍👧‍👦").build()?; // Family: Man, Woman, Girl, Boy - let search = router.search(&request)?; + let search = router.search("/👨‍👨‍👧‍👦")?; // Family: Man, Woman, Girl, Boy assert_eq!(search, None); Ok(()) @@ -295,61 +178,34 @@ fn test_static_split_multibyte() -> Result<(), Box> { #[test] fn test_static_case_sensitive() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/Users").build()?; - router.insert(&route, 2)?; + router.insert("/users", 1)?; + router.insert("/Users", 2)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / - ├─ Users [2] - ╰─ users [1] - === Method - Empty - === Chains - *-1-* - *-2-* + ├─ Users [*] + ╰─ users [*] "); - let request = RequestBuilder::new().path("/users").build()?; - let search = router.search(&request)?; + let search = router.search("/users")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/Users").build()?; - let search = router.search(&request)?; + let search = router.search("/Users")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/Users", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/Users", + expanded: None, + parameters: smallvec![], }) ); @@ -359,42 +215,22 @@ fn test_static_case_sensitive() -> Result<(), Box> { #[test] fn test_static_whitespace() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/users /items", 1)?; - let route = RouteBuilder::new().route("/users /items").build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users /items [1] - === Method - Empty - === Chains - *-1-* - "); + insta::assert_snapshot!(router, @"/users /items [*]"); - let request = RequestBuilder::new().path("/users /items").build()?; - let search = router.search(&request)?; + let search = router.search("/users /items")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users /items", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users /items", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/users/items").build()?; - let search = router.search(&request)?; + let search = router.search("/users/items")?; assert_eq!(search, None); Ok(()) @@ -403,61 +239,34 @@ fn test_static_whitespace() -> Result<(), Box> { #[test] fn test_static_duplicate_slashes() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/users/items").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/users//items").build()?; - router.insert(&route, 2)?; + router.insert("/users/items", 1)?; + router.insert("/users//items", 2)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path /users/ - ├─ /items [2] - ╰─ items [1] - === Method - Empty - === Chains - *-1-* - *-2-* + ├─ /items [*] + ╰─ items [*] "); - let request = RequestBuilder::new().path("/users/items").build()?; - let search = router.search(&request)?; + let search = router.search("/users/items")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users/items", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users/items", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/users//items").build()?; - let search = router.search(&request)?; + let search = router.search("/users//items")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users//items", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users//items", + expanded: None, + parameters: smallvec![], }) ); @@ -467,50 +276,28 @@ fn test_static_duplicate_slashes() -> Result<(), Box> { #[test] fn test_static_empty_segments() -> Result<(), Box> { let mut router = Router::new(); + router.insert("/users///items", 1)?; - let route = RouteBuilder::new().route("/users///items").build()?; - router.insert(&route, 1)?; - - insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path - /users///items [1] - === Method - Empty - === Chains - *-1-* - "); + insta::assert_snapshot!(router, @"/users///items [*]"); - let request = RequestBuilder::new().path("/users///items").build()?; - let search = router.search(&request)?; + let search = router.search("/users///items")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/users///items", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/users///items", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new().path("/users/items").build()?; - let search = router.search(&request)?; + let search = router.search("/users/items")?; assert_eq!(search, None); - let request = RequestBuilder::new().path("/users//items").build()?; - let search = router.search(&request)?; + let search = router.search("/users//items")?; assert_eq!(search, None); - let request = RequestBuilder::new().path("/users////items").build()?; - let search = router.search(&request)?; + let search = router.search("/users////items")?; assert_eq!(search, None); Ok(()) diff --git a/tests/wildcard.rs b/tests/wildcard.rs index 60877d0c..7519a70c 100644 --- a/tests/wildcard.rs +++ b/tests/wildcard.rs @@ -1,72 +1,43 @@ +use std::error::Error; + use similar_asserts::assert_eq; use smallvec::smallvec; -use std::error::Error; -use wayfind::{ - AuthorityMatch, Match, MethodMatch, PathMatch, RequestBuilder, RouteBuilder, Router, -}; +use wayfind::{Match, Router}; #[test] fn test_wildcard_simple() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{*path}/delete").build()?; - router.insert(&route, 1)?; + router.insert("/{*path}/delete", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ╰─ {*path} - ╰─ /delete [1] - === Method - Empty - === Chains - *-1-* + ╰─ /delete [*] "); - let request = RequestBuilder::new().path("/docs/delete").build()?; - let search = router.search(&request)?; + let search = router.search("/docs/delete")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*path}/delete", - expanded: None, - parameters: smallvec![("path", "docs")], - }, - method: MethodMatch { method: None } + route: "/{*path}/delete", + expanded: None, + parameters: smallvec![("path", "docs")], }) ); - let request = RequestBuilder::new() - .path("/nested/docs/folder/delete") - .build()?; - let search = router.search(&request)?; + let search = router.search("/nested/docs/folder/delete")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*path}/delete", - expanded: None, - parameters: smallvec![("path", "nested/docs/folder")], - }, - method: MethodMatch { method: None } + route: "/{*path}/delete", + expanded: None, + parameters: smallvec![("path", "nested/docs/folder")], }) ); - let request = RequestBuilder::new().path("/delete").build()?; - let search = router.search(&request)?; + let search = router.search("/delete")?; assert_eq!(search, None); Ok(()) @@ -75,64 +46,35 @@ fn test_wildcard_simple() -> Result<(), Box> { #[test] fn test_wildcard_multiple() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new() - .route("/{*prefix}/static/{*suffix}/file") - .build()?; - router.insert(&route, 1)?; + router.insert("/{*prefix}/static/{*suffix}/file", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ╰─ {*prefix} ╰─ /static/ ╰─ {*suffix} - ╰─ /file [1] - === Method - Empty - === Chains - *-1-* + ╰─ /file [*] "); - let request = RequestBuilder::new().path("/a/static/b/file").build()?; - let search = router.search(&request)?; + let search = router.search("/a/static/b/file")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*prefix}/static/{*suffix}/file", - expanded: None, - parameters: smallvec![("prefix", "a"), ("suffix", "b")], - }, - method: MethodMatch { method: None } + route: "/{*prefix}/static/{*suffix}/file", + expanded: None, + parameters: smallvec![("prefix", "a"), ("suffix", "b")], }) ); - let request = RequestBuilder::new() - .path("/a/b/c/static/d/e/f/file") - .build()?; - let search = router.search(&request)?; + let search = router.search("/a/b/c/static/d/e/f/file")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*prefix}/static/{*suffix}/file", - expanded: None, - parameters: smallvec![("prefix", "a/b/c"), ("suffix", "d/e/f")], - }, - method: MethodMatch { method: None } + route: "/{*prefix}/static/{*suffix}/file", + expanded: None, + parameters: smallvec![("prefix", "a/b/c"), ("suffix", "d/e/f")], }) ); @@ -142,63 +84,37 @@ fn test_wildcard_multiple() -> Result<(), Box> { #[test] fn test_wildcard_inline() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{*path}.html").build()?; - router.insert(&route, 1)?; + router.insert("/{*path}.html", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ╰─ {*path} - ╰─ .html [1] - === Method - Empty - === Chains - *-1-* + ╰─ .html [*] "); - let request = RequestBuilder::new().path("/page.html").build()?; - let search = router.search(&request)?; + let search = router.search("/page.html")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*path}.html", - expanded: None, - parameters: smallvec![("path", "page")], - }, - method: MethodMatch { method: None } + route: "/{*path}.html", + expanded: None, + parameters: smallvec![("path", "page")], }) ); - let request = RequestBuilder::new().path("/nested/page.html").build()?; - let search = router.search(&request)?; + let search = router.search("/nested/page.html")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*path}.html", - expanded: None, - parameters: smallvec![("path", "nested/page")], - }, - method: MethodMatch { method: None } + route: "/{*path}.html", + expanded: None, + parameters: smallvec![("path", "nested/page")], }) ); - let request = RequestBuilder::new().path("/.html").build()?; - let search = router.search(&request)?; + let search = router.search("/.html")?; assert_eq!(search, None); Ok(()) @@ -207,64 +123,37 @@ fn test_wildcard_inline() -> Result<(), Box> { #[test] fn test_wildcard_greedy() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{*first}-{*second}").build()?; - router.insert(&route, 1)?; + router.insert("/{*first}-{*second}", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ╰─ {*first} ╰─ - - ╰─ {*second} [1] - === Method - Empty - === Chains - *-1-* + ╰─ {*second} [*] "); - let request = RequestBuilder::new().path("/a-b-c").build()?; - let search = router.search(&request)?; + let search = router.search("/a-b-c")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*first}-{*second}", - expanded: None, - parameters: smallvec![("first", "a-b"), ("second", "c")], - }, - method: MethodMatch { method: None } + route: "/{*first}-{*second}", + expanded: None, + parameters: smallvec![("first", "a-b"), ("second", "c")], }) ); - let request = RequestBuilder::new() - .path("/path/to/some-file/with-multiple-hyphens") - .build()?; - let search = router.search(&request)?; + let search = router.search("/path/to/some-file/with-multiple-hyphens")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*first}-{*second}", - expanded: None, - parameters: smallvec![ - ("first", "path/to/some-file/with-multiple"), - ("second", "hyphens") - ], - }, - method: MethodMatch { method: None } + route: "/{*first}-{*second}", + expanded: None, + parameters: smallvec![ + ("first", "path/to/some-file/with-multiple"), + ("second", "hyphens") + ], }) ); @@ -274,58 +163,33 @@ fn test_wildcard_greedy() -> Result<(), Box> { #[test] fn test_wildcard_empty_segments() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/{*path}/end").build()?; - router.insert(&route, 1)?; + router.insert("/{*path}/end", 1)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ╰─ {*path} - ╰─ /end [1] - === Method - Empty - === Chains - *-1-* + ╰─ /end [*] "); - let request = RequestBuilder::new().path("/start/middle/end").build()?; - let search = router.search(&request)?; + let search = router.search("/start/middle/end")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*path}/end", - expanded: None, - parameters: smallvec![("path", "start/middle")], - }, - method: MethodMatch { method: None } + route: "/{*path}/end", + expanded: None, + parameters: smallvec![("path", "start/middle")], }) ); - let request = RequestBuilder::new().path("/start//middle///end").build()?; - let search = router.search(&request)?; + let search = router.search("/start//middle///end")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*path}/end", - expanded: None, - parameters: smallvec![("path", "start//middle//")], - }, - method: MethodMatch { method: None } + route: "/{*path}/end", + expanded: None, + parameters: smallvec![("path", "start//middle//")], }) ); @@ -335,142 +199,77 @@ fn test_wildcard_empty_segments() -> Result<(), Box> { #[test] fn test_wildcard_priority() -> Result<(), Box> { let mut router = Router::new(); - - let route = RouteBuilder::new().route("/static/path").build()?; - router.insert(&route, 1)?; - let route = RouteBuilder::new().route("/static/{*rest}").build()?; - router.insert(&route, 2)?; - let route = RouteBuilder::new().route("/{*path}/static").build()?; - router.insert(&route, 3)?; - let route = RouteBuilder::new().route("/prefix.{*suffix}").build()?; - router.insert(&route, 4)?; - let route = RouteBuilder::new().route("/{*prefix}.suffix").build()?; - router.insert(&route, 5)?; + router.insert("/static/path", 1)?; + router.insert("/static/{*rest}", 2)?; + router.insert("/{*path}/static", 3)?; + router.insert("/prefix.{*suffix}", 4)?; + router.insert("/{*prefix}.suffix", 5)?; insta::assert_snapshot!(router, @r" - === Authority - Empty - === Path / ├─ prefix. - │ ╰─ {*suffix} [4] + │ ╰─ {*suffix} [*] ├─ static/ - │ ├─ path [1] - │ ╰─ {*rest} [2] + │ ├─ path [*] + │ ╰─ {*rest} [*] ├─ {*prefix} - │ ╰─ .suffix [5] + │ ╰─ .suffix [*] ╰─ {*path} - ╰─ /static [3] - === Method - Empty - === Chains - *-1-* - *-2-* - *-3-* - *-4-* - *-5-* + ╰─ /static [*] "); - let request = RequestBuilder::new().path("/static/path").build()?; - let search = router.search(&request)?; + let search = router.search("/static/path")?; assert_eq!( search, Some(Match { data: &1, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/static/path", - expanded: None, - parameters: smallvec![], - }, - method: MethodMatch { method: None } + route: "/static/path", + expanded: None, + parameters: smallvec![], }) ); - let request = RequestBuilder::new() - .path("/static/some/nested/path") - .build()?; - let search = router.search(&request)?; + let search = router.search("/static/some/nested/path")?; assert_eq!( search, Some(Match { data: &2, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/static/{*rest}", - expanded: None, - parameters: smallvec![("rest", "some/nested/path")], - }, - method: MethodMatch { method: None } + route: "/static/{*rest}", + expanded: None, + parameters: smallvec![("rest", "some/nested/path")], }) ); - let request = RequestBuilder::new() - .path("/some/nested/path/static") - .build()?; - let search = router.search(&request)?; + let search = router.search("/some/nested/path/static")?; assert_eq!( search, Some(Match { data: &3, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*path}/static", - expanded: None, - parameters: smallvec![("path", "some/nested/path")], - }, - method: MethodMatch { method: None } + route: "/{*path}/static", + expanded: None, + parameters: smallvec![("path", "some/nested/path")], }) ); - let request = RequestBuilder::new() - .path("/prefix.some/nested/path") - .build()?; - let search = router.search(&request)?; + let search = router.search("/prefix.some/nested/path")?; assert_eq!( search, Some(Match { data: &4, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/prefix.{*suffix}", - expanded: None, - parameters: smallvec![("suffix", "some/nested/path")], - }, - method: MethodMatch { method: None } + route: "/prefix.{*suffix}", + expanded: None, + parameters: smallvec![("suffix", "some/nested/path")], }) ); - let request = RequestBuilder::new() - .path("/some/nested/path.suffix") - .build()?; - let search = router.search(&request)?; + let search = router.search("/some/nested/path.suffix")?; assert_eq!( search, Some(Match { data: &5, - authority: AuthorityMatch { - authority: None, - parameters: smallvec![] - }, - path: PathMatch { - route: "/{*prefix}.suffix", - expanded: None, - parameters: smallvec![("prefix", "some/nested/path")], - }, - method: MethodMatch { method: None } + route: "/{*prefix}.suffix", + expanded: None, + parameters: smallvec![("prefix", "some/nested/path")], }) );