diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6497471 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz +*.swp + +pids +logs +results +tmp + +# Coverage reports +coverage + +# API keys and secrets +.env + +# Dependency directory +node_modules +bower_components + +# Editors +.idea +*.iml + +# OS metadata +.DS_Store +Thumbs.db + +# Ignore built ts files +dist/ + +__pycache__/ + +/.yalc +yalc.lock + +# ignore Rust compiler files +/backend-rs/target diff --git a/README.md b/README.md index 0242c86..e9a36e3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fantastic -![plugin_demo](./extras/ui.png) +![plugin_demo](./assets/ui.png) Steam Deck fan controls. diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..48c4851 Binary files /dev/null and b/assets/logo.png differ diff --git a/assets/ui.png b/assets/ui.png new file mode 100644 index 0000000..4c70aba Binary files /dev/null and b/assets/ui.png differ diff --git a/backend-rs/Cargo.lock b/backend-rs/Cargo.lock new file mode 100644 index 0000000..6cee412 --- /dev/null +++ b/backend-rs/Cargo.lock @@ -0,0 +1,1107 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "buf_redux" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" +dependencies = [ + "memchr", + "safemem", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer 0.10.2", + "crypto-common", +] + +[[package]] +name = "fantastic-rs" +version = "0.3.0" +dependencies = [ + "log", + "serde", + "serde_json", + "simplelog", + "usdpl-back", +] + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.3", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "headers" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cff78e5788be1e0ab65b04d306b2ed5092c815ec97ec70f4ebd5aee158aa55d" +dependencies = [ + "base64", + "bitflags", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha-1 0.10.0", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "libc" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mio" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "multipart" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" +dependencies = [ + "buf_redux", + "httparse", + "log", + "mime", + "mime_guess", + "quick-error", + "rand", + "safemem", + "tempfile", + "twoway", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "once_cell" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.3", +] + +[[package]] +name = "simplelog" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48dfff04aade74dd495b007c831cd6f4e0cee19c344dd9dc0884c0289b70a786" +dependencies = [ + "log", + "termcolor", + "time", +] + +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +dependencies = [ + "itoa", + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "pin-project-lite", + "socket2", + "winapi", +] + +[[package]] +name = "tokio-stream" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511de3f85caf1c98983545490c3d09685fa8eb634e57eec22bb4db271f46cbd8" +dependencies = [ + "futures-util", + "log", + "pin-project", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7709595b8878a4965ce5e87ebf880a7d39c9afc6837721b21a5a816a8117d921" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tungstenite" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b2d8558abd2e276b0a8df5c05a2ec762609344191e5fd23e292c910e9165b5" +dependencies = [ + "base64", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "rand", + "sha-1 0.9.8", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "twoway" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" +dependencies = [ + "memchr", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "usdpl-back" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e504c8c884d63ae224ebdbcc506112a7a24250a2fbb329f742d443d5fecda7" +dependencies = [ + "bytes", + "tokio", + "usdpl-core", + "warp", +] + +[[package]] +name = "usdpl-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd726b9f0121d4449082e3ce73586dea0a0448494031833b7b173e4476f0ea5" +dependencies = [ + "base64", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "warp" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cef4e1e9114a4b7f1ac799f16ce71c14de5778500c5450ec6b7b920c55b587e" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "headers", + "http", + "hyper", + "log", + "mime", + "mime_guess", + "multipart", + "percent-encoding", + "pin-project", + "scoped-tls", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tokio-util 0.6.10", + "tower-service", + "tracing", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" diff --git a/backend-rs/Cargo.toml b/backend-rs/Cargo.toml new file mode 100644 index 0000000..8a004c6 --- /dev/null +++ b/backend-rs/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "fantastic-rs" +version = "0.3.0" +edition = "2021" + +[dependencies] +usdpl-back = { version = "0.5.2", features = ["blocking"]}#, path = "../usdpl/usdpl-back"} +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" + +# logging +log = "0.4" +simplelog = "0.12" + +[profile.release] +debug = false +strip = true +lto = true +codegen-units = 4 diff --git a/backend-rs/Cross.toml b/backend-rs/Cross.toml new file mode 100644 index 0000000..3456834 --- /dev/null +++ b/backend-rs/Cross.toml @@ -0,0 +1,6 @@ +[build] +#xargo = true +default-target = "x86_64-unknown-linux-gnu" + +[build.env] +volumes = ["/home/ngnius/Documents/git-repos",] diff --git a/backend-rs/build.sh b/backend-rs/build.sh new file mode 100755 index 0000000..b7838e5 --- /dev/null +++ b/backend-rs/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cross build --release +cp ./target/release/fantastic-rs ../backend diff --git a/backend-rs/src/api.rs b/backend-rs/src/api.rs new file mode 100644 index 0000000..9ae5953 --- /dev/null +++ b/backend-rs/src/api.rs @@ -0,0 +1,259 @@ +use usdpl_back::core::serdes::Primitive; + +use super::control::ControlRuntime; +use super::json::GraphPointJson; + +pub const VERSION: &'static str = env!("CARGO_PKG_VERSION"); +pub const NAME: &'static str = env!("CARGO_PKG_NAME"); + +pub fn hello(params: Vec) -> Vec { + if let Some(Primitive::String(name)) = params.get(0) { + vec![Primitive::String(format!("Hello {}", name))] + } else { + vec![] + } +} + +pub fn echo(params: Vec) -> Vec { + params +} + +pub fn version(_: Vec) -> Vec { + vec![VERSION.into()] +} + +pub fn name(_: Vec) -> Vec { + vec![NAME.into()] +} + +pub fn get_fan_rpm(_: Vec) -> Vec { + if let Some(rpm) = crate::sys::read_fan() { + log::debug!("get_fan_rpm() success: {}", rpm); + vec![rpm.into()] + } else { + log::error!("get_fan_rpm failed to read fan speed"); + Vec::new() + } +} + +pub fn get_temperature(_: Vec) -> Vec { + if let Some(temperature) = crate::sys::read_thermal_zone(0) { + let real_temp = temperature as f64 / 1000.0; + log::debug!("get_temperature() success: {}", real_temp); + vec![real_temp.into()] + } else { + log::error!("get_fan_rpm failed to read fan speed"); + Vec::new() + } +} + +pub fn set_enable_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { + let runtime_settings = runtime.settings_clone(); + let runtime_state = runtime.state_clone(); + move |params| { + if let Some(Primitive::Bool(enabled)) = params.get(0) { + let mut settings = match runtime_settings.write() { + Ok(x) => x, + Err(e) => { + log::error!("set_enable failed to acquire settings write lock: {}", e); + return vec![]; + } + }; + if settings.enable != *enabled { + settings.enable = *enabled; + let mut state = match runtime_state.write() { + Ok(x) => x, + Err(e) => { + log::error!("set_enable failed to acquire state write lock: {}", e); + return vec![]; + } + }; + state.dirty = true; + log::debug!("set_enable({}) success", enabled); + } + vec![(*enabled).into()] + } else { + Vec::new() + } + } +} + +pub fn get_enable_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { + let runtime_settings = runtime.settings_clone(); + move |_| { + let lock = match runtime_settings.read() { + Ok(x) => x, + Err(e) => { + log::error!("get_enable failed to acquire settings read lock: {}", e); + return vec![]; + } + }; + log::debug!("get_enable() success"); + vec![lock.enable.into()] + } +} + +pub fn set_interpolate_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { + let runtime_settings = runtime.settings_clone(); + let runtime_state = runtime.state_clone(); + move |params| { + if let Some(Primitive::Bool(enabled)) = params.get(0) { + let mut settings = match runtime_settings.write() { + Ok(x) => x, + Err(e) => { + log::error!("set_enable failed to acquire settings write lock: {}", e); + return vec![]; + } + }; + if settings.interpolate != *enabled { + settings.interpolate = *enabled; + let mut state = match runtime_state.write() { + Ok(x) => x, + Err(e) => { + log::error!("set_interpolate failed to acquire state write lock: {}", e); + return vec![]; + } + }; + state.dirty = true; + log::debug!("set_interpolate({}) success", enabled); + } + vec![(*enabled).into()] + } else { + Vec::new() + } + } +} + +pub fn get_interpolate_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { + let runtime_settings = runtime.settings_clone(); + move |_| { + let lock = match runtime_settings.read() { + Ok(x) => x, + Err(e) => { + log::error!("get_interpolate failed to acquire settings read lock: {}", e); + return vec![]; + } + }; + log::debug!("get_interpolate() success"); + vec![lock.interpolate.into()] + } +} + +fn curve_to_json(curve: &Vec) -> serde_json::Result { + let mut curve_points = Vec::::with_capacity(curve.len()); + for point in curve.iter() { + curve_points.push(point.clone().into()); + } + serde_json::to_string(&curve_points) +} + +pub fn get_curve_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { + let runtime_settings = runtime.settings_clone(); + move |_| { + let lock = match runtime_settings.read() { + Ok(x) => x, + Err(e) => { + log::error!("get_curve failed to acquire settings read lock: {}", e); + return vec![]; + } + }; + let json_str = match curve_to_json(&lock.curve) { + Ok(x) => x, + Err(e) => { + log::error!("get_curve failed to serialize points: {}", e); + return vec![]; + } + }; + log::debug!("get_curve() success"); + vec![Primitive::Json(json_str)] + } +} + +pub fn add_curve_point_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { + let runtime_settings = runtime.settings_clone(); + let runtime_state = runtime.state_clone(); + move |params| { + if let Some(Primitive::Json(json_str)) = params.get(0) { + let mut settings = match runtime_settings.write() { + Ok(x) => x, + Err(e) => { + log::error!("add_curve_point failed to acquire settings write lock: {}", e); + return vec![]; + } + }; + let new_point: GraphPointJson = match serde_json::from_str(&json_str) { + Ok(x) => x, + Err(e) => { + log::error!("add_curve_point failed deserialize point json: {}", e); + return vec![]; + } + }; + let version = settings.version; + settings.curve.push(super::datastructs::GraphPoint::from_json(new_point, version)); + settings.sort_curve(); + let mut state = match runtime_state.write() { + Ok(x) => x, + Err(e) => { + log::error!("add_curve_point failed to acquire state write lock: {}", e); + return vec![]; + } + }; + state.dirty = true; + let json_str = match curve_to_json(&settings.curve) { + Ok(x) => x, + Err(e) => { + log::error!("add_curve_point failed to serialize points: {}", e); + return vec![]; + } + }; + log::debug!("add_curve_point({}) success", json_str); + vec![Primitive::Json(json_str)] + } else { + Vec::new() + } + } +} + +pub fn remove_curve_point_gen(runtime: &ControlRuntime) -> impl Fn(Vec) -> Vec { + let runtime_settings = runtime.settings_clone(); + let runtime_state = runtime.state_clone(); + move |params| { + if let Some(Primitive::F64(index)) = params.get(0) { + let mut settings = match runtime_settings.write() { + Ok(x) => x, + Err(e) => { + log::error!("remove_curve_point failed to acquire settings write lock: {}", e); + return vec![]; + } + }; + let rounded = index.round(); + if rounded >= 0.0 && rounded < settings.curve.len() as _ { + let index = rounded as usize; + settings.curve.swap_remove(index); + settings.sort_curve(); + let mut state = match runtime_state.write() { + Ok(x) => x, + Err(e) => { + log::error!("remove_curve_point failed to acquire state write lock: {}", e); + return vec![]; + } + }; + state.dirty = true; + let json_str = match curve_to_json(&settings.curve) { + Ok(x) => x, + Err(e) => { + log::error!("remove_curve_point failed to serialize points: {}", e); + return vec![]; + } + }; + log::debug!("remove_curve_point({}) success", json_str); + vec![Primitive::Json(json_str)] + } else { + log::error!("remove_curve_point received index out of bounds: {} indexing array of length {}", index, settings.curve.len()); + return vec![]; + } + } else { + Vec::new() + } + } +} diff --git a/backend-rs/src/control.rs b/backend-rs/src/control.rs new file mode 100644 index 0000000..7cfda0c --- /dev/null +++ b/backend-rs/src/control.rs @@ -0,0 +1,217 @@ +//! Fan control + +use std::sync::{RwLock, Arc}; + +use std::thread; +use std::time::{Duration, Instant}; + +use super::datastructs::{Settings, State, GraphPoint}; +use super::json::SettingsJson; + +pub struct ControlRuntime { + settings: Arc>, + state: Arc>, +} + +impl ControlRuntime { + pub fn new() -> Self { + let new_state = State::new(); + let settings_p = settings_path(&new_state.home); + Self { + settings: Arc::new(RwLock::new(super::json::SettingsJson::open(settings_p).unwrap_or_default().into())), + state: Arc::new(RwLock::new(new_state)), + } + } + + pub(crate) fn settings_clone(&self) -> Arc> { + self.settings.clone() + } + + pub(crate) fn state_clone(&self) -> Arc> { + self.state.clone() + } + + pub fn run(&self) -> thread::JoinHandle<()> { + let runtime_settings = self.settings_clone(); + let runtime_state = self.state_clone(); + thread::spawn(move || { + let sleep_duration = Duration::from_millis(1000); + let mut start_time = Instant::now(); + loop { + if Instant::now().duration_since(start_time).as_secs_f64() * 0.95 > sleep_duration.as_secs_f64() { + // resumed from sleep; do fan re-init + log::debug!("Detected resume from sleep, overriding fan again"); + { + let state = match runtime_state.read() { + Ok(x) => x, + Err(e) => { + log::error!("runtime failed to acquire state read lock: {}", e); + continue; + } + }; + let settings = match runtime_settings.read() { + Ok(x) => x, + Err(e) => { + log::error!("runtime failed to acquire settings read lock: {}", e); + continue; + } + }; + Self::on_set_enable(&settings, &state); + } + } + start_time = Instant::now(); + { // save to file + let state = match runtime_state.read() { + Ok(x) => x, + Err(e) => { + log::error!("runtime failed to acquire state read lock: {}", e); + continue; + } + }; + if state.dirty { + // save settings to file + let settings = match runtime_settings.read() { + Ok(x) => x, + Err(e) => { + log::error!("runtime failed to acquire settings read lock: {}", e); + continue; + } + }; + let settings_json: SettingsJson = settings.clone().into(); + if let Err(e) = settings_json.save(settings_path(&state.home)) { + log::error!("SettingsJson.save({}) error: {}", settings_path(&state.home).display(), e); + } + Self::on_set_enable(&settings, &state); + } + } + { // fan control + let settings = match runtime_settings.read() { + Ok(x) => x, + Err(e) => { + log::error!("runtime failed to acquire settings read lock: {}", e); + continue; + } + }; + if settings.enable { + Self::do_fan_control(&settings); + } + } + thread::sleep(sleep_duration); + } + }) + } + + fn on_set_enable(settings: &Settings, _state: &State) { + // TODO stop/start jupiter fan control (or maybe let the UI handle that?) + if let Err(e) = crate::sys::write_fan_recalc(settings.enable) { + log::error!("runtime failed to write to fan recalculate file: {}", e); + } + } + + fn do_fan_control(settings: &Settings) { + /* + curve = self.settings["curve"] + fan_ratio = 0 # unnecessary in Python, but stupid without + if len(curve) == 0: + fan_ratio = 1 + else: + index = -1 + temperature_ratio = (thermal_zone(0) - TEMPERATURE_MINIMUM) / (TEMPERATURE_MAXIMUM - TEMPERATURE_MINIMUM) + for i in range(len(curve)-1, -1, -1): + if curve[i]["x"] < temperature_ratio: + index = i + break + if self.settings["interpolate"]: + fan_ratio = self.interpolate_fan(self, index, temperature_ratio) + else: + fan_ratio = self.step_fan(self, index, temperature_ratio) + set_fan_target(int((fan_ratio * FAN_MAXIMUM) + FAN_MINIMUM)) + */ + let fan_ratio: f64 = if let Some(thermal_zone) = crate::sys::read_thermal_zone(0) { + let temperature_ratio = (((thermal_zone as f64)/1000.0) - settings.temperature_bounds.min) + / (settings.temperature_bounds.max - settings.temperature_bounds.min); + let mut index = None; + for i in (0..settings.curve.len()).rev() { + if settings.curve[i].x < temperature_ratio { + index = Some(i); + break; + } + } + if settings.interpolate { + Self::interpolate_fan(settings, index, temperature_ratio) + } else { + Self::step_fan(settings, index, temperature_ratio) + } + } else { + 1.0 + }; + let fan_speed: u64 = ((fan_ratio * (settings.fan_bounds.max - settings.fan_bounds.min)) + settings.fan_bounds.min) as _; + if let Err(e) = crate::sys::write_fan_target(fan_speed) { + log::error!("runtime failed to write to fan target file: {}", e); + } + } + + fn interpolate_fan(settings: &Settings, index: Option, t_ratio: f64) -> f64 { + /* + curve = self.settings["curve"] + upper_point = {"x": 1.0, "y": 0.0} + lower_point = {"x": 0.0, "y": 1.0} + if index != -1: # guaranteed to not be empty + lower_point = curve[index] + if index != len(curve) - 1: + upper_point = curve[index+1] + #logging.debug(f"lower_point: {lower_point}, upper_point: {upper_point}") + upper_y = 1-upper_point["y"] + lower_y = 1-lower_point["y"] + slope_m = (upper_y - lower_y) / (upper_point["x"] - lower_point["x"]) + y_intercept_b = lower_y - (slope_m * lower_point["x"]) + logging.debug(f"interpolation: y = {slope_m}x + {y_intercept_b}") + return (slope_m * temperature_ratio) + y_intercept_b + */ + let (upper, lower) = if let Some(i) = index { + (if i != settings.curve.len() - 1 { + settings.curve[i+1].clone() + } else { + GraphPoint{x: 1.0, y: 1.0} + }, + settings.curve[i].clone()) + } else { + (if settings.curve.is_empty() { + GraphPoint{x: 1.0, y: 1.0} + } else { + settings.curve[0].clone() + }, + GraphPoint{x: 0.0, y: 0.0}) + }; + let slope_m = (upper.y - lower.y) / (upper.x - lower.x); + let y_intercept_b = lower.y - (slope_m * lower.x); + log::debug!("interpolation: y = {}x + {} (between {:?} and {:?})", slope_m, y_intercept_b, upper, lower); + (slope_m * t_ratio) + y_intercept_b + } + + fn step_fan(settings: &Settings, index: Option, _t_ratio: f64) -> f64 { + /* + curve = self.settings["curve"] + if index != -1: + return 1 - curve[index]["y"] + else: + if len(curve) == 0: + return 1 + else: + return 0.5 + */ + if let Some(index) = index { + settings.curve[index].y + } else { + if settings.curve.is_empty() { + 1.0 + } else { + 0.5 + } + } + } +} + +fn settings_path>(home: P) -> std::path::PathBuf { + home.as_ref().join(".config/fantastic/fantastic.json") +} diff --git a/backend-rs/src/datastructs.rs b/backend-rs/src/datastructs.rs new file mode 100644 index 0000000..e5d3b04 --- /dev/null +++ b/backend-rs/src/datastructs.rs @@ -0,0 +1,211 @@ +use std::default::Default; +use std::convert::{Into, From}; +use std::path::PathBuf; + +use super::json::{SettingsJson, GraphPointJson, BoundsJson}; + +#[derive(Debug, Clone)] +pub struct Settings { + pub version: u64, + pub enable: bool, + pub interpolate: bool, + pub curve: Vec, + pub fan_bounds: Bounds, + pub temperature_bounds: Bounds, +} + +impl Settings { + pub fn sort_curve(&mut self) { + self.curve.sort_by(|a, b| a.x.total_cmp(&b.x)) + } +} + +impl From for Settings { + fn from(mut other: SettingsJson) -> Self { + match other.version { + 0 => Self { + version: 1, + enable: other.enable, + interpolate: other.interpolate, + curve: other.curve.drain(..).map(|x| GraphPoint::from_json(x, other.version)).collect(), + fan_bounds: Bounds { + min: 1.0, + max: 7000.0, + }, + temperature_bounds: Bounds { + min: 0.0, + max: 100.0, + }, + }, + 1 => Self { + version: 1, + enable: other.enable, + interpolate: other.interpolate, + curve: other.curve.drain(..).map(|x| GraphPoint::from_json(x, other.version)).collect(), + fan_bounds: other.fan_bounds.map(|x| Bounds::::from_json(x, other.version)).unwrap_or(Bounds { + min: 1.0, + max: 7000.0, + }), + temperature_bounds: other.temperature_bounds.map(|x| Bounds::::from_json(x, other.version)).unwrap_or(Bounds { + min: 0.0, + max: 100.0, + }), + }, + _ => Self { + version: 1, + enable: other.enable, + interpolate: other.interpolate, + curve: other.curve.drain(..).map(|x| GraphPoint::from_json(x, other.version)).collect(), + fan_bounds: Bounds { + min: 1.0, + max: 7000.0, + }, + temperature_bounds: Bounds { + min: 0.0, + max: 100.0, + }, + } + } + } +} + +impl Into for Settings { + #[inline] + fn into(mut self) -> SettingsJson { + SettingsJson { + version: self.version, + enable: self.enable, + interpolate: self.interpolate, + curve: self.curve.drain(..).map(|x| x.into()).collect(), + fan_bounds: Some(self.fan_bounds.into()), + temperature_bounds: Some(self.temperature_bounds.into()), + } + } +} + +#[derive(Debug, Clone)] +pub struct GraphPoint { + pub x: f64, + pub y: f64, +} + +impl GraphPoint { + #[inline] + pub fn from_json(other: GraphPointJson, version: u64) -> Self { + match version { + 0 => Self { + x: other.x, + y: 1.0 - other.y, // use bottom left as origin, instead of whacky old way of top left + }, + 1 => Self { + x: other.x, + y: other.y, + }, + _ => Self { + x: other.x, + y: other.y, + } + } + } +} + +impl Into for GraphPoint { + #[inline] + fn into(self) -> GraphPointJson { + GraphPointJson { + x: self.x, + y: self.y, + } + } +} + +#[derive(Debug, Clone)] +pub struct Bounds { + pub min: T, + pub max: T, +} + +/*impl Bounds { + #[inline] + pub fn from_json(other: BoundsJson, version: u64) -> Self { + match version { + 0 => Self { + min: other.min as _, + max: other.max as _, + }, + 1 => Self { + min: other.min as _, + max: other.max as _, + }, + _ => Self { + min: other.min as _, + max: other.max as _, + } + } + } +}*/ + +impl Bounds { + #[inline] + pub fn from_json(other: BoundsJson, version: u64) -> Self { + match version { + 0 => Self { + min: other.min, + max: other.max, + }, + 1 => Self { + min: other.min, + max: other.max, + }, + _ => Self { + min: other.min, + max: other.max, + } + } + } +} + +/*impl Into for Bounds { + #[inline] + fn into(self) -> BoundsJson { + BoundsJson { + min: self.min as _, + max: self.max as _, + } + } +}*/ + +impl Into for Bounds { + #[inline] + fn into(self) -> BoundsJson { + BoundsJson { + min: self.min, + max: self.max, + } + } +} + +#[derive(Debug)] +pub struct State { + pub home: PathBuf, + pub dirty: bool, +} + +impl State { + pub fn new() -> Self { + let def = Self::default(); + Self { + home: usdpl_back::api::dirs::home().unwrap_or(def.home), + dirty: true, + } + } +} + +impl Default for State { + fn default() -> Self { + Self { + home: "/home/deck".into(), + dirty: true, + } + } +} diff --git a/backend-rs/src/json.rs b/backend-rs/src/json.rs new file mode 100644 index 0000000..363395f --- /dev/null +++ b/backend-rs/src/json.rs @@ -0,0 +1,78 @@ +use std::default::Default; +use std::fmt::Display; + +use serde::{Serialize, Deserialize}; + +//use super::datastructs::{Settings, GraphPoint}; + +#[derive(Serialize, Deserialize)] +pub struct SettingsJson { + pub version: u64, + pub enable: bool, + pub interpolate: bool, + pub curve: Vec, + pub fan_bounds: Option, + pub temperature_bounds: Option, +} + +#[derive(Serialize, Deserialize)] +pub struct GraphPointJson { + pub x: f64, + pub y: f64, +} + +#[derive(Serialize, Deserialize)] +pub struct BoundsJson { + pub min: f64, + pub max: f64, +} + +impl Default for SettingsJson { + fn default() -> Self { + Self { + version: 1, + enable: false, + interpolate: true, + curve: Vec::new(), + fan_bounds: Some(BoundsJson { + min: 0.0, + max: 7000.0, + }), + temperature_bounds: Some(BoundsJson { + min: 0.0, + max: 100.0, + }) + } + } +} + +impl SettingsJson { + pub fn save>(&self, path: P) -> Result<(), JsonError> { + let path = path.as_ref(); + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent).map_err(JsonError::Io)?; + } + let mut file = std::fs::File::create(path).map_err(JsonError::Io)?; + serde_json::to_writer_pretty(&mut file, &self).map_err(JsonError::Serde) + } + + pub fn open>(path: P) -> Result { + let mut file = std::fs::File::open(path).map_err(JsonError::Io)?; + serde_json::from_reader(&mut file).map_err(JsonError::Serde) + } +} + +#[derive(Debug)] +pub enum JsonError { + Serde(serde_json::Error), + Io(std::io::Error), +} + +impl Display for JsonError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Self::Serde(e) => (e as &dyn Display).fmt(f), + Self::Io(e) => (e as &dyn Display).fmt(f), + } + } +} diff --git a/backend-rs/src/main.rs b/backend-rs/src/main.rs new file mode 100644 index 0000000..5b0545e --- /dev/null +++ b/backend-rs/src/main.rs @@ -0,0 +1,41 @@ +mod api; +mod control; +mod datastructs; +mod json; +mod sys; + +use simplelog::{WriteLogger, LevelFilter}; + +use usdpl_back::Instance; + +const PORT: u16 = 44444; + +fn main() -> Result<(), ()> { + WriteLogger::init( + LevelFilter::Debug, + Default::default(), + std::fs::File::create("/tmp/fantastic.log").unwrap() + ).unwrap(); + + log::info!("Starting back-end ({} v{})", api::NAME, api::VERSION); + println!("Starting back-end ({} v{})", api::NAME, api::VERSION); + let runtime = control::ControlRuntime::new(); + runtime.run(); + Instance::new(PORT) + .register("echo", api::echo) + .register("hello", api::hello) + .register("version", api::version) + .register("name", api::name) + .register("get_fan_rpm", api::get_fan_rpm) + .register("get_temperature", api::get_temperature) + .register("set_enable", api::set_enable_gen(&runtime)) + .register("get_enable", api::get_enable_gen(&runtime)) + .register("set_interpolate", api::set_interpolate_gen(&runtime)) + .register("get_interpolate", api::get_interpolate_gen(&runtime)) + .register("get_curve", api::get_curve_gen(&runtime)) + .register("add_curve_point", api::add_curve_point_gen(&runtime)) + .register("remove_curve_point", api::remove_curve_point_gen(&runtime)) + .run_blocking() + //Ok(()) + //println!("Hello, world!"); +} diff --git a/backend-rs/src/sys.rs b/backend-rs/src/sys.rs new file mode 100644 index 0000000..9bc0cd7 --- /dev/null +++ b/backend-rs/src/sys.rs @@ -0,0 +1,17 @@ +use usdpl_back::api::files::*; + +pub fn read_fan() -> Option { + read_single("/sys/class/hwmon/hwmon5/fan1_input").ok() +} + +pub fn read_thermal_zone(index: u8) -> Option { + read_single(format!("/sys/class/thermal/thermal_zone{}/temp", index)).ok() +} + +pub fn write_fan_recalc(enabled: bool) -> Result<(), std::io::Error> { + write_single("/sys/class/hwmon/hwmon5/recalculate", enabled as u8) +} + +pub fn write_fan_target(rpm: u64) -> Result<(), std::io::Error> { + write_single("/sys/class/hwmon/hwmon5/fan1_target", rpm) +} diff --git a/extras/ui.png b/extras/ui.png deleted file mode 100644 index 760a68c..0000000 Binary files a/extras/ui.png and /dev/null differ diff --git a/fantastic.json b/fantastic.json new file mode 100644 index 0000000..0956d87 --- /dev/null +++ b/fantastic.json @@ -0,0 +1 @@ +{"version": 0, "enable": true, "interpolate": true, "curve": [{"x": 0.2740740740740741, "y": 0.815}, {"x": 0.725925925925926, "y": 0.665}, {"x": 0.9074074074074074, "y": 0.08}]} \ No newline at end of file diff --git a/main.py b/main.py index b0c5535..578aacf 100644 --- a/main.py +++ b/main.py @@ -10,7 +10,7 @@ HOME_DIR = str(pathlib.Path(os.getcwd()).parent.parent.resolve()) import logging logging.basicConfig( - filename = "/tmp/fantastic.log", + filename = "/tmp/fantastic.old.log", format = '%(asctime)s %(levelname)s %(message)s', filemode = 'w', force = True) @@ -35,6 +35,8 @@ DEFAULT_DATA = { "curve": [], # items are {x: int (distance from left), y: int (distance from top, NOT bottom)} } +logging.debug(f"CWD: {os.getcwd()}") + class Plugin: settings = None is_changed = False diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0719b85 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2582 @@ +{ + "name": "decky-plugin-template", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "decky-plugin-template", + "version": "0.0.1", + "license": "GPL-2.0-or-later", + "dependencies": { + "decky-frontend-lib": "*", + "react-icons": "^4.3.1", + "usdpl-front": "file:./src/usdpl" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^21.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^13.2.1", + "@rollup/plugin-replace": "^4.0.0", + "@rollup/plugin-typescript": "^8.3.2", + "@types/react": "16.14.0", + "@types/webpack": "^5.28.0", + "rollup": "^2.70.2", + "rollup-plugin-import-assets": "^1.1.1", + "shx": "^0.3.4", + "tslib": "^2.4.0", + "typescript": "^4.6.4" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", + "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz", + "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^2.38.3" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.0.8" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^2.42.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.3.tgz", + "integrity": "sha512-55L9SyiYu3r/JtqdjhwcwaECXP7JeJ9h1Sg1VWRJKIutla2MdZQodTgcCNybXLMCnqpNLEhS2vGENww98L1npg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", + "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", + "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.0.tgz", + "integrity": "sha512-jJjHo1uOe+NENRIBvF46tJimUvPnmbQ41Ax0pEm7pRvhPg+wuj8VMOHHiMvaGmZRzRrCtm7KnL5OOE/6kHPK8w==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/webpack": { + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", + "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", + "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001359", + "electron-to-chromium": "^1.4.172", + "node-releases": "^2.0.5", + "update-browserslist-db": "^1.0.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001363", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz", + "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "node_modules/decky-frontend-lib": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/decky-frontend-lib/-/decky-frontend-lib-1.0.1.tgz", + "integrity": "sha512-SgIPoB3IcWbzVRlXvs8JfhwrMphHYa7O/Ek2mh+rC0WTVT3TI2qGJ5+OoV16mw5kGY0DMu1ikcZC6ib1lh2zKQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.177", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.177.tgz", + "integrity": "sha512-FYPir3NSBEGexSZUEeht81oVhHfLFl6mhUKSkjHN/iB/TwEIt/WHQrqVGfTLN5gQxwJCQkIJBe05eOXjI7omgg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-icons": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz", + "integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.75.7", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", + "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-import-assets": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-import-assets/-/rollup-plugin-import-assets-1.1.1.tgz", + "integrity": "sha512-u5zJwOjguTf2N+wETq2weNKGvNkuVc1UX/fPgg215p5xPvGOaI6/BTc024E9brvFjSQTfIYqgvwogQdipknu1g==", + "dev": true, + "dependencies": { + "rollup-pluginutils": "^2.7.1", + "url-join": "^4.0.1" + }, + "peerDependencies": { + "rollup": ">=1.9.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "dev": true, + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", + "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.7", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", + "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/usdpl-front": { + "resolved": "src/usdpl", + "link": true + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "src/usdpl": { + "name": "usdpl-front", + "version": "0.4.0", + "license": "GPL-3.0-only" + } + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", + "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@rollup/plugin-commonjs": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz", + "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + } + }, + "@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/plugin-replace": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz", + "integrity": "sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/plugin-typescript": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.3.tgz", + "integrity": "sha512-55L9SyiYu3r/JtqdjhwcwaECXP7JeJ9h1Sg1VWRJKIutla2MdZQodTgcCNybXLMCnqpNLEhS2vGENww98L1npg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@types/eslint": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", + "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/node": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", + "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "@types/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.0.tgz", + "integrity": "sha512-jJjHo1uOe+NENRIBvF46tJimUvPnmbQ41Ax0pEm7pRvhPg+wuj8VMOHHiMvaGmZRzRrCtm7KnL5OOE/6kHPK8w==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/webpack": { + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", + "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "dev": true, + "requires": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", + "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001359", + "electron-to-chromium": "^1.4.172", + "node-releases": "^2.0.5", + "update-browserslist-db": "^1.0.4" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001363", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001363.tgz", + "integrity": "sha512-HpQhpzTGGPVMnCjIomjt+jvyUu8vNFo3TaDiZ/RcoTrlOq/5+tC8zHdsbgFB6MxmaY+jCpsH09aD80Bb4Ow3Sg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", + "dev": true + }, + "decky-frontend-lib": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/decky-frontend-lib/-/decky-frontend-lib-1.0.1.tgz", + "integrity": "sha512-SgIPoB3IcWbzVRlXvs8JfhwrMphHYa7O/Ek2mh+rC0WTVT3TI2qGJ5+OoV16mw5kGY0DMu1ikcZC6ib1lh2zKQ==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.177", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.177.tgz", + "integrity": "sha512-FYPir3NSBEGexSZUEeht81oVhHfLFl6mhUKSkjHN/iB/TwEIt/WHQrqVGfTLN5gQxwJCQkIJBe05eOXjI7omgg==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "dev": true, + "requires": { + "builtin-modules": "^3.0.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-icons": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz", + "integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==", + "requires": {} + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rollup": { + "version": "2.75.7", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", + "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-import-assets": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-import-assets/-/rollup-plugin-import-assets-1.1.1.tgz", + "integrity": "sha512-u5zJwOjguTf2N+wETq2weNKGvNkuVc1UX/fPgg215p5xPvGOaI6/BTc024E9brvFjSQTfIYqgvwogQdipknu1g==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.7.1", + "url-join": "^4.0.1" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "dev": true, + "requires": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", + "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.7", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.7.2" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", + "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "usdpl-front": { + "version": "file:src/usdpl" + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..438922f --- /dev/null +++ b/package.json @@ -0,0 +1,46 @@ +{ + "name": "decky-plugin-template", + "version": "0.0.1", + "description": "A template to quickly create decky plugins from scratch, based on TypeScript and webpack", + "scripts": { + "build": "shx rm -rf dist && rollup -c", + "watch": "rollup -c -w", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SteamDeckHomebrew/decky-plugin-template.git" + }, + "keywords": [ + "decky", + "plugin", + "plugin-template", + "steam-deck", + "deck" + ], + "author": "Jonas Dellinger ", + "license": "GPL-2.0-or-later", + "bugs": { + "url": "https://github.com/SteamDeckHomebrew/decky-plugin-template/issues" + }, + "homepage": "https://github.com/SteamDeckHomebrew/decky-plugin-template#readme", + "devDependencies": { + "@rollup/plugin-commonjs": "^21.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^13.2.1", + "@rollup/plugin-replace": "^4.0.0", + "@rollup/plugin-typescript": "^8.3.2", + "@types/react": "16.14.0", + "@types/webpack": "^5.28.0", + "rollup": "^2.70.2", + "rollup-plugin-import-assets": "^1.1.1", + "shx": "^0.3.4", + "tslib": "^2.4.0", + "typescript": "^4.6.4" + }, + "dependencies": { + "decky-frontend-lib": "*", + "react-icons": "^4.3.1", + "usdpl-front": "file:./src/usdpl" + } +} diff --git a/plugin.json b/plugin.json index 5cd1e1d..d612125 100644 --- a/plugin.json +++ b/plugin.json @@ -1,9 +1,7 @@ { - "name": "Fantastic", + "name": "Fantastic_React", "author": "NGnius", - "main_view_html": "main_view.html", - "tile_view_html": "", - "flags": ["root", "_debug"], + "flags": ["root", "debug"], "publish": { "discord_id": "106537989684887552", "description": "Fan controls", diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..8717908 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,37 @@ +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import replace from '@rollup/plugin-replace'; +import typescript from '@rollup/plugin-typescript'; +import { defineConfig } from 'rollup'; +import importAssets from 'rollup-plugin-import-assets'; + +import { name } from "./plugin.json"; + +export default defineConfig({ + input: './src/index.tsx', + plugins: [ + commonjs(), + nodeResolve(), + typescript(), + json(), + replace({ + preventAssignment: false, + 'process.env.NODE_ENV': JSON.stringify('production'), + }), + importAssets({ + publicPath: `http://127.0.0.1:1337/plugins/${name}/` + }) + ], + context: 'window', + external: ['react', 'react-dom'], + output: { + file: 'dist/index.js', + globals: { + react: 'SP_REACT', + 'react-dom': 'SP_REACTDOM', + }, + format: 'iife', + exports: 'default', + }, +}); diff --git a/src/backend.ts b/src/backend.ts new file mode 100644 index 0000000..87f5a78 --- /dev/null +++ b/src/backend.ts @@ -0,0 +1,74 @@ +import {init_usdpl, target, init_embedded, call_backend} from "usdpl-front"; + +const USDPL_PORT: number = 44444; + +// Utility + +export function resolve(promise: Promise, setter: any) { + (async function () { + let data = await promise; + if (data != null) { + console.debug("Got resolved", data); + setter(data); + } else { + console.warn("Resolve failed:", data); + } + })(); +} + +export function execute(promise: Promise) { + (async function () { + let data = await promise; + console.debug("Got executed", data); + })(); +} + +export async function initBackend() { + // init usdpl + await init_embedded(); + init_usdpl(USDPL_PORT); + console.log("USDPL started for framework: " + target()); + //setReady(true); +} + +// Back-end functions + +export async function setEnabled(value: boolean): Promise { + return (await call_backend("set_enable", [value]))[0]; +} + +export async function getEnabled(): Promise { + return (await call_backend("get_enable", []))[0]; +} + +export async function setInterpolate(value: boolean): Promise { + return (await call_backend("set_interpolate", [value]))[0]; +} + +export async function getInterpolate(): Promise { + return (await call_backend("get_interpolate", []))[0]; +} + +export async function getVersion(): Promise { + return (await call_backend("version", []))[0]; +} + +export async function getCurve(): Promise<{"x": number, "y": number}[]> { + return (await call_backend("get_curve", []))[0]; +} + +export async function addCurvePoint(point: {"x": number, "y": number}): Promise<{"x": number, "y": number}[]> { + return (await call_backend("add_curve_point", [point]))[0]; +} + +export async function removeCurvePoint(index: number): Promise<{"x": number, "y": number}[]> { + return (await call_backend("remove_curve_point", [index]))[0]; +} + +export async function getFanRpm(): Promise { + return (await call_backend("get_fan_rpm", []))[0]; +} + +export async function getTemperature(): Promise { + return (await call_backend("get_temperature", []))[0]; +} diff --git a/src/canvas.tsx b/src/canvas.tsx new file mode 100644 index 0000000..c2016cb --- /dev/null +++ b/src/canvas.tsx @@ -0,0 +1,39 @@ +// from https://medium.com/@pdx.lucasm/canvas-with-react-js-32e133c05258 + +//import React from 'react'; +import { useRef, useEffect } from 'react'; + +export const Canvas = (props: any) => { + + const { draw, options, ...rest } = props; + //const { context, ...moreConfig } = options; + const canvasRef = useCanvas(draw); + + return ; +} + +export const useCanvas = (draw: (ctx: any, count: number) => void) => { + + const canvasRef: any = useRef(null); + + useEffect(() => { + + const canvas = canvasRef.current; + const context = canvas!.getContext('2d'); + let frameCount = 0; + let animationFrameId: number; + + const render = () => { + frameCount++; + draw(context, frameCount); + animationFrameId = window.requestAnimationFrame(render); + } + render(); + + return () => { + window.cancelAnimationFrame(animationFrameId); + } + }, [draw]); + + return canvasRef; +} diff --git a/src/index.tsx b/src/index.tsx new file mode 100755 index 0000000..a73b5f7 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,287 @@ +import { + definePlugin, + DialogButton, + PanelSection, + PanelSectionRow, + ServerAPI, + ToggleField, + staticClasses, + gamepadDialogClasses, + joinClassNames, +} from "decky-frontend-lib"; +import { VFC, useState } from "react"; +import { FaFan } from "react-icons/fa"; + +import * as backend from "./backend"; +import {Canvas} from "./canvas"; + +const POINT_SIZE = 32; + +var periodicHook: any = null; + +const Content: VFC<{ serverAPI: ServerAPI }> = ({serverAPI}) => { + // const [result, setResult] = useState(); + + // const onClick = async () => { + // const result = await serverAPI.callPluginMethod( + // "add", + // { + // left: 2, + // right: 2, + // } + // ); + // if (result.success) { + // setResult(result.result); + // } + // }; + + const [enabledGlobal, setEnableInternal] = useState(false); + const [interpolGlobal, setInterpol] = useState(false); + const [serverApiGlobal, setServerApi] = useState(serverAPI); + const [firstTime, setFirstTime] = useState(true); + const [usdplReady, setUsdplReady] = useState(false); + const [curveGlobal, setCurve] = useState<{x: number, y: number}[]>([]); + + const [temperatureGlobal, setTemperature] = useState(-273.15); + const [fanRpmGlobal, setFanRpm] = useState(-1337); + + function setEnable(enable: boolean) { + setEnableInternal(enable); + //@ts-ignore + SteamClient.System.SetBetaFanControl(!enable); + } + + function onClickCanvas(e: any) { + //console.log("canvas click", e); + const realEvent: any = e.nativeEvent; + //console.log("Canvas click @ (" + realEvent.layerX.toString() + ", " + realEvent.layerY.toString() + ")"); + const target: any = e.currentTarget; + //console.log("Target dimensions " + target.width.toString() + "x" + target.height.toString()); + const clickX = realEvent.layerX; + const clickY = realEvent.layerY; + for (let i = 0; i < curveGlobal.length; i++) { + const curvePoint = curveGlobal[i]; + const pointX = curvePoint.x * target.width; + const pointY = (1 - curvePoint.y) * target.height; + if ( + pointX + POINT_SIZE > clickX + && pointX - POINT_SIZE < clickX + && pointY + POINT_SIZE > clickY + && pointY - POINT_SIZE < clickY + ) { + //console.log("Clicked on point " + i.toString()); + backend.resolve(backend.removeCurvePoint(i), setCurve); + return; + } + } + //console.log("Adding new point"); + backend.resolve(backend.addCurvePoint({x: clickX / target.width, y: 1 - (clickY / target.height)}), setCurve); + } + + function drawCanvas(ctx: any, frameCount: number): void { + const width: number = ctx.canvas.width; + const height: number = ctx.canvas.height; + + ctx.strokeStyle = "#1a9fff"; + ctx.fillStyle = "#1a9fff"; + ctx.lineWidth = 2; + ctx.lineJoin = "round"; + //ctx.beginPath(); + ctx.clearRect(0, 0, width, height); + /*ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // Outer circle + ctx.moveTo(110, 75); + ctx.arc(75, 75, 35, 0, Math.PI, false); // Mouth (clockwise) + ctx.moveTo(65, 65); + ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // Left eye + ctx.moveTo(95, 65); + ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // Right eye*/ + //ctx.beginPath(); + //ctx.moveTo(0, height); + if (interpolGlobal) { + ctx.beginPath(); + ctx.moveTo(0, height); + for (let i = 0; i < curveGlobal.length; i++) { + const canvasHeight = (1 - curveGlobal[i].y) * height; + const canvasWidth = curveGlobal[i].x * width; + ctx.lineTo(canvasWidth, canvasHeight); + ctx.moveTo(canvasWidth, canvasHeight); + ctx.arc(canvasWidth, canvasHeight, 8, 0, Math.PI * 2); + ctx.moveTo(canvasWidth, canvasHeight); + } + ctx.lineTo(width, 0); + //ctx.moveTo(width, 0); + ctx.stroke(); + ctx.fill(); + } else { + ctx.beginPath(); + ctx.moveTo(0, height); + for (let i = 0; i < curveGlobal.length - 1; i++) { + const canvasHeight = (1 - curveGlobal[i].y) * height; + const canvasWidth = curveGlobal[i].x * width; + const canvasHeight2 = (1 - curveGlobal[i+1].y) * height; + const canvasWidth2 = curveGlobal[i+1].x * width; + //ctx.lineTo(canvasWidth, canvasHeight); + ctx.moveTo(canvasWidth, canvasHeight); + ctx.arc(canvasWidth, canvasHeight, 8, 0, Math.PI * 2); + ctx.moveTo(canvasWidth, canvasHeight); + ctx.lineTo(canvasWidth2, canvasHeight); + ctx.moveTo(canvasWidth2, canvasHeight); + ctx.lineTo(canvasWidth2, canvasHeight2); + } + if (curveGlobal.length != 0) { + const i = curveGlobal.length - 1; + const canvasHeight = (1 - curveGlobal[i].y) * height; + const canvasWidth = curveGlobal[i].x * width; + //ctx.lineTo(width, 0); + ctx.moveTo(canvasWidth, canvasHeight); + ctx.arc(canvasWidth, canvasHeight, 8, 0, Math.PI * 2); + ctx.moveTo(canvasWidth, canvasHeight); + ctx.lineTo(width, canvasHeight); + //ctx.moveTo(width, canvasHeight); + //ctx.lineTo(width, 0); + const canvasHeight2 = (1 - curveGlobal[0].y) * height; + const canvasWidth2 = curveGlobal[0].x * width; + ctx.moveTo(canvasWidth2, canvasHeight2); + ctx.lineTo(canvasWidth2, height); + } + + //ctx.moveTo(width, 0); + ctx.stroke(); + ctx.fill(); + } + //console.debug("Drew canvas with " + curveGlobal.length.toString() + " points; " + width.toString() + "x" + height.toString()); + //ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + //ctx.fillStyle = '#000000'; + //ctx.beginPath(); + //ctx.arc(50, 100, 20*Math.sin(frameCount*0.05)**2, 0, 2*Math.PI); + //ctx.fill(); + + } + + if (firstTime) { + setFirstTime(false); + setServerApi(serverAPI); + (async function(){ + await backend.initBackend(); + setUsdplReady(true); + backend.resolve(backend.getEnabled(), setEnable); + backend.resolve(backend.getInterpolate(), setInterpol); + backend.resolve(backend.getCurve(), setCurve); + backend.resolve(backend.getTemperature(), setTemperature); + backend.resolve(backend.getFanRpm(), setFanRpm); + })(); + + periodicHook = setInterval(function() { + backend.resolve(backend.getTemperature(), setTemperature); + backend.resolve(backend.getFanRpm(), setFanRpm); + }, 1000); + } + + if (!usdplReady) { + return ( + + + ); + } + + const FieldWithSeparator = joinClassNames(gamepadDialogClasses.Field, gamepadDialogClasses.WithBottomSeparatorStandard); + + // TODO handle clicking on fan curve nodes + + return ( + + +
+
+
+ Current Fan Speed +
+
+ {fanRpmGlobal.toFixed(0) + " RPM"} +
+
+
+
+ +
+
+
+ Current Temperature +
+
+ {temperatureGlobal.toFixed(1) + " °C"} +
+
+
+
+ + { + backend.resolve(backend.setEnabled(value), setEnable); + }} + /> + + { enabledGlobal && +
+ Fan +
+ } + { enabledGlobal && + + onClickCanvas(e)}/> + + } + { enabledGlobal && + + { + backend.resolve(backend.setInterpolate(value), setInterpol); + }} + /> + + } +
+ ); +}; + +const DeckyPluginRouterTest: VFC = () => { + return ( +
+ Hello World! + {}}> + Go to Store + +
+ ); +}; + +export default definePlugin((serverApi: ServerAPI) => { + serverApi.routerHook.addRoute("/decky-plugin-test", DeckyPluginRouterTest, { + exact: true, + }); + + return { + title:
Fantastic
, + content: , + icon: , + onDismount() { + clearInterval(periodicHook!); + serverApi.routerHook.removeRoute("/decky-plugin-test"); + }, + }; +}); diff --git a/src/types.d.ts b/src/types.d.ts new file mode 100644 index 0000000..dfc0472 --- /dev/null +++ b/src/types.d.ts @@ -0,0 +1,14 @@ +declare module "*.svg" { + const content: string; + export default content; +} + +declare module "*.png" { + const content: string; + export default content; +} + +declare module "*.jpg" { + const content: string; + export default content; +} diff --git a/src/usdpl/package.json b/src/usdpl/package.json new file mode 100644 index 0000000..13a0be4 --- /dev/null +++ b/src/usdpl/package.json @@ -0,0 +1,21 @@ +{ + "name": "usdpl-front", + "collaborators": [ + "NGnius (Graham) " + ], + "description": "Universal Steam Deck Plugin Library front-end designed for WASM", + "version": "0.4.0", + "license": "GPL-3.0-only", + "repository": { + "type": "git", + "url": "https://github.com/NGnius/usdpl-rs" + }, + "files": [ + "usdpl_front_bg.wasm", + "usdpl_front.js", + "usdpl_front.d.ts" + ], + "module": "usdpl_front.js", + "types": "usdpl_front.d.ts", + "sideEffects": false +} \ No newline at end of file diff --git a/src/usdpl/usdpl_front.d.ts b/src/usdpl/usdpl_front.d.ts new file mode 100644 index 0000000..3034865 --- /dev/null +++ b/src/usdpl/usdpl_front.d.ts @@ -0,0 +1,51 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* Initialize the front-end library +* @param {number} port +*/ +export function init_usdpl(port: number): void; +/** +* Get the targeted plugin framework, or "any" if unknown +* @returns {string} +*/ +export function target(): string; +/** +* Call a function on the back-end. +* Returns null (None) if this fails for any reason. +* @param {string} name +* @param {any[]} parameters +* @returns {Promise} +*/ +export function call_backend(name: string, parameters: any[]): Promise; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly init_usdpl: (a: number) => void; + readonly target: (a: number) => void; + readonly call_backend: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_malloc: (a: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number) => number; + readonly __wbindgen_export_2: WebAssembly.Table; + readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h2bd47cee569ae4c6: (a: number, b: number, c: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly wasm_bindgen__convert__closures__invoke2_mut__hfe1195d34914cc54: (a: number, b: number, c: number, d: number) => void; +} + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function init (module_or_path?: InitInput | Promise): Promise; + + +// USDPL customization +export function init_embedded(); diff --git a/src/usdpl/usdpl_front.js b/src/usdpl/usdpl_front.js new file mode 100644 index 0000000..3863e8f --- /dev/null +++ b/src/usdpl/usdpl_front.js @@ -0,0 +1,476 @@ + +let wasm; + +const heap = new Array(32).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let WASM_VECTOR_LEN = 0; + +let cachegetUint8Memory0 = null; +function getUint8Memory0() { + if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) { + cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachegetUint8Memory0; +} + +const cachedTextEncoder = new TextEncoder('utf-8'); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length); + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len); + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3); + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachegetInt32Memory0 = null; +function getInt32Memory0() { + if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) { + cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachegetInt32Memory0; +} + +const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +function getStringFromWasm0(ptr, len) { + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function dropObject(idx) { + if (idx < 36) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachegetFloat64Memory0 = null; +function getFloat64Memory0() { + if (cachegetFloat64Memory0 === null || cachegetFloat64Memory0.buffer !== wasm.memory.buffer) { + cachegetFloat64Memory0 = new Float64Array(wasm.memory.buffer); + } + return cachegetFloat64Memory0; +} + +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor }; + const real = (...args) => { + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) { + wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); + + } else { + state.a = a; + } + } + }; + real.original = state; + + return real; +} +function __wbg_adapter_26(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h2bd47cee569ae4c6(arg0, arg1, addHeapObject(arg2)); +} + +/** +* Initialize the front-end library +* @param {number} port +*/ +export function init_usdpl(port) { + wasm.init_usdpl(port); +} + +/** +* Get the targeted plugin framework, or "any" if unknown +* @returns {string} +*/ +export function target() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.target(retptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(r0, r1); + } +} + +let cachegetUint32Memory0 = null; +function getUint32Memory0() { + if (cachegetUint32Memory0 === null || cachegetUint32Memory0.buffer !== wasm.memory.buffer) { + cachegetUint32Memory0 = new Uint32Array(wasm.memory.buffer); + } + return cachegetUint32Memory0; +} + +function passArrayJsValueToWasm0(array, malloc) { + const ptr = malloc(array.length * 4); + const mem = getUint32Memory0(); + for (let i = 0; i < array.length; i++) { + mem[ptr / 4 + i] = addHeapObject(array[i]); + } + WASM_VECTOR_LEN = array.length; + return ptr; +} +/** +* Call a function on the back-end. +* Returns null (None) if this fails for any reason. +* @param {string} name +* @param {any[]} parameters +* @returns {Promise} +*/ +export function call_backend(name, parameters) { + const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArrayJsValueToWasm0(parameters, wasm.__wbindgen_malloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.call_backend(ptr0, len0, ptr1, len1); + return takeObject(ret); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +function __wbg_adapter_58(arg0, arg1, arg2, arg3) { + wasm.wasm_bindgen__convert__closures__invoke2_mut__hfe1195d34914cc54(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); +} + +async function load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +async function init(input) { + if (typeof input === 'undefined') { + input = new URL('usdpl_front_bg.wasm', import.meta.url); + } + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbindgen_number_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'number' ? obj : undefined; + getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; + getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); + }; + imports.wbg.__wbindgen_is_null = function(arg0) { + const ret = getObject(arg0) === null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbg_headers_0a71906114661592 = function(arg0) { + const ret = getObject(arg0).headers; + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithstrandinit_fd99688f189f053e = function() { return handleError(function (arg0, arg1, arg2) { + const ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_instanceof_Window_0e6c0f1096d66c3c = function(arg0) { + const ret = getObject(arg0) instanceof Window; + return ret; + }; + imports.wbg.__wbg_fetch_ef7a6623d1fcd3b8 = function(arg0, arg1) { + const ret = getObject(arg0).fetch(getObject(arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_6884dcc6cdd65022 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).set(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); + }, arguments) }; + imports.wbg.__wbg_instanceof_Response_ccfeb62399355bcd = function(arg0) { + const ret = getObject(arg0) instanceof Response; + return ret; + }; + imports.wbg.__wbg_url_06c0f822d68d195c = function(arg0, arg1) { + const ret = getObject(arg1).url; + const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbg_text_2612fbe0b9d32220 = function() { return handleError(function (arg0) { + const ret = getObject(arg0).text(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; + }; + imports.wbg.__wbg_newnoargs_e23b458e372830de = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_ae78342adc33730a = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_36359baae5a47e27 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbg_self_99737b4dcdf6f0d8 = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_9b61fbbf3564c4fb = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_8e275ef40caea3a3 = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_5de1e0f82bddcd27 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_newwithlength_e80fb11cf19c1628 = function(arg0) { + const ret = new Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_561aac756158708c = function(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_call_3ed288a247f13ea5 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_new_37705eed627d5ed9 = function(arg0, arg1) { + try { + var state0 = {a: arg0, b: arg1}; + var cb0 = (arg0, arg1) => { + const a = state0.a; + state0.a = 0; + try { + return __wbg_adapter_58(a, state0.b, arg0, arg1); + } finally { + state0.a = a; + } + }; + const ret = new Promise(cb0); + return addHeapObject(ret); + } finally { + state0.a = state0.b = 0; + } + }; + imports.wbg.__wbg_resolve_a9a87bdd64e9e62c = function(arg0) { + const ret = Promise.resolve(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_then_ce526c837d07b68f = function(arg0, arg1) { + const ret = getObject(arg0).then(getObject(arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_then_842e65b843962f56 = function(arg0, arg1, arg2) { + const ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_93b1c87ee2af852e = function() { return handleError(function (arg0, arg1, arg2) { + const ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2)); + return ret; + }, arguments) }; + imports.wbg.__wbg_parse_8217e7299bf72f3d = function() { return handleError(function (arg0, arg1) { + const ret = JSON.parse(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_stringify_c760003feffcc1f2 = function() { return handleError(function (arg0) { + const ret = JSON.stringify(getObject(arg0)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_closure_wrapper609 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 53, __wbg_adapter_26); + return addHeapObject(ret); + }; + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + + + const { instance, module } = await load(await input, imports); + + wasm = instance.exports; + init.__wbindgen_wasm_module = module; + + return wasm; +} + +export default init; + + + +// USDPL customization +const encoded = "AGFzbQEAAAABigEVYAJ/fwBgAX8AYAJ/fwF/YAF/AX9gA39/fwBgA39/fwF/YAR/f39/AGAFf39/f38AYAABf2AEf39/fwF/YAAAYAF/AX5gBX9/f39/AX9gBn9/f39/fwBgBX9/fX9/AGAFf398f38AYAR/fX9/AGAEf3x/fwBgBn9/f39/fwF/YAJ+fwF/YAF8AX8CkQomA3diZxVfX3diaW5kZ2VuX3N0cmluZ19nZXQAAAN3YmcVX193YmluZGdlbl9zdHJpbmdfbmV3AAIDd2JnFV9fd2JpbmRnZW5fbnVtYmVyX25ldwAUA3diZxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgABA3diZxZfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0AAMDd2JnFV9fd2JpbmRnZW5fbnVtYmVyX2dldAAAA3diZxJfX3diaW5kZ2VuX2lzX251bGwAAwN3YmcXX193YmluZGdlbl9pc191bmRlZmluZWQAAwN3YmceX193YmdfaGVhZGVyc18wYTcxOTA2MTE0NjYxNTkyAAMDd2JnKF9fd2JnX25ld3dpdGhzdHJhbmRpbml0X2ZkOTk2ODhmMTg5ZjA1M2UABQN3YmcoX193YmdfaW5zdGFuY2VvZl9XaW5kb3dfMGU2YzBmMTA5NmQ2NmMzYwADA3diZxxfX3diZ19mZXRjaF9lZjdhNjYyM2QxZmNkM2I4AAIDd2JnG19fd2JpbmRnZW5fb2JqZWN0X2Nsb25lX3JlZgADA3diZxpfX3diZ19zZXRfNjg4NGRjYzZjZGQ2NTAyMgAHA3diZypfX3diZ19pbnN0YW5jZW9mX1Jlc3BvbnNlX2NjZmViNjIzOTkzNTViY2QAAwN3YmcaX193YmdfdXJsXzA2YzBmODIyZDY4ZDE5NWMAAAN3YmcbX193YmdfdGV4dF8yNjEyZmJlMGI5ZDMyMjIwAAMDd2JnEl9fd2JpbmRnZW5fY2JfZHJvcAADA3diZyBfX3diZ19uZXdub2FyZ3NfZTIzYjQ1OGUzNzI4MzBkZQACA3diZxtfX3diZ19jYWxsX2FlNzgzNDJhZGMzMzczMGEAAgN3YmcaX193YmdfbmV3XzM2MzU5YmFhZTVhNDdlMjcACAN3YmcUX193YmluZGdlbl9pc19zdHJpbmcAAwN3YmcbX193Ymdfc2VsZl85OTczN2I0ZGNkZjZmMGQ4AAgDd2JnHV9fd2JnX3dpbmRvd185YjYxZmJiZjM1NjRjNGZiAAgDd2JnIV9fd2JnX2dsb2JhbFRoaXNfOGUyNzVlZjQwY2FlYTNhMwAIA3diZx1fX3diZ19nbG9iYWxfNWRlMWUwZjgyYmRkY2QyNwAIA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoX2U4MGZiMTFjZjE5YzE2MjgAAwN3YmcaX193Ymdfc2V0XzU2MWFhYzc1NjE1ODcwOGMABAN3YmcbX193YmdfY2FsbF8zZWQyODhhMjQ3ZjEzZWE1AAUDd2JnGl9fd2JnX25ld18zNzcwNWVlZDYyN2Q1ZWQ5AAIDd2JnHl9fd2JnX3Jlc29sdmVfYTlhODdiZGQ2NGU5ZTYyYwADA3diZxtfX3diZ190aGVuX2NlNTI2YzgzN2QwN2I2OGYAAgN3YmcbX193YmdfdGhlbl84NDJlNjViODQzOTYyZjU2AAUDd2JnGl9fd2JnX3NldF85M2IxYzg3ZWUyYWY4NTJlAAUDd2JnHF9fd2JnX3BhcnNlXzgyMTdlNzI5OWJmNzJmM2QAAgN3YmcgX193Ymdfc3RyaW5naWZ5X2M3NjAwMDNmZWZmY2MxZjIAAwN3YmcQX193YmluZGdlbl90aHJvdwAAA3diZx1fX3diaW5kZ2VuX2Nsb3N1cmVfd3JhcHBlcjYwOQAFA5wCmgIGAwYEAgEFBQkEBAYFBAQAAAAAAwQCAgQIAAMEAAUTBgABBAIIAgAABAMECQQBBAQGBgYBBgQABwQCBAYEAQACBgQBAAEBAQEBAAEEBAADAwAHBAABDQEBAAAGBgEDBwICAwQBAAAAAAQCBAABAQIBAgACAAEFAgAGBgQBAAEAAAAAAQEAAAAFAAEFAAYBAAAABAMAAAEFAAMEAQcEAAEKAwAACAQAAQEBAQEAAAABAQoAAwADAAIAAAAAAQAAAQQAAQABAAEKAQQHAwUEEg4HDA8AAQYBAAQEBQEDAwMBAwMAAgICBAIJAAMBAgECBQIEAgQBAgADAgUDAwADAgICBAIDAQIAAwMDAwAAAAAFBQICAgMDAQsLCwEEBQFwAWNjBQMBABEGCQF/AUGAgMAACweDAwwGbWVtb3J5AgAKaW5pdF91c2RwbACSAgZ0YXJnZXQAowEMY2Fs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DAQLIANB6ABqIANBkAFqKQMAIgY3AQAgA0HgAGogA0GIAWopAwAiBzcBACADQdgAaiADQYABaikDACIINwEAIAMgA0H4AGopAwAiCTcBUCADQZgBaigCACEFIANBQGsgBjcDACADQThqIAc3AwAgA0EwaiAINwMAIAMgCTcDKCADQYwBaiAGNwIAIANBhAFqIAc3AgAgA0H8AGogCDcCACADIAk3AnQgAyADQfAAakEkELUCGkEAIQQMAgsgA0HgAGogA0GIAWopAwAiBjcBACADQdgAaiADQYABaikDACIHNwEAIAMgA0H4AGopAwAiCDcBUCADQZABaigCACEFIANBOGogBjcDACADQTBqIAc3AwAgAyAINwMoIANBhAFqIAY3AgAgA0H8AGogBzcCACADIAg3AnQgAyADQfAAakEkELUCGgwBCyADQdQAaiADQfwAaigCACIBNgEAIANBCGogATYCACADIAMpAnQ3AwAgA0GAAWooAgAhBUEEIQQLIABBDGogA0EkELUCGiAAQTBqIAVBAWo2AgAgAEEIaiAENgIAIABBADoAAAsgA0GgAWokAAusBgIHfwF+IwBB0ABrIgMkAAJ/AkACQAJAAkACQAJAAkAgAS0AvAlBAWsOAwMAAgELAAsgASABKQOACTcDmAkgASABKQKMCTcCpAkgAUGgCWogAUGICWooAgA2AgAgAUGsCWoiBSABQZQJaigCACIENgIAQZDBwABBkMHAACkDACIKQgF8NwMAIANBCGogBBBvIAMoAgghBCABQQA2ArgJIAFBtAlqIAMoAgw2AgAgASAENgKwCSABKAKoCSEGIAMgASgCpAkiBCAFKAIAIgdBAnRqNgJMIAMgBDYCSCADIAY2AkQgAyAENgJAIAFBsAlqIQUgBwRAA0AgAyAEQQRqNgJIIANBEGogBCgCABA4IAEoArgJIgQgASgCtAlGBEAgBSAEELUBIAEoArgJIQQLIAEoArAJIARBBHRqIgQgAykDEDcDACAEQQhqIANBGGopAwA3AwAgASABKAK4CUEBajYCuAkgAygCSCIEIAMoAkxHDQALCyADQUBrEIkBQZjBwAAvAQAhBCADQSBqIAFBmAlqEJkBIANBLGogBSkCADcCACADQTRqIAVBCGooAgA2AgAgAyAKNwMYIANBADYCECABIANBEGpBKBC1AiIFQQA6AGwgBSAEOwFoCyADQRBqIAEgAhApIAMoAhAiBkECRwRAIANBGGopAwAhCiADKAIUIQQgARBoIAYNAiADIApCIIinIgUQGjYCPCADIAQgBUEEdCICajYCTCADIAQ2AkggAyAKPgJEIAMgBDYCQCAFRQ0DQQAhBiADQRBqQQFyIgdBB2ohCANAIAMgBEEQaiIFNgJIIAQtAAAiCUEKRg0EIAcgBEEBaikAADcAACAIIARBCGopAAA3AAAgAyAJOgAQIANBEGoQQCEEIANBPGooAgAgBiAEEBsgBkEBaiEGIAUhBCACQXBqIgINAAsMAwsgAUEDOgC8CUEADAQLQaCJwABBI0H0i8AAEMoBAAtBISEGIARBJEkNASAEEAMMAQsgA0FAaxB9IAMoAjwhBgsgAUGYCWoQhAIgAUEBOgC8CUEBCyEBIAAgBjYCBCAAIAFFNgIAIANB0ABqJAALjAUBAn8jAEEQayIEJAAgAAJ/AkAgA0UEQCAAQQA6AAEMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAABBAWsOCQECAwQFBgcICQALIAJBAToAACAEQQA6AAggBEEANgIMDAkLIAJBAjoAACAEQQhqIAFBBGogAkEBaiADQX9qEIEBDAgLIAJBAzoAACAEAn8gA0F/akEETwRAIARBBDYCDCACIAFBBGooAgA2AAFBAAwBCyAEQQA6AAlBAQs6AAgMBwsgAkEEOgAAIAQCfyADQX9qQQhPBEAgBEEINgIMIAIgAUEIaikDADcAAUEADAELIARBADoACUEBCzoACAwGCyACQQU6AAAgBAJ/IANBf2pBBE8EQCAEQQQ2AgwgAiABQQRqKAIANgABQQAMAQsgBEEAOgAJQQELOgAIDAULIAJBBjoAACAEAn8gA0F/akEITwRAIARBCDYCDCACIAFBCGopAwA3AAFBAAwBCyAEQQA6AAlBAQs6AAgMBAsgAkEHOgAAIAQCfyADQX9qQQRPBEAgBEEENgIMIAIgAUEEaigCADYAAUEADAELIARBADoACUEBCzoACAwDCyACQQg6AAAgBAJ/IANBf2pBCE8EQCAEQQg2AgwgAiABQQhqKQMANwABQQAMAQsgBEEAOgAJQQELOgAIDAILIAJBCToAAEEBIQUCQCADQQFGBEAgBEEAOgAJDAELIAIgAS0AAToAASAEQQE2AgxBACEFCyAEIAU6AAgMAQsgAkEKOgAAIARBCGogAUEEaiACQQFqIANBf2oQgQELIAQtAAhFBEAgAEEEaiAEKAIMQQFqNgIAQQAMAgsgACAELQAJOgABC0EBCzoAACAEQRBqJAALgAUBCn8jAEEwayIDJAAgA0EkaiABNgIAIANBAzoAKCADQoCAgICABDcDCCADIAA2AiAgA0EANgIYIANBADYCEAJAAkACQCACKAIIIgpFBEAgAkEUaigCACIERQ0BIAIoAgAhASACKAIQIQAgBEF/akH/////AXFBAWoiByEEA0AgAUEEaigCACIFBEAgAygCICABKAIAIAUgAygCJCgCDBEFAA0ECyAAKAIAIANBCGogAEEEaigCABECAA0DIABBCGohACABQQhqIQEgBEF/aiIEDQALDAELIAJBDGooAgAiAEUNACAAQQV0IQsgAEF/akH///8/cUEBaiEHIAIoAgAhAQNAIAFBBGooAgAiAARAIAMoAiAgASgCACAAIAMoAiQoAgwRBQANAwsgAyAEIApqIgVBHGotAAA6ACggAyAFQQRqKQIAQiCJNwMIIAVBGGooAgAhBiACKAIQIQhBACEJQQAhAAJAAkACQCAFQRRqKAIAQQFrDgIAAgELIAZBA3QgCGoiDCgCBEHeAEcNASAMKAIAKAIAIQYLQQEhAAsgAyAGNgIUIAMgADYCECAFQRBqKAIAIQACQAJAAkAgBUEMaigCAEEBaw4CAAIBCyAAQQN0IAhqIgYoAgRB3gBHDQEgBigCACgCACEAC0EBIQkLIAMgADYCHCADIAk2AhggCCAFKAIAQQN0aiIAKAIAIANBCGogACgCBBECAA0CIAFBCGohASALIARBIGoiBEcNAAsLQQAhACAHIAIoAgRJIgFFDQEgAygCICACKAIAIAdBA3RqQQAgARsiASgCACABKAIEIAMoAiQoAgwRBQBFDQELQQEhAAsgA0EwaiQAIAAL3AQBBn8jAEFAaiIDJAAgA0EIaiABIAIQlgIgAyADKAIIIAMoAgwQlgIgAyADKQMANwMQIANBMGogA0EQahA2AkACQAJAAkACQAJAAkAgAygCMCIGBEAgAygCNCEBIANBPGooAgBFDQUgAg0BQQEhBQwCCyAAQbS4wAA2AgRBACEBDAULIAJBf0wNASACQQEQlQIiBUUNAgsg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EAQiA0EBRhtBACADGyIDQQJHBEAgAEEIOgAAIAAgAzoAAQwBCyACQRhqIAEQBSACKAIYBEAgAisDICEGIABBAzoAACAAQQhqIAY5AwAMAQsgAkEQaiABEAACQCACKAIQIgNFBEAgAkEANgIwDAELIAIgAigCFCIENgJYIAIgBDYCVCACIAM2AlAgAkEIaiACQdAAahDeASACQTBqIAIoAgggAigCDBCLAiACKAIwRQ0AIABBAToAACAAQQRqIAIpAzA3AgAgAEEMaiACQThqKAIANgIADAELAkACQAJAAkAgARAGQQFGDQAgARAHQQFGDQAgAiACQSxqEMMBIAIoAgQhASACKAIARQ0BIABBADoAACABQSRPDQIMAwsgAEEAOgAADAILIAIgATYCPCACQdAAaiACQTxqEJEBIAIoAlBFDQMgAkHIAGogAkHYAGooAgAiAzYCACACIAIpA1AiBTcDQCAAQQxqIAM2AgAgAEEEaiAFNwIAIABBCToAACABQSRJDQELIAEQAwsgAigCLCEBCyABQSRPBEAgARADCyACQeAAaiQADwtBrIHAAEErQYSCwAAQygEAC94DAQN/IwBBgAFrIgEkACABIAA2AhQgAUEwakEANgIAIAFBKGpBADYCACABQoCAgIAgNwMYIAFBGGoQ2gEiACAAKAIAIgJBAWoiAzYCAAJAAkAgAyACSQ0AIAFBCGogABDiASABKAIIIgJB/KjAABCqAiEDIAFB0ABqQfyowAA2AgAgASACNgJMIAEgAzYCSCAAIAAoAgAiAkEBaiIDNgIAIAMgAkkNACABIAAQ4wEgASgCACICQZCpwAAQqgIhAyABQeAAakGQqcAANgIAIAEgAjYCXCABIAM2AlggAUEUaigCACABQcgAaigCACABQdgAaigCABAgIgJBJE8EQCACEAMLIAFBIGoiAiABQdAAaigCADYCACABQSxqIAFB4ABqKAIANgIAIAEgASkDWDcCJCABQfAAaiIDIAIpAwA3AwAgAUH4AGoiAiABQShqKQMANwMAIAEgASkDSDcDaCAAKAIIDQEgAEF/NgIIIABBHGoQgAIgAEEsaiACKQMANwIAIABBJGogAykDADcCACAAIAEpA2g3AhwgACAAKAIIQQFqNgIIIAEoAhQiAkEkTwRAIAIQAwsgAUGAAWokACAADwsAC0HaqMAAQRAgAUEYakHsqMAAQaSqwAAQhAEAC7gDAQd/IwBB0ABrIgMkAEEEIQQCQAJAAkAgAkEETwRAIAMgASgAACIHEG8gA0EANgIQIAMgAykDADcDCCAHBEAgA0EgaiEIIANBOGohBgNAIAQgAksNBCADQTBqIAEgBGogAiAEaxA0IAMtADANAyAIIAYpAQA3AQAgCEEIaiIFIAZBCGopAQA3AQAgAygCSCEJIAYgBSkBADcDACADIAgpAQA3AzAgAygCECIFIAMoAgxGBEAgA0EIaiAFELUBIAMoAhAhBQsgBCAJaiEEIAMoAgggBUEEdGoiCSADKQMwNwMAIAlBCGogBikDADcDACADIAVBAWo2AhAgB0F/aiIHDQALCyAAQQA6AAAgAEEEaiADKQMINwIAIABBEGogBDYCACAAQQxqIANBEGooAgA2AgAMAwsgAEEBOwEADAILIAMtADEhASAAQQE6AAAgACABOgABIAMoAhAiAARAIAMoAgghBCAAQQR0IQADQCAELQAAIgFBfmpBB0kgAUVyRQRAIARBBGoQzwELIARBEGohBCAAQXBqIgANAAsLIANBCGoQzgEMAQsgBCACELECAAsgA0HQAGokAAuDAwEDfwJAAkACQAJAIAFBCU8EQEEQQQgQjAIgAUsNAQwCCyAAECchAwwCC0EQQQgQjAIhAQtBgIB8QQhBCBCMAkEUQQgQjAJqQRBBCBCMAmprQXdxQX1qIgRBAEEQQQgQjAJBAnRrIgIgAiAESxsgAWsgAE0NACABQRAgAEEEakEQQQgQjAJBe2ogAEsbQQgQjAIiBGpBEEEIEIwCakF8ahAnIgJFDQAgAhC6AiEAAkAgAUF/aiIDIAJxRQRAIAAhAQwBCyACIANqQQAgAWtxELoCIQJBEEEIEIwCIQMgABCsAiACQQAgASACIABrIANLG2oiASAAayICayEDIAAQoAJFBEAgASADEOgBIAAgAhDoASAAIAIQNQwBCyAAKAIAIQAgASADNgIEIAEgACACajYCAAsgARCgAg0BIAEQrAIiAkEQQQgQjAIgBGpNDQEgASAEELcCIQAgASAEEOgBIAAgAiAEayIEEOgBIAAgBBA1DAELIAMPCyABELkCIAEQoAIaC7MDAQR/IwBBIGsiAiQAAkACQAJAAkACQAJAIAAtAJgmQQFrDgMDAAIBCwALIABBiBNqIABBiBMQtQIaCyACQRBqIABBiBNqIgMgARByQQMhAQJAIAIoAhAiBEECRiIFDQAgAigCFCEBAkACQAJAIAAtAIgmDgQBAgIAAgsgAEHIHGohAwsgAxDMAQsCQCAERQRAIAIgATYCGCACQSA2AhwgAiAAQZAmaiACQRxqIAJBGGoQsgEgAigCAA0EIAIoAgQiAUEkTwRAIAEQAwsgAigCHCIBQSRPBEAgARADCyACKAIYIgFBJEkNASABEAMMAQsgAiABNgIYIAJBIDYCHCACQQhqIABBlCZqIAJBHGogAkEYahCyASACKAIIDQQgAigCDCIBQSRPBEAgARADCyACKAIcIgFBJE8EQCABEAMLIAIoAhgiAUEkSQ0AIAEQAwsgACgCkCYiAUEkTwRAIAEQAwtBASEBIAAoApQmIgNBJEkNACADEAMLIAAgAToAmCYgAkEgaiQAIAUPC0GgicAAQSNBhInAABDKAQALQdCDwABBFRCrAgALQdCDwABBFRCrAgAL4AICA38CfiMAQUBqIgMkAAJAAkAgAkEITwRAIAEpAAAhByADQShqIAFBCGogAkF4ahBOIAMtAChFDQEgAy0AKSEBIABBAToAACAAIAE6AAEMAgsgAEEBOwEADAELIANBJGogA0E0aigCACIENgEAIAMgAykCLCIGNwEcIANBOGooAgAgA0EQaiAENgIAIAMgBjcDCEEIaiIEIAJNBEAgA0EoaiABIARqIAIgBGsQOiADLQAoRQRAIANBJGogA0E0aigCACIBNgEAIAMgAykCLCIGNwEcIANBOGooAgAhAiAAQSRqIAE2AQAgAEEcaiAGNwEAIABBGGogA0EQaigCADYCACAAQRBqIAMpAwg3AgAgAEEoaiACIARqNgIAIABBCGogBzcDACAAQQA6AAAMAgsgAy0AKSEBIABBAToAACAAIAE6AAEgA0EIahDPAQwBCyAEIAIQsQIACyADQUBrJAALzQIBBn8jAEEwayIBJAAQFiEAIAFBKGoQ6wECQAJAAkAgASgCKEUNACABKAIsIQMQFyEAIAFBIGoQ6wEgASgCICECIAEoAiQgA0EkTwRAIAMQAwsgAkUNACAAIAIbIQMQGCEAIAFBGGoQ6wEgASgCGCECIAEoAhwgA0EkTwRAIAMQAwsgAkUNACAAIAIbIQIQGSEAIAFBEGoQ6wEgASgCFCEDIAEoAhAgAkEkTwRAIAIQAwtBASECDQELIAAQB0EBRw0BQQAhAiAAQSRPBEAgABADCyAAIQMLQfSywABBCxASIgRBIBATIQAgAUEIahDrASABKAIMIAAgASgCCCIFGyEAAkAgBUUEQEEAIQUMAQtBASEFIABBJEkNACAAEAMLIARBJE8EQCAEEAMLQSAgACAFGyEAIAIgA0EjS3FFDQAgAxADCyABQTBqJAAgAAvSAgEDfyMAQRBrIgIkAAJAAn8CQCABQYABTwRAIAJBADYCDCABQYAQTw0BIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECDAILIAAoAggiAyAAQQRqKAIARgRAIAAgAxBcIAAoAgghAwsgACADQQFqNgIIIAAoAgAgA2ogAToAAAwCCyABQYCABE8EQCACIAFBP3FBgAFyOgAPIAIgAUESdkHwAXI6AAwgAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANQQQMAQsgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwshASAAQQRqKAIAIABBCGoiBCgCACIDayABSQRAIAAgAyABEFsgBCgCACEDCyAAKAIAIANqIAJBDGogARC1AhogBCABIANqNgIACyACQRBqJAAL2gICA38BfiMAQSBrIgIkAEEhIQECQAJAAkACQAJAAkACQAJAAkACQCAALQAAQQFrDgkAAQIDBAUGBwgJCyACQRhqIABBDGooAgAiATYCACACIABBBGopAgAiBDcDECAEpyABEAEhASACQRBqEIQCDAgLIABBBGoqAgC7EAIhAQwHCyAAQQhqKwMAEAIhAQwGCyAAQQRqKAIAuBACIQEMBQsgAEEIaikDALoQAiEBDAQLIABBBGooAgC3EAIhAQwDCyAAQQhqKQMAuRACIQEMAgtBIkEjIAAtAAEbIQEMAQsgAkEYaiAAQQxqKAIAIgM2AgAgAiAAQQRqKQIAIgQ3AxAgAkEIaiAEpyIAIAMQwgEgAigCDCEBAkAgAigCCARAIAFBJE8EQCABEAMLIAAgAxABIQEMAQsgACADEAEiAEEkSQ0AIAAQAwsgAkEQahCEAgsgAkEgaiQAIAEL1wIBB38jAEGAAWsiAyQAQQQhBAJAAkACQCACQQRPBEAgAyABKAAAIgYQaSADQQA2AhAgAyADKQMANwMIIAYEQCADQSBqIQcgA0HQAGohCANAIAQgAksNBCADQcgAaiABIARqIAIgBGsQLyADLQBIDQMgByAIQSgQtQIhBSADKAJ4IQkgA0HIAGogBUEoELUCGiADKAIQIgUgAygCDEYEQCADQQhqIAUQtgEgAygCECEFCyAEIAlqIQQgAygCCCAFQShsaiADQcgAakEoELUCGiADIAVBAWo2AhAgBkF/aiIGDQALCyAAQQA6AAAgAEEEaiADKQMINwIAIABBEGogBDYCACAAQQxqIANBEGooAgA2AgAMAwsgAEEBOwEADAILIAMtAEkhASAAQQE6AAAgACABOgABIANBCGoQfCADQQhqENABDAELIAQgAhCxAgALIANBgAFqJAAL1AIBA38jAEEQayICJAACQAJ/AkACQCABQYABTwRAIAJBADYCDCABQYAQSQ0BIAFBgIAETw0CIAIgAUE/cUGAAXI6AA4gAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANQQMMAwsgACgCCCIDIABBBGooAgBGBEAgACADEFwgACgCCCEDCyAAIANBAWo2AgggACgCACADaiABOgAADAMLIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECDAELIAIgAUE/cUGAAXI6AA8gAiABQRJ2QfABcjoADCACIAFBBnZBP3FBgAFyOgAOIAIgAUEMdkE/cUGAAXI6AA1BBAshASAAQQRqKAIAIABBCGoiBCgCACIDayABSQRAIAAgAyABEFsgBCgCACEDCyAAKAIAIANqIAJBDGogARC1AhogBCABIANqNgIACyACQRBqJAALtgIBB38CQCACQQ9NBEAgACEDDAELIABBACAAa0EDcSIEaiEFIAQEQCAAIQMgASEGA0AgAyAGLQAAOgAAIAZBAWohBiADQQFqIgMgBUkNAAsLIAUgAiAEayIIQXxxIgdqIQMCQCABIARqIgRBA3EEQCAHQQFIDQEgBEEDdCICQRhxIQkgBEF8cSIGQQRqIQFBACACa0EYcSECIAYoAgAhBgNAIAUgBiAJdiABKAIAIgYgAnRyNgIAIAFBBGohASAFQQRqIgUgA0kNAAsMAQsgB0EBSA0AIAQhAQNAIAUgASgCADYCACABQQRqIQEgBUEEaiIFIANJDQALCyAIQQNxIQIgBCAHaiEBCyACBEAgAiADaiECA0AgAyABLQAAOgAAIAFBAWohASADQQFqIgMgAkkNAAsLIAALtwICBX8BfiMAQTBrIgQkAEEnIQICQCAAQpDOAFQEQCAAIQcMAQsDQCAEQQlqIAJqIgNBfGogACAAQpDOAIAiB0KQzgB+faciBUH//wNxQeQAbiIGQQF0Qfu6wABqLwAAOwAAIANBfmogBSAGQeQAbGtB//8DcUEBdEH7usAAai8AADsAACACQXxqIQIgAEL/wdcvViAHIQANAAsLIAenIgNB4wBLBEAgAkF+aiICIARBCWpqIAenIgMgA0H//wNxQeQAbiIDQeQAbGtB//8DcUEBdEH7usAAai8AADsAAAsCQCADQQpPBEAgAkF+aiICIARBCWpqIANBAXRB+7rAAGovAAA7AAAMAQsgAkF/aiICIARBCWpqIANBMGo6AAALIAEgBEEJaiACakEnIAJrEC0gBEEwaiQAC+ACAQF/IwBBEGsiBCQAAkAgA0UEQCAAQQE7AQAMAQsCQAJAAkACQAJAAkACQAJAAkAgASgCAEEBaw4HAQIDBAUGBwALIAJBAToAACAEQQhqIAFBCGogAkEBaiADQX9qEFgMBwsgAkECOgAAIARBCGogAUEIaiACQQFqIANBf2oQgAEMBgsgAkEDOgAAIARBADoACCAEQQA2AgwMBQsgAkEEOgAAIARBADoACCAEQQA2AgwMBAsgAkEFOgAAIARBCGogAUEEaiACQQFqIANBf2oQgQEMAwsgAkEGOgAAIARBADoACCAEQQA2AgwMAgsgAkEHOgAAIABBgQI7AQAMAgsgAkEIOgAAIARBCGogAUEEaiACQQFqIANBf2oQVgsgBC0ACEUEQCAEKAIMIQEgAEEAOgAAIABBBGogAUEBajYCAAwBCyAELQAJIQEgAEEBOgAAIAAgAToAAQsgBEEQaiQAC6cCAQV/IABCADcCECAAAn9BACABQYACSQ0AGkEfIAFB////B0sNABogAUEGIAFBCHZnIgJrdkEBcSACQQF0a0E+agsiAjYCHCACQQJ0QYDEwABqIQMgACEEAkACQAJAAkBB9MHAACgCACIFQQEgAnQiBnEEQCADKAIAIQMgAhCGAiECIAMQrAIgAUcNASADIQIMAgtB9MHAACAFIAZyNgIAIAMgADYCAAwDCyABIAJ0IQUDQCADIAVBHXZBBHFqQRBqIgYoAgAiAkUNAiAFQQF0IQUgAiIDEKwCIAFHDQALCyACKAIIIgEgBDYCDCACIAQ2AgggBCACNgIMIAQgATYCCCAAQQA2AhgPCyAGIAA2AgALIAAgAzYCGCAEIAQ2AgggBCAENgIMC7YCAQV/IAAoAhghBAJAAkAgACAAKAIMRgRAIABBFEEQIABBFGoiASgCACIDG2ooAgAiAg0BQQAhAQwCCyAAKAIIIgIgACgCDCIBNgIMIAEgAjYCCAwBCyABIABBEGogAxshAwNAIAMhBSACIgFBFGoiAygCACICRQRAIAFBEGohAyABKAIQIQILIAINAAsgBUEANgIACwJAIARFDQACQCAAIAAoAhxBAnRBgMTAAGoiAigCAEcEQCAEQRBBFCAEKAIQIABGG2ogATYCACABDQEMAgsgAiABNgIAIAENAEH0wcAAQfTBwAAoAgBBfiAAKAIcd3E2AgAPCyABIAQ2AhggACgCECICBEAgASACNgIQIAIgATYCGAsgAEEUaigCACIARQ0AIAFBFGogADYCACAAIAE2AhgLC6UCAQd/IwBBIGsiAyQAAkACQAJAIAEoAgQgAk8EQCADQQhqIAEQrgEgAygCECIGRQ0CIAJBAnQhBSADKAIMIQggAygCCCEHQQQhBCACIAJB/////wNxIglHBEBBACEECyAFRQRAIAgEQCAHECsLQQAhBSACIAlHDQQMAgsCQAJAIAQgBkcEQCAFIAQQlQIiBkUNAiAGIAcgBRC1AiEEIAgNAQwECyAHIAggBiAFEI0CIgQNAyAGIQQMBQsgBxArDAILDAMLIANBHGpBADYCACADQbS0wAA2AhggA0IBNwIMIANBpLXAADYCCCADQQhqQay1wAAQ1wEACyABIAI2AgQgASAENgIAC0GBgICAeCEECyAAIAQ2AgQgACAFNgIAIANBIGokAAucAgECfyMAQRBrIgIkAAJAIAAoAgAiACACQQxqAn8CQAJAIAFBgAFPBEAgAkEANgIMIAFBgBBJDQEgAUGAgARPDQIgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwDCyAAKAIIIgMgACgCBEYEfyAAIAMQtAEgACgCCAUgAwsgACgCAGogAToAACAAIAAoAghBAWo2AggMAwsgAiABQT9xQYABcjoADSACIAFBBnZBwAFyOgAMQQIMAQsgAiABQT9xQYABcjoADyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEECxCYAgsgAkEQaiQAQQALbwEMf0GgxcAAKAIAIgJFBEBBsMXAAEH/HzYCAEEADwtBmMXAACEGA0AgAiIBKAIIIQIgASgCBCEDIAEoAgAhBCABQQxqKAIAGiABIQYgBUEBaiEFIAINAAtBsMXAACAFQf8fIAVB/x9LGzYCACAIC5cCAQJ/IwBBEGsiAiQAAkAgACACQQxqAn8CQAJAIAFBgAFPBEAgAkEANgIMIAFBgBBJDQEgAUGAgARPDQIgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwDCyAAKAIIIgMgACgCBEYEfyAAIAMQtAEgACgCCAUgAwsgACgCAGogAToAACAAIAAoAghBAWo2AggMAwsgAiABQT9xQYABcjoADSACIAFBBnZBwAFyOgAMQQIMAQsgAiABQT9xQYABcjoADyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEECxCYAgsgAkEQaiQAQQALqQIBBX8jAEEQayIDJAAgACgCACIAQRxqQQA6AAACQCAAKAIIIgVB/////wdJBEACQCAAQRhqKAIAQX9qIABBEGooAgAiBiAAQQxqKAIAIgJrcSIERQ0AIAUNAiAAQX82AggCQCACIAZGDQADQCAAIAAoAhhBf2ogAkEBanE2AgwgACgCFCACQQJ0aigCACICRQ0BIABBADYCCCADIAI2AgQgAkEIahBuIANBBGoQeiAEQX9qIgRFDQIgACgCCA0EIABBfzYCCCAAKAIMIgIgACgCEEcNAAsLIABBADYCCAsgAUEkTwRAIAEQAwsgA0EQaiQADwtBsK/AAEEYIANBCGpByK/AAEHQsMAAEIQBAAtBoK/AAEEQIANBCGpB2K/AAEHgsMAAEIQBAAuLAgIEfwF+IwBBMGsiAiQAIAFBBGohBCABKAIERQRAIAEoAgAhAyACQRBqIgVBADYCACACQgE3AwggAiACQQhqNgIUIAJBKGogA0EQaikCADcDACACQSBqIANBCGopAgA3AwAgAiADKQIANwMYIAJBFGpB7LXAACACQRhqEDIaIARBCGogBSgCADYCACAEIAIpAwg3AgALIAJBIGoiAyAEQQhqKAIANgIAIAFBDGpBADYCACAEKQIAIQYgAUIBNwIEIAIgBjcDGEEMQQQQlQIiAUUEQEEMQQQQsAIACyABIAIpAxg3AgAgAUEIaiADKAIANgIAIABB1LfAADYCBCAAIAE2AgAgAkEwaiQAC+8BAQR/IwBBIGsiAyQAAkACQCAAAn8gAkEETwRAIAEoAAAiBEEEaiEFIARBe0sNAiAFIAJLDQMgA0EQaiABQQRqIAQQMwJAIAMoAhBFBEAgAygCFCEGIANBCGogA0EYaigCACICEH8gAygCDCEBIAMoAggiBCAGIAIQtQIaDAELIANBHGooAgAhAiADQRhqKAIAIQEgAygCFCEECyAAQRBqIAU2AgAgAEEMaiACNgIAIABBCGogATYCACAAQQRqIAQ2AgBBAAwBCyAAQQA6AAFBAQs6AAAgA0EgaiQADwtBBCAFELMCAAsgBSACELICAAv6AQIDfwF+IwBBMGsiASQAAkAgAARAIAApAgAhBCAAQQA2AgAgAUEoaiICIABBEGooAgA2AgAgAUEgaiIDIABBCGopAgA3AwAgASAENwMYIASnBEAgAUEQaiACKAIANgIAIAFBCGogAykDADcDACABIAEpAxg3AwAMAgsgAUEYahDkAQsgARBTC0GgwcAAKQIAIQRBoMHAACABKQMANwIAIAFBKGpBsMHAACgCADYCACABQSBqQajBwAApAgA3AwBBqMHAACABQQhqKQMANwIAQbDBwAAgAUEQaigCADYCACABIAQ3AxggAUEYahDkASABQTBqJABBoMHAAAv4AQEEfyMAQSBrIgMkACAAAn8CQAJAAkAgASgCBCACTwRAIANBCGogARDdASADKAIQIgRFDQMgAygCDCEFIAMoAgghBgJAAkACQCACRQRAQQEhBCAFDQEMBgsgBEEBRg0BIAJBARCVAiIERQ0CIAQgBiACELUCGiAFRQ0FCyAGECsMBAsgBiAFQQEgAhCNAiIEDQMMAgsMAQsgA0EcakEANgIAIANBtLTAADYCGCADQgE3AgwgA0GktcAANgIIIANBCGpBrLXAABDXAQALQQEMAgsgASACNgIEIAEgBDYCAAtBgYCAgHgLNgIEIAAgAjYCACADQSBqJAAL/AEBAX8jAEHAHGsiBCQAIAQgATYCwAkgBCABNgK8CSAEIAA2ArgJIARBEGogBEG4CWoQ3gEgBEGoCWogBCgCECAEKAIUEIsCIAQgAzYCwAkgBCADNgK8CSAEIAI2ArgJIARBCGogBEG4CWoQ3wEgBCgCCCEBIAQoAgwhACAEQcASaiAEQbAJaigCADYCACAEIAQpA6gJNwO4EiAEQRhqIARBuAlqQYwJELUCGiAEQbgJaiAEQRhqQYwJELUCGiAEQcwSaiAANgIAIARByBJqIAA2AgAgBEEAOgC4HCAEQQA6APQSIAQgATYCxBIgBEG4CWoQxgEgBEHAHGokAAvJAQIDfwF+IwBBMGsiAyQAIAACf0EAIAJBAWoiBCACSQ0AGiABKAIEQQF0IgIgBCACIARLGyICQQQgAkEESxsiAq1CKH4iBqchBUEIIQQgA0EgaiABEKIBIANBEGogBUEAIAQgBkIgiKcbIANBIGoQZiADKAIQRQRAIAMoAhQhBCABIAI2AgQgASAENgIAQYGAgIB4DAELIANBCGogAygCFCADQRhqKAIAEJYCIAMoAgghBCADKAIMCzYCBCAAIAQ2AgAgA0EwaiQAC9wBAQV/IwBBIGsiASQAIAEQcCABQRBqQQA2AgAgAUEUaiABKQMANwIAIAFBADoAHCABQgA3AwggAUEIahC4ASEDIAFBIDYCCCABQQhqKAIAEB4hBSADIAMoAgAiAkEBaiIENgIAAkAgBCACTwRAQQRBBBCVAiICRQ0BIAIgAzYCACACQYCxwAAQqgIhBCAAQRBqQYCxwAA2AgAgAEEMaiACNgIAIAAgBDYCCCAAIAU2AgQgACADNgIAIAEoAggiAEEkTwRAIAAQAwsgAUEgaiQADwsAC0EEQQQQsAIAC8kBAQN/IwBBMGsiAyQAIAACf0EAIAJBAWoiBCACSQ0AGiABKAIEQQF0IgIgBCACIARLGyICQQQgAkEESxsiBEEEdCEFQQghAiADQSBqIAEQrAEgA0EQaiAFQQAgAiAEIARB/////wBxRxsgA0EgahBmIAMoAhBFBEAgAygCFCECIAEgBDYCBCABIAI2AgBBgYCAgHgMAQsgA0EIaiADKAIUIANBGGooAgAQlgIgAygCCCEEIAMoAgwLNgIEIAAgBDYCACADQTBqJAAL3wECAn8BfiMAQSBrIgMkACAAKAIARQRAIABBfzYCACADQRhqIABBJGopAgA3AwAgA0EQaiAAQRxqKQIANwMAIABBFGopAgAhBSAAQRhqQQA2AgAgAyAFNwMIIANBCGoQgAICQCAAKAIEQQJGDQAgAEEEaigCBCIEQSRJDQAgBBADCyAAIAI2AgggACABNgIEIAAoAhAhASAAQQA2AhAgACAAKAIAQQFqNgIAIAEEQCAAKAIMIAEoAgQRAQALIANBIGokAA8LQdqowABBECADQQhqQeyowABBtKrAABCEAQALtgEBA38jAEEQayIFJAACQCADQQNLBEAgAiABKAIIIgY2AABBBCEEIAACfwJAIAYEQCABKAIAIQEgBkEobCEGA0AgBCADSw0FIAVBCGogASACIARqIAMgBGsQRSAFLQAIDQIgAUEoaiEBIAUoAgwgBGohBCAGQVhqIgYNAAsLIABBBGogBDYCAEEADAELIAAgBS0ACToAAUEBCzoAACAFQRBqJAAPC0EEIAMQsgIACyAEIAMQsQIAC7YBAQN/IwBBEGsiBSQAAkAgA0EDSwRAIAIgASgCCCIGNgAAQQQhBCAAAn8CQCAGBEAgASgCACEBIAZBBHQhBgNAIAQgA0sNBSAFQQhqIAEgAiAEaiADIARrEDEgBS0ACA0CIAFBEGohASAFKAIMIARqIQQgBkFwaiIGDQALCyAAQQRqIAQ2AgBBAAwBCyAAIAUtAAk6AAFBAQs6AAAgBUEQaiQADwtBBCADELICAAsgBCADELECAAvAAQECfyMAQRBrIgQkACAAAn8CQAJAAkAgA0EITwRAIAIgASkDADcAACAEQQhqIAFBCGogAkEIaiADQXhqEIEBIAQtAAgNAiAEKAIMQQhqIgUgA0sNASAEQQhqIAFBFGogAiAFaiADIAVrEFcgBC0ACEUEQCAAQQRqIAQoAgwgBWo2AgBBAAwFCyAAIAQtAAk6AAEMAwsgAEEAOgABDAILIAUgAxCxAgALIAAgBC0ACToAAQtBAQs6AAAgBEEQaiQAC8cBAQF/AkACQAJAIAAtALwJDgQBAgIAAgsCQAJAAkACQAJAIAAtAGwOBQMEBAABBAsgAEHwCGoQbQwBCyAAQfwIahBtIAAoAvAIIgFBJEkNACABEAMLIAAoAmQiAUEkTwRAIAEQAwsgACgCYCIBQSRPBEAgARADCyAAQdQAahCEAiAAKAJQIgFBJE8EQCABEAMLIABBKGoQmgEMAQsgABCaAQsgAEGYCWoQhAIPCyAAQYAJahCEAiAAQYwJaiIAEMQBIAAQzQELC7QBAQJ/IwBBIGsiBCQAIAACf0EAIAIgA2oiAyACSQ0AGiABKAIEIgJBAXQiBSADIAUgA0sbIgNBCCADQQhLGyEDIAQgAgR/IAQgAjYCFCAEIAEoAgA2AhBBAQVBAAs2AhggBCADQQEgBEEQahBmIAQoAgBFBEAgBCgCBCECIAEgAzYCBCABIAI2AgBBgYCAgHgMAQsgBCgCBCEDIARBCGooAgALNgIEIAAgAzYCACAEQSBqJAALrgEBAn8jAEEgayIDJAACQCABIAJqIgIgAUkNACAAQQRqKAIAIgFBAXQiBCACIAQgAksbIgJBCCACQQhLGyEEIAMgAQR/IAMgATYCFCADIAAoAgA2AhBBAQVBAAs2AhggAyAEIANBEGoQZyADKAIABEAgA0EIaigCACIARQ0BIAMoAgQgABCwAgALIAMoAgQhASAAQQRqIAQ2AgAgACABNgIAIANBIGokAA8LENYBAAuuAQEDfyMAQSBrIgIkAAJAIAFBAWoiAyABSQ0AIABBBGooAgAiAUEBdCIEIAMgBCADSxsiA0EIIANBCEsbIQMgAiABBH8gAiABNgIUIAIgACgCADYCEEEBBUEACzYCGCACIAMgAkEQahBnIAIoAgAEQCACQQhqKAIAIgBFDQEgAigCBCAAELACAAsgAigCBCEBIABBBGogAzYCACAAIAE2AgAgAkEgaiQADwsQ1gEAC+8BAQN/IwBBIGsiBSQAQezBwABB7MHAACgCACIHQQFqNgIAQbTFwABBtMXAACgCAEEBaiIGNgIAAkACQCAHQQBIIAZBAktyDQAgBSAEOgAYIAUgAzYCFCAFIAI2AhBB4MHAACgCACICQX9MDQBB4MHAACACQQFqIgI2AgBB4MHAAEHowcAAKAIAIgMEf0HkwcAAKAIAIAUgACABKAIQEQAAIAUgBSkDADcDCCAFQQhqIAMoAhQRAABB4MHAACgCAAUgAgtBf2o2AgAgBkEBSw0AIAQNAQsACyMAQRBrIgIkACACIAE2AgwgAiAANgIIAAu9AQIBfwJ+IwBBMGsiAyQAAkACQCACQQhPBEAgASkAACEEIANBGGogAUEIaiACQXhqEDogAy0AGA0BIANBFGogA0EkaigCACIBNgEAIAMgAykCHCIFNwEMIANBKGooAgAhAiAAQRhqIAE2AQAgAEEQaiAFNwEAIABBIGogAkEIajYCACAAQQhqIAQ3AwAgAEEAOgAADAILIABBATsBAAwBCyADLQAZIQEgAEEBOgAAIAAgAToAAQsgA0EwaiQAC50BAQN/AkAgAUEPTQRAIAAhAgwBCyAAQQAgAGtBA3EiBGohAyAEBEAgACECA0AgAkEAOgAAIAJBAWoiAiADSQ0ACwsgAyABIARrIgFBfHEiBGohAiAEQQFOBEADQCADQQA2AgAgA0EEaiIDIAJJDQALCyABQQNxIQELIAEEQCABIAJqIQEDQCACQQA6AAAgAkEBaiICIAFJDQALCyAAC8oBAgR/AX4jAEEQayIDJAAgASgCACIBKAIIRQRAIAFBDGopAgAhByABQv////8vNwIIIAEgB6ciBUECRgR/IAMgAigCACICKAIAIAIoAgQoAgARAAAgAygCACECIAMoAgQhBCABKAIYIgYEQCABKAIUIAYoAgwRAQALIAEgBDYCGCABIAI2AhQgASgCCEEBagUgBAs2AgggACAHQiCIPgIEIAAgBTYCACADQRBqJAAPC0HaqMAAQRAgA0EIakHsqMAAQcSqwAAQhAEAC6kBAQF/IwBBMGsiBCQAIAACf0EAIAIgA2oiAyACSQ0AGkEEIQIgBEEgaiABEK4BIARBEGogA0ECdEEAIAIgAyADQf////8DcUcbIARBIGoQZiAEKAIQRQRAIAQoAhQhAiABIAM2AgQgASACNgIAQYGAgIB4DAELIARBCGogBCgCFCAEQRhqKAIAEJYCIAQoAgghAyAEKAIMCzYCBCAAIAM2AgAgBEEwaiQAC70BAQJ/IwBBkBNrIgMkACAAKAIAIgAtALwJIQQgAEEEOgC8CQJAIARBBEcEQCADQdAJaiAAQbwJELUCGiADQQVqIABBvQlqQcsJELUCGkGgJkEIEJUCIgBFDQEgACADQdAJakG8CRC1AiIAIAQ6ALwJIABBvQlqIANBBWpBywkQtQIaIABBADoAmCYgACACNgKUJiAAIAE2ApAmIAAQayADQZATaiQADwtBgI3AAEEVEKsCAAtBoCZBCBCwAgALpwEBBX8gAEEIaiAAQQxqIgEoAgAiAiACEKABIAEoAgAiBSACQQF0RgRAIAAoAgAiAyAAKAIEIgFLBEAgASACIANrIgRPBEAgACgCCCICIAUgBGsiAUECdGogAiADQQJ0aiAEQQJ0ELUCGiAAIAE2AgAPCyAAKAIIIgMgAkECdGogAyABQQJ0ELUCGiAAIAEgAmo2AgQLDwtB4q7AAEErQZCvwAAQygEAC6wBAQN/IwBBMGsiAiQAIAFBBGohAyABKAIERQRAIAEoAgAhASACQRBqIgRBADYCACACQgE3AwggAiACQQhqNgIUIAJBKGogAUEQaikCADcDACACQSBqIAFBCGopAgA3AwAgAiABKQIANwMYIAJBFGpB7LXAACACQRhqEDIaIANBCGogBCgCADYCACADIAIpAwg3AgALIABB1LfAADYCBCAAIAM2AgAgAkEwaiQAC74BAQF/IwBBIGsiAiQAAn8CQAJAAkAgAC0AAEEBaw4CAQIACyACQRxqQQA2AgAgAkHQkMAANgIYIAJCATcCDCACQfiQwAA2AgggASACQQhqEI8BDAILIAJBHGpBADYCACACQdCQwAA2AhggAkIBNwIMIAJB7JDAADYCCCABIAJBCGoQjwEMAQsgAkEcakEANgIAIAJB0JDAADYCGCACQgE3AgwgAkHckMAANgIIIAEgAkEIahCPAQsgAkEgaiQAC6kBAQJ/AkACQAJAIAIEQEEBIQQgAUEATg0BDAILIAAgATYCBEEBIQQMAQsCQAJAAkACQCADKAIIBEAgAygCBCIFRQRAIAENAgwECyADKAIAIAUgAiABEI0CIgNFDQIMBAsgAUUNAgsgASACEJUCIgMNAgsgACABNgIEIAIhAQwDCyACIQMLIAAgAzYCBEEAIQQMAQtBACEBCyAAIAQ2AgAgAEEIaiABNgIAC5ABAQJ/AkACfwJAAkACQAJ/QQEiAyABQQBIDQAaIAIoAghFDQIgAigCBCIEDQEgAQ0DQQEMBAshA0EAIQEMBAsgAigCACAEQQEgARCNAgwCCyABDQBBAQwBCyABQQEQlQILIgIEQCAAIAI2AgRBACEDDAELIAAgATYCBEEBIQELIAAgAzYCACAAQQhqIAE2AgALnAEBAX8CQAJAAkACQAJAIAAtAGwOBQMEBAABBAsgAEHwCGoQbQwBCyAAQfwIahBtIABB8AhqKAIAIgFBJEkNACABEAMLIABB5ABqKAIAIgFBJE8EQCABEAMLIABB4ABqKAIAIgFBJE8EQCABEAMLIABB1ABqEIQCIABB0ABqKAIAIgFBJE8EQCABEAMLIABBKGoQmgEPCyAAEJoBCwuHAQIDfwF+IwBBEGsiAiQAAkAgAUUEQEEIIQMMAQsCQCABrUIofiIFQiCIp0UEQAJAIAWnIgRBf0wEQCACQQhqIAFBABCWAiACKAIMQYGAgIB4Rw0BCyAEQQgQlQIiAw0DDAILCxDWAQALIARBCBCwAgALIAAgATYCBCAAIAM2AgAgAkEQaiQAC5gBAQF/IwBBIGsiASQAIAFB1qjAAEEEEAE2AhggAUECOgAQIAFBCGogAUEQahCxASABIAEoAgggASgCDBABNgIcIAFBEGogACABQRhqIAFBHGoQngEgASgCHCIAQSRPBEAgABADCyABKAIYIgBBJE8EQCAAEAMLAkAgAS0AEEUNACABKAIUIgBBJEkNACAAEAMLIAFBIGokAAupAQEEfyMAQSBrIgIkACACQgA3AwggAkEBOgAcIAJBCGoQuAEiASABKAIAIgNBAWoiBDYCAAJAIAQgA08EQCABKAIIDQEgAUF/NgIIIAFBDGoQuwEgAUG0rcAANgIYIAEgAUEIajYCFCABQfyHwAA2AhAgASAANgIMIAFBADYCCCABELMBIAJBIGokAA8LAAtBjKzAAEEQIAJBCGpBnKzAAEGgrcAAEIQBAAuSAQEEfyMAQRBrIgEkACABIAAoAgggAEEMaigCACAAKAIEIAAoAgAQdyABQQxqKAIAIQQgASgCCCEAIAEoAgQiAwRAIAEoAgAhAiADQQJ0IQMDQCACEHogAkEEaiECIANBfGoiAw0ACwsgBARAIARBAnQhAgNAIAAQeiAAQQRqIQAgAkF8aiICDQALCyABQRBqJAALkQEBAX8gACgCACIAIAAoAgBBf2oiATYCAAJAIAENAAJAIABBDGooAgBBAkYNACAAQRBqKAIAIgFBJEkNACABEAMLIABBGGooAgAiAQRAIABBFGooAgAgASgCDBEBAAsgAEEgaigCAARAIABBHGoQ1AEgAEEoahDUAQsgACAAKAIEQX9qIgE2AgQgAQ0AIAAQKwsLmwEBA38jAEEQayIBJAAgACgCAEUEQCAAQX82AgAgACAAKAIEIgMEfyAAQQA6ABQgASAAQQRqIgJBACADGyIDQQhqNgIEIAMoAgAgAUEEaiADKAIEKAIMEQIARQRAIAIQuwEgAkEANgIACyAAKAIAQQFqBSACCzYCACABQRBqJAAPC0GMrMAAQRAgAUEIakGcrMAAQcStwAAQhAEAC4YBAQN/IwBBEGsiAiQAAkAgAUUEQEEIIQMMAQsCQCABIAFB/////wBxRgRAAkAgAUEEdCIEQX9MBEAgAkEIaiABQQAQlgIgAigCDEGBgICAeEcNAQsgBEEIEJUCIgMNAwwCCwsQ1gEACyAEQQgQsAIACyAAIAE2AgQgACADNgIAIAJBEGokAAs3AQJ/IwBBEGsiASQAQSBBBBCVAiICRQRAQSBBBBCwAgALIABBCDYCBCAAIAI2AgAgAUEQaiQAC5MBAQF/IwBBkAhrIgMkACADQQhqQYAIELYCGiADQYgIaiABIANBCGpBgAgQRQJAAkAgAy0AiAhFBEAgAygCjAgiAUGBCE8NAiADQQhqIAEgAhCbASEBIABBADoAACAAQQRqIAE2AgAMAQsgAy0AiQghASAAQQE6AAAgACABOgABCyADQZAIaiQADwsgAUGACBCyAgALoAEBA38jAEEQayIDJAACfwJAAkACQAJAAkAgAS0AgBNBAWsOAwMAAgELAAsgAUHACWogAUHACRC1AhoLIANBCGogAUHACWoiBCACEDAgAygCCEUNAUEDIQRBAgwCC0GgicAAQSNBhIzAABDKAQALIAMoAgwhBSAEEMwBQQEhBEEACyECIAEgBDoAgBMgACAFNgIEIAAgAjYCACADQRBqJAALhAEBAX8jAEEQayICJAAgAkHMqMAAQQQQATYCCCACIAEEfyABKAIAEAwFQSALNgIMIAIgACACQQhqIAJBDGoQngEgAigCDCIAQSRPBEAgABADCyACKAIIIgBBJE8EQCAAEAMLAkAgAi0AAEUNACACKAIEIgBBJEkNACAAEAMLIAJBEGokAAuKAQEBfyMAQdAAayIBJAAgASAAOgAPIAFBADYCGCABQgE3AxAgAUEgaiABQRBqQYCAwAAQ5QEgAUEPaiABQSBqEIUBBEBBmIDAAEE3IAFByABqQdiBwABBnIHAABCEAQALIAFBKGogAUEYaigCADYCACABIAEpAxA3AyAgAUEgahCCAiABQdAAaiQAC4oBAQF/IwBB0ABrIgEkACABIAA6AA8gAUEANgIYIAFCATcDECABQSBqIAFBEGpBgIDAABDlASABQQ9qIAFBIGoQhgEEQEGYgMAAQTcgAUHIAGpB2IHAAEGcgcAAEIQBAAsgAUEoaiABQRhqKAIANgIAIAEgASkDEDcDICABQSBqEIICIAFB0ABqJAALlQEBA38jAEEQayIDJAAgACgCACICKAIIRQRAIAJBfzYCCCACQQxqIAEQnQEgAkEcaiIBLQAAIQQgAUEBOgAAIAIgAigCCEEBajYCCAJAIARBAXENACAAQQRqKAIAIABBCGooAgAQHyIAQSRJDQAgABADCyADQRBqJAAPC0Ggr8AAQRAgA0EIakHYr8AAQfCwwAAQhAEAC40BAQF/IwBBEGsiBSQAAkACQCAEIANLBEAgAiAESQ0CIAAgASAEQQJ0ajYCACACIARrIQQMAQsgBUEIaiABIAIgBCADEMEBIAUoAgwhBCAAIAUoAgg2AgBBACEDCyAAIAE2AgggACAENgIEIABBDGogAzYCACAFQRBqJAAPC0GUscAAQSNBsLLAABDKAQALngEBAn8jAEEQayIDJAAgAEEUaigCACEEAkACfwJAAkAgAEEEaigCAA4CAAEDCyAEDQJBACEAQYS2wAAMAQsgBA0BIAAoAgAiBCgCBCEAIAQoAgALIQQgAyAANgIEIAMgBDYCACADQYi4wAAgASgCCCACIAEtABAQXQALIANBADYCBCADIAA2AgAgA0H0t8AAIAEoAgggAiABLQAQEF0AC1MBA38gAUEDbiICQf////8DcSACRyEDIAJBAnQhBAJAIAEgAkEDbGtFBEAgBCEBDAELIAMgBEEEaiIBIARJciEDCyAAIAE2AgQgACADQQFzNgIAC4UBAQF/IAAoAgAiACAAKAIAQX9qIgE2AgACQCABDQAgAEEMaigCACIBBEAgASAAQRBqIgEoAgAoAgARAQAgASgCACIBKAIEBEAgASgCCBogACgCDBArCyAAQRRqKAIAIABBGGooAgAoAgwRAQALIAAgACgCBEF/aiIBNgIEIAENACAAECsLC4QBAQF/IwBBIGsiBiQAIAEEQCAGIAEgAyAEIAUgAigCEBEHACAGQRhqIAZBCGooAgAiATYCACAGIAYpAwA3AxAgBigCFCABSwRAIAZBEGogARC9ASAGKAIYIQELIAYoAhAhAiAAIAE2AgQgACACNgIAIAZBIGokAA8LQby1wABBMBCrAgALjwEBAn8gACgCCCICBEAgACgCACEAIAJBKGwhAgNAAkACQAJAAkACQCAAKAIADgcBAgQEAwQEAAsgAEEEaiIBEHwgARDQAQwDCyAAQRBqEM8BIABBHGoiARCoASABEM4BDAILIABBEGoiARCoASABEM4BDAELIABBBGoQzwELIABBKGohACACQVhqIgINAAsLC3IBBH8jAEEQayIDJAAgACgCDCAAKAIIIgFrIgIEQCACQQR2QQR0IQIDQCABLQAAIgRBfmpBB0kgBEVyRQRAIAFBBGoQhAILIAFBEGohASACQXBqIgINAAsLIAMgACkCADcDCCADQQhqEM4BIANBEGokAAuJAQECfyABQQhqKAIAIQIgASgCBCEDAkACQAJAIAEoAgBFBEACQCACRQRAQQEhAQwBCyACQX9MDQMgAkEBEJUCIgFFDQQLIAAgASADIAIQtQI2AgAgAiEBDAELIAFBDGooAgAhASAAIAM2AgALIAAgATYCCCAAIAI2AgQPCxDWAQALIAJBARCwAgALbQECfyMAQRBrIgIkAAJAIAFFBEBBASEDDAELAkAgAUF/TARAIAJBCGogAUEAEJYCIAIoAgxBgYCAgHhHDQELIAFBARCVAiIDDQEgAUEBELACAAsQ1gEACyAAIAE2AgQgACADNgIAIAJBEGokAAt5AQF/IwBBEGsiBCQAIAACfwJAIANBCE8EQCACIAEpAwA3AAAgBEEIaiABQQhqIAJBCGogA0F4ahBXIAQtAAhFBEAgAEEEaiAEKAIMQQhqNgIAQQAMAwsgACAELQAJOgABDAELIABBADoAAQtBAQs6AAAgBEEQaiQAC3UBAn8CQAJAIAACfyABKAIIIgRBBGoiBSADTQRAIANBA00NAiABKAIAIQEgAiAENgAAIARBfE8NAyACQQRqIAEgBBC1AhogAEEEaiAFNgIAQQAMAQsgAEEAOgABQQELOgAADwtBBCADELICAAtBBCAFELMCAAt+AQF/IwBBEGsiASQAIAFB0KjAAEEGEAE2AgggAUGcisAAQQQQATYCDCABIAAgAUEIaiABQQxqEJ4BIAEoAgwiAEEkTwRAIAAQAwsgASgCCCIAQSRPBEAgABADCwJAIAEtAABFDQAgASgCBCIAQSRJDQAgABADCyABQRBqJAALfAEBfgJAAkAgAEUNACAAKQIAIQEgAEEANgIAIAFCIIinIQACQCABpw4CAQIACyAAQSRJDQAgABADCxA+IQALQbTBwAApAgAhAUG4wcAAIAA2AgBBtMHAAEEBNgIAAkAgAadFDQAgAUIgiKciAEEkSQ0AIAAQAwtBuMHAAAuAAQEBfyMAQUBqIgUkACAFIAE2AgwgBSAANgIIIAUgAzYCFCAFIAI2AhAgBUEsakECNgIAIAVBPGpB4AA2AgAgBUICNwIcIAVB6LrAADYCGCAFQd8ANgI0IAUgBUEwajYCKCAFIAVBEGo2AjggBSAFQQhqNgIwIAVBGGogBBDXAQALgAEBAX8jAEEgayICJAACfyAALQAARQRAIAJBHGpBADYCACACQdCOwAA2AhggAkIBNwIMIAJBjI/AADYCCCABIAJBCGoQjwEMAQsgAkEcakEANgIAIAJB0I7AADYCGCACQgE3AgwgAkHojsAANgIIIAEgAkEIahCPAQsgAkEgaiQAC4ABAQF/IwBBIGsiAiQAAn8gAC0AAEUEQCACQRxqQQA2AgAgAkHQjsAANgIYIAJCATcCDCACQdCPwAA2AgggASACQQhqEI8BDAELIAJBHGpBADYCACACQdCOwAA2AhggAkIBNwIMIAJBrI/AADYCCCABIAJBCGoQjwELIAJBIGokAAt8AQF/IAAtAAQhASAALQAFBEAgAUH/AXEhASAAAn9BASABDQAaIAAoAgAiAS0AAEEEcUUEQCABKAIYQfm6wABBAiABQRxqKAIAKAIMEQUADAELIAEoAhhB+LrAAEEBIAFBHGooAgAoAgwRBQALIgE6AAQLIAFB/wFxQQBHC2wBAX8jAEGQCGsiAyQAIANBgAgQtgIiA0GACGogASACIAMQJgJAAkAgAygCgAhFBEAgAygChAgiAUGBCE8NAiAAIAMgARAvDAELIABBAToAACAAQQE6AAELIANBkAhqJAAPCyABQYAIELICAAtmAQR/IwBBEGsiAiQAIAAoAgwgACgCCCIDayIBBEAgAUECdkECdCEBA0AgAygCACIEQSRPBEAgBBADCyADQQRqIQMgAUF8aiIBDQALCyACIAApAgA3AwggAkEIahDNASACQRBqJAALfAEDfyAAIAAQuQIiAEEIEIwCIABrIgIQtwIhAEGExcAAIAEgAmsiATYCAEGMxcAAIAA2AgAgACABQQFyNgIEQQhBCBCMAiECQRRBCBCMAiEDQRBBCBCMAiEEIAAgARC3AiAEIAMgAkEIa2pqNgIEQajFwABBgICAATYCAAtyAQF/IwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkEcakECNgIAIAJBLGpBzAA2AgAgAkICNwIMIAJByL3AADYCCCACQcwANgIkIAIgAkEgajYCGCACIAJBBGo2AiggAiACNgIgIAJBCGpB2L3AABDXAQALcgEBfyMAQTBrIgIkACACIAE2AgQgAiAANgIAIAJBHGpBAjYCACACQSxqQcwANgIAIAJCAjcCDCACQYy+wAA2AgggAkHMADYCJCACIAJBIGo2AhggAiACQQRqNgIoIAIgAjYCICACQQhqQZy+wAAQ1wEAC3IBAX8jAEEwayICJAAgAiABNgIEIAIgADYCACACQRxqQQI2AgAgAkEsakHMADYCACACQgI3AgwgAkH4vMAANgIIIAJBzAA2AiQgAiACQSBqNgIYIAIgAkEEajYCKCACIAI2AiAgAkEIakGovcAAENcBAAtvAQF/IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EcakECNgIAIANBLGpBzAA2AgAgA0ICNwIMIANBvLrAADYCCCADQcwANgIkIAMgA0EgajYCGCADIAM2AiggAyADQQRqNgIgIANBCGogAhDXAQALVgECfyMAQSBrIgIkACAAQRxqKAIAIQMgACgCGCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCADIAJBCGoQMiACQSBqJAALbwEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBHGpBAjYCACADQSxqQcwANgIAIANCAzcCDCADQey+wAA2AgggA0HMADYCJCADIANBIGo2AhggAyADNgIoIAMgA0EEajYCICADQQhqIAIQ1wEAC2kBAn8jAEEgayICJAAgAkEIaiABKAIAEAACQCACKAIIIgEEQCACIAIoAgwiAzYCGCACIAM2AhQgAiABNgIQIAIgAkEQahDeASAAIAIoAgAgAigCBBCLAgwBCyAAQQA2AgALIAJBIGokAAthAQF/IwBBQGoiASQAIABBADYCCCAAQgE3AgAgAUEBOgAPIAFBEGogAEGUgsAAEOUBIAFBD2ogAUEQahBlBEBBrILAAEE3IAFBOGpBwIPAAEGwg8AAEIQBAAsgAUFAayQAC3ABAX8CQAJAAkACQCAALQCYJg4EAQICAAILIABBiBNqEPkBIAAoApAmIgFBJE8EQCABEAMLIAAoApQmIgBBI00NAQwCCyAAEPkBIAAoApAmIgFBJE8EQCABEAMLIAAoApQmIgBBI0sNAQsPCyAAEAMLWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakG4jsAAIAJBCGoQMiACQSBqJAALawEEfyMAQRBrIgEkAAJAQQBBsK3AACgCABEDACICBEAgACgCACgCACIAIAAoAgAiA0EBaiIENgIAIAQgA08NAQALQdSqwABBxgAgAUEIakH8q8AAQeyrwAAQhAEACyACIAAQdiABQRBqJAALWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakHstcAAIAJBCGoQMiACQSBqJAALaQAjAEEwayIBJABBnMHAAC0AAARAIAFBHGpBATYCACABQgI3AgwgAUHgtsAANgIIIAFBzAA2AiQgASAANgIsIAEgAUEgajYCGCABIAFBLGo2AiAgAUEIakGIt8AAENcBAAsgAUEwaiQAC1kBAX8jAEEgayICJAAgAiAAKAIANgIEIAJBGGogAUEQaikCADcDACACQRBqIAFBCGopAgA3AwAgAiABKQIANwMIIAJBBGpBnLjAACACQQhqEDIgAkEgaiQAC2gBAn8gASgCACEDAkACQAJAIAFBCGooAgAiAUUEQEEBIQIMAQsgAUF/TA0BIAFBARCVAiICRQ0CCyACIAMgARC1AiECIAAgATYCCCAAIAE2AgQgACACNgIADwsQ1gEACyABQQEQsAIAC18AAkACQAJAAkACQCAAKAIADgcBAgMDBAMDAAsgAEEEaiIAEHwgABDQAQ8LIABBEGoQhAIgAEEcaiIAEKgBIAAQzgEPCyAAQRBqIgAQqAEgABDOAQsPCyAAQQRqEIQCC1sBAn8jAEEQayIDJAAgA0EIaiABEHkCQCADKAIIBEAgAygCDCIEQYAISw0BIAAgASACIAQQ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ACACQQhqIAAgARBIAkAgAigCDCIAQYGAgIB4RwRAIABFDQEgAigCCCAAELACAAsgAkEQaiQADwsQ1gEAC0ACAn8BfiMAQRBrIgEkACABQQhqIABBCGooAgAiAjYCACABIAApAgAiAzcDACADpyACEAEgARCEAiABQRBqJAALRgEBfyAAKAIEIAAoAggiA2sgAiABayICSQRAIAAgAyACELcBIAAoAgghAwsgACgCACADaiABIAIQtQIaIAAgAiADajYCCAtFAQF/IAAoAgAiACAAKAIAQX9qIgE2AgACQCABDQAgAEEMahBsIABBFGoQzQEgACAAKAIEQX9qIgE2AgQgAQ0AIAAQKwsLPAACQCAEIANPBEAgBCACSw0BIAAgBCADazYCBCAAIAEgA0ECdGo2AgAPCyADIAQQswIACyAEIAIQsgIAC0YBAn8jAEEQayIDJAAgASACECIhASADQQhqEOsBIAMoAgwhAiAAIAMoAggiBEEARzYCACAAIAIgASAEGzYCBCADQRBqJAALRwEDfyMAQRBrIgIkACABKAIAECMhASACQQhqEOsBIAIoAgwhAyAAIAIoAggiBEEARzYCACAAIAMgASAEGzYCBCACQRBqJAALQAECfyAAKAIIIgEEQCAAKAIAIQAgAUECdCEBA0AgACgCACICQSRPBEAgAhADCyAAQQRqIQAgAUF8aiIBDQALCwtOAQF/IwBBIGsiACQAIABBFGpBATYCACAAQgE3AgQgAEGQhMAANgIAIABBCzYCHCAAQbSHwAA2AhggACAAQRhqNgIQIABBvIfAABDXAQALRgEBfyMAQZATayIBJAAgASAAQYgTELUCIgAgADYCjBMgAEGME2pBjIjAABAdIAAtALwJQQRHBEAgABD5AQsgAEGQE2okAAtDAQF/IwBBEGsiAiQAIAAoAgAiAEUEQEGkqcAAQRwQqwIACyACIAA2AgwgAEEIakEBIAEQVSACQQxqEG0gAkEQaiQAC0MBAX8jAEEQayICJAAgACgCACIARQRAQaSpwABBHBCrAgALIAIgADYCDCAAQQhqQQAgARBVIAJBDGoQbSACQRBqJAALSQECfyMAQRBrIgEkAEEAQfCywAAoAgARAwAiAEUEQEH/ssAAQcYAIAFBCGpBpLTAAEGUtMAAEIQBAAsgACgCABAMIAFBEGokAAtIAQF/IwBBIGsiAyQAIANBFGpBADYCACADQey5wAA2AhAgA0IBNwIEIAMgATYCHCADIAA2AhggAyADQRhqNgIAIAMgAhDXAQALSQEBfyMAQSBrIgIkACACQRRqQQE2AgAgAkIBNwIEIAJB3LrAADYCACACQd8ANgIcIAIgADYCGCACIAJBGGo2AhAgAiABENcBAAs/AAJAAkACQCAALQC8CQ4EAQICAAILIAAQaCAAQZgJahCEAg8LIABBgAlqEIQCIABBjAlqIgAQxAEgABDNAQsLNQEBfyMAQRBrIgEkACABIAAQrgECQCABKAIIRQ0AIAEoAgRFDQAgASgCABArCyABQRBqJAALNQEBfyMAQRBrIgEkACABIAAQrAECQCABKAIIRQ0AIAEoAgRFDQAgASgCABArCyABQRBqJAALNQEBfyMAQRBrIgEkACABIAAQ3QECQCABKAIIRQ0AIAEoAgRFDQAgASgCABArCyABQRBqJAALNQEBfyMAQRBrIgEkACABIAAQogECQCABKAIIRQ0AIAEoAgRFDQAgASgCABArCyABQRBqJAALRgECfyABKAIEIQIgASgCACEDQQhBBBCVAiIBRQRAQQhBBBCwAgALIAEgAjYCBCABIAM2AgAgAEHkt8AANgIEIAAgATYCAAs7AQF/IwBBEGsiAiQAIAJBCGogACABEFAgAigCDCIAQYGAgIB4RwRAIAIoAgggABCwAgALIAJBEGokAAs5AQF/IAFBEHZAACECIABBADYCCCAAQQAgAUGAgHxxIAJBf0YiARs2AgQgAEEAIAJBEHQgARs2AgALOgEBfwJAIAAoAgAQEUUNACAAKAIEIgEgAEEIaigCACIAKAIAEQEAIAAoAgRFDQAgACgCCBogARArCwtqAQN/IwBBEGsiASQAIAAoAgwiAkUEQEGEtsAAQStBtLfAABDKAQALIAAoAggiA0UEQEGEtsAAQStBxLfAABDKAQALIAEgAjYCCCABIAA2AgQgASADNgIAIAEoAgAgASgCBCABKAIIEHgAC0ABAX8jAEEgayIAJAAgAEEcakEANgIAIABBtLjAADYCGCAAQgE3AgwgAEH0uMAANgIIIABBCGpB/LjAABDXAQALPwEBfyMAQSBrIgIkACACQQE6ABggAiABNgIUIAIgADYCECACQcy6wAA2AgwgAkHsucAANgIIIAJBCGoQ1QEACysAAkAgAEF8Sw0AIABFBEBBBA8LIAAgAEF9SUECdBCVAiIARQ0AIAAPCwALNAECfyABQXhqIgIgAigCACICQQFqIgM2AgAgAyACSQRAAAsgAEG0rcAANgIEIAAgATYCAAszAQF/QTRBBBCVAiIBRQRAQTRBBBCwAgALIAFCgYCAgBA3AgAgAUEIaiAAQSwQtQIaIAELLwEBfyMAQRBrIgIkACACIAAoAgA2AgwgAkEMaiABEEwgAkEMahDAASACQRBqJAALJAAjAEEQayIAJAAgAEEIaiABEOYBIABBCGoQhwEgAEEQaiQACywBAX8gAAJ/QQAgASgCBCICRQ0AGiAAIAI2AgQgACABKAIANgIAQQELNgIICzIBAX8gACABKAIEIAEoAggiAksEfyABIAIQ0gEgASgCCAUgAgs2AgQgACABKAIANgIACzIBAX8gACABKAIEIAEoAggiAksEfyABIAIQvQEgASgCCAUgAgs2AgQgACABKAIANgIACyMBAX8Cf0EBIAEQCkUNABpBAAshAiAAIAE2AgQgACACNgIACy0BAX8jAEEQayIBJAAgAUEIaiAAQQhqKAIANgIAIAEgACkCADcDACABEOcBAAsxAQF/QQRBBBCVAiICRQRAQQRBBBCwAgALIAIgATYCACAAQfyowAA2AgQgACACNgIACzEBAX9BBEEEEJUCIgJFBEBBBEEEELACAAsgAiABNgIAIABBkKnAADYCBCAAIAI2AgALKgEBfyAAKAIABEAgABDAASAAKAIEIgFBJE8EQCABEAMLIABBCGoQ1AELCzQAIABBAzoAICAAQoCAgICABDcCACAAIAE2AhggAEEANgIQIABBADYCCCAAQRxqIAI2AgALNQEBfyABKAIYQa+2wABBCyABQRxqKAIAKAIMEQUAIQIgAEEAOgAFIAAgAjoABCAAIAE2AgALLQEBfyMAQRBrIgEkACABIAApAgA3AwggAUEIakHYpsAAQQAgACgCCEEBEF0ACycAIAAgACgCBEEBcSABckECcjYCBCAAIAFqIgAgACgCBEEBcjYCBAslAQF/IwBBEGsiASQAIAEgAEF4ajYCDCABQQxqEHogAUEQaiQACyYAAkAgAEUNACAAIAEoAgARAQAgASgCBEUNACABKAIIGiAAECsLCzoBAn9B1MHAAC0AACEBQdTBwABBADoAAEHYwcAAKAIAIQJB2MHAAEEANgIAIAAgAjYCBCAAIAE2AgALLgEBfyMAQRBrIgAkACAAQbyowAA2AgggAEE1NgIEIABBmqfAADYCACAAEOEBAAsgAQF/AkAgACgCBCIBRQ0AIABBCGooAgBFDQAgARArCwsmAQF/IwBBEGsiAyQAIAMgATYCDCADIAA2AgggA0EIaiACEMsBAAsfACABIANGBEAgACACIAEQtQIaDwsgASADIAQQkAEACyYBAX8gAEEHaiIBIABJBEBBuJLAAEEzQcSTwAAQpgIACyABQQN2Cx8AAkAgAUF8TQRAIAAgAUEEIAIQjQIiAA0BCwALIAALIwAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALJQAgAEUEQEG8tcAAQTAQqwIACyAAIAIgAyAEIAUgASgCEBEMAAsjACAARQRAQby1wABBMBCrAgALIAAgAiADIAQgASgCEBEQAAsjACAARQRAQby1wABBMBCrAgALIAAgAiADIAQgASgCEBEGAAsjACAARQRAQby1wABBMBCrAgALIAAgAiADIAQgASgCEBEJAAsjACAARQRAQby1wABBMBCrAgALIAAgAiADIAQgASgCEBERAAseACAAIAFBA3I2AgQgACABaiIAIAAoAgRBAXI2AgQLJQACQAJAAkAgAC0AgBMOBAECAgACCyAAQcAJahBZDwsgABBZCwshACAARQRAQby1wABBMBCrAgALIAAgAiADIAEoAhARBAALFAAgAEEEaigCAARAIAAoAgAQKwsLHQAgASgCAEUEQAALIABB7KbAADYCBCAAIAE2AgALHwAgAEUEQEHUrcAAQTAQqwIACyAAIAIgASgCEBEAAAsfACAARQRAQcCywABBMBCrAgALIAAgAiABKAIQEQAACx8AIABFBEBBvLXAAEEwEKsCAAsgACACIAEoAhARAgALFwAgACgCBARAIAAQ1AEgAEEMahDUAQsLHQEBf0GgwcAAIQFBoMHAACgCAAR/IAEFIAAQTwsLFQEBfyAAKAIAIAAoAggQASAAEIQCCx4BAX9BuMHAACEBQbTBwAAoAgAEfyABBSAAEIMBCwsRACAAKAIEBEAgACgCABArCwsZAQF/IAAoAhAiAQR/IAEFIABBFGooAgALCxIAQQBBGSAAQQF2ayAAQR9GGwsWACAAIAFBAXI2AgQgACABaiABNgIACxwAIAEoAhhB7rnAAEELIAFBHGooAgAoAgwRBQALHAAgASgCGEH5ucAAQQ4gAUEcaigCACgCDBEFAAscACABKAIYQYTBwABBBSABQRxqKAIAKAIMEQUACxcAIAAgAjYCCCAAIAI2AgQgACABNgIACxAAIAAgAWpBf2pBACABa3ELDAAgACABIAIgAxAuCwsAIAEEQCAAECsLCw8AIABBAXQiAEEAIABrcgsOACAAKAIABEAgABBtCwsUACAAKAIAIAEgACgCBCgCDBECAAsWAEGYwcAAIAA7AQBBkMHAAEIBNwMACxEAIAAoAgAgACgCCCABELQCCxAAIAAoAgAgASACEJgCQQALCAAgACABEDsLEAAgACACNgIEIAAgATYCAAsRACAAKAIAIAAoAgQgARC0AgsOACAAIAEgASACahC/AQsWAEHYwcAAIAA2AgBB1MHAAEEBOgAACw0AIAAoAgAgARA/QQALEwAgAEHkt8AANgIEIAAgATYCAAsNACAALQAEQQJxQQF2CxAAIAEgACgCACAAKAIEECwLDQAgACABIAIQmAJBAAsKAEEAIABrIABxCwsAIAAtAARBA3FFCwwAIAAgAUEDcjYCBAsNACAAKAIAIAAoAgRqCw0AIAAoAgAgARBCQQALDgAgACgCABoDQAwACwALCwAgADUCACABEEQLDAAgACABIAIQ7gEACwsAIAAzAQAgARBECwsAIAAjAGokACMACwcAIAAQhAILCgAgACABQSwQJQsJACAAIAEQJAALCgAgACgCBEF4cQsKACAAKAIEQQFxCwoAIAAoAgxBAXELCgAgACgCDEEBdgsaACAAIAFB3MHAACgCACIAQc0AIAAbEQAAAAsKACAAIAEQjQEACwoAIAAgARCLAQALCgAgACABEIwBAAsKACACIAAgARAsCwoAIAAgASACEEMLCAAgACABEF8LBwAgACABagsHACAAIAFrCwcAIABBCGoLBwAgAEF4agsHACAAEMABCw0AQovk55XyuI/XuH8LDABC0Lbvt4yR2uhNCw0AQsmrmNye2tvOuX8LAwABCwviQAUAQYCAwAALkQkBAAAADAAAAAQAAAACAAAAAwAAAAQAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjLzRlNzI1YmFkNzM3NDdhNGM5M2EzYWM1MzEwNmU0YjQwMDZlZGM2NjUvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAABPABAASwAAALoJAAAOAAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZQAFAAAAAAAAAAEAAAAGAAAAdXNkcGwtZnJvbnQvc3JjL2NvbnZlcnQucnMAAOgAEAAaAAAAIAAAACcAAAAHAAAADAAAAAQAAAAIAAAACQAAAAQAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjLzRlNzI1YmFkNzM3NDdhNGM5M2EzYWM1MzEwNmU0YjQwMDZlZGM2NjUvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAABjARAASwAAALoJAAAOAAAACgAAAAAAAAABAAAABgAAAGB1bndyYXBfdGhyb3dgIGZhaWxlZGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IADlARAAKgAAAC9ob21lL25nbml1cy8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYXNlNjQtMC4xMy4wL3NyYy9kZWNvZGUucnMYAhAAWAAAANIBAAAfAAAAGAIQAFgAAADYAQAAHwAAABgCEABYAAAA4QEAAB8AAAAYAhAAWAAAAOoBAAAfAAAAGAIQAFgAAADzAQAAHwAAABgCEABYAAAA/AEAAB8AAAAYAhAAWAAAAAUCAAAfAAAAGAIQAFgAAAAOAgAAHwAAABgCEABYAAAAAwEAACQAAAAYAhAAWAAAAAQBAAApAAAAGAIQAFgAAAAqAQAAFgAAABgCEABYAAAALQEAABoAAAAYAhAAWAAAAEEBAAAOAAAAGAIQAFgAAABEAQAAEgAAABgCEABYAAAAWAEAABMAAABJbXBvc3NpYmxlOiBtdXN0IG9ubHkgaGF2ZSAwIHRvIDggaW5wdXQgYnl0ZXMgaW4gbGFzdCBjaHVuaywgd2l0aCBubyBpbnZhbGlkIGxlbmd0aHNgAxAAVAAAABgCEABYAAAAnQEAAA4AAAAYAhAAWAAAALEBAAAJAAAAGAIQAFgAAAAuAgAAEgAAABgCEABYAAAAvAEAABEAAAAMAAAAIBMAAAgAAAANAAAADgAAAAQAAAAEAAAADwAAABAAAAAvaG9tZS9uZ25pdXMvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjMwL3NyYy9saWIucnMAIAQQAGMAAADaAAAAIABBoInAAAvkNmBhc3luYyBmbmAgcmVzdW1lZCBhZnRlciBjb21wbGV0aW9uY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZXVzZHBsLWZyb250L3NyYy9jb25uZWN0aW9uLnJzAO4EEAAdAAAAEAAAAFwAAABQT1NUaHR0cDovL2xvY2FsaG9zdDovdXNkcGwvY2FsbCAFEAARAAAAMQUQAAsAAADuBBAAHQAAABsAAAAzAAAAQWNjZXB0YXBwbGljYXRpb24vYnl0ZXMA7gQQAB0AAAAjAAAAJAAAAO4EEAAdAAAAKgAAADoAAABFeHBlY3RlZCBjYWxsIHJlc3BvbnNlIG1lc3NhZ2UgZnJvbSAsIGdvdCBzb21ldGhpbmcgZWxzZZQFEAAkAAAAuAUQABQAAAB1c2RwbC1mcm9udC9zcmMvbGliLnJzAADcBRAAFgAAAEEAAABOAAAA3AUQABYAAABAAAAAAQAAAC9ob21lL25nbml1cy9Eb2N1bWVudHMvZ2l0LXJlcG9zL3VzZHBsLXJzL3VzZHBsLWNvcmUvc3JjL3NlcmRlcy90cmFpdHMucnMAAAAUBhAASQAAAE0AAAAoAAAAFAYQAEkAAAAnAAAAFQAAAGB1bndyYXBfdGhyb3dgIGZhaWxlZHVzaXplIG92ZXJmbG93IHdoZW4gY2FsY3VsYXRpbmcgYnVmZmVyIHNpemUvaG9tZS9uZ25pdXMvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFzZTY0LTAuMTMuMC9zcmMvZW5jb2RlLnJzwAYQAFgAAAB5AAAACgAAAMAGEABYAAAAewAAAB8AAAATAAAABAAAAAQAAAAUAAAAFQAAABYAAABMb2FkRXJyb3I6IEludmFsaWREYXRhAABQBxAAFgAAAExvYWRFcnJvcjogVG9vU21hbGxCdWZmZXIAAABwBxAAGQAAAER1bXBFcnJvcjogVW5zdXBwb3J0ZWQAAJQHEAAWAAAARHVtcEVycm9yOiBUb29TbWFsbEJ1ZmZlcgAAALQHEAAZAAAAdXNkcGwtY29yZS9zcmMvc2VyZGVzL2R1bXBfaW1wbC5ycwAA2AcQACIAAAAUAAAADwAAANgHEAAiAAAAFwAAACUAAAB1c2RwbC1jb3JlL3NyYy9zZXJkZXMvbG9hZF9pbXBsLnJzAAAcCBAAIgAAAB0AAAAnAAAAY3JhbmtzaGFmdAAAUAgQAAoAAABkZWNreQAAAGQIEAAFAAAAYW55AHQIEAADAAAAdXNkcGwtY29yZS9zcmMvcmVtb3RlX2NhbGwucnMAAACACBAAHQAAABEAAAA2AAAAgAgQAB0AAAAhAAAALgAAAHVzZHBsLWNvcmUvc3JjL3NlcmRlcy9kdW1wX2ltcGwucnMAAMAIEAAiAAAACwAAAA8AAADACBAAIgAAAAwAAAAPAAAAdXNkcGwtY29yZS9zcmMvc2VyZGVzL2xvYWRfaW1wbC5ycwAABAkQACIAAAAMAAAAJAAAAE92ZXJmbG93IHdoZW4gY2FsY3VsYXRpbmcgbnVtYmVyIG9mIGNodW5rcyBpbiBpbnB1dC9ob21lL25nbml1cy8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYXNlNjQtMC4xMy4wL3NyYy9kZWNvZGUucnMAawkQAFgAAAC8AAAACgAAACEiIyQlJicoKSorLC0wMTIzNDU2Nzg5QEFCQ0RFRkdISUpLTE1OUFFSU1RVVlhZWltgYWJjZGVoaWprbG1wcXJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSssLi9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL////////////////////////////////////////////wABAgMEBQYHCAkKCwz//w0ODxAREhMUFRb///////8XGBkaGxwdHh8gISIjJCX/JicoKSorLP8tLi8w/////zEyMzQ1Nv//Nzg5Ojs8//89Pj//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Pj////80NTY3ODk6Ozw9/////////wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZ////////GhscHR4fICEiIyQlJicoKSorLC0uLzAxMjP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wABNjc4OTo7PD0+P/////////8CAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaG////////xwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIDBAUGBwgJCgv/////////DA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCX///////8mJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8+//80NTY3ODk6Ozw9/////////wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZ/////z//GhscHR4fICEiIyQlJicoKSorLC0uLzAxMjP//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z7///8/NDU2Nzg5Ojs8Pf////////8AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGf///////xobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIz/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1QQEABUDxAAVA4QAFQNEABUDBAAVAsQAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IAAAbBEQACoAAAAvaG9tZS9uZ25pdXMvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFzZTY0LTAuMTMuMC9zcmMvZW5jb2RlLnJzoBEQAFgAAACSAAAAJwAAAHVzaXplIG92ZXJmbG93IHdoZW4gY2FsY3VsYXRpbmcgYjY0IGxlbmd0aAAAoBEQAFgAAACZAAAACgAAAKAREABYAAAAtgAAACAAAACgERAAWAAAALcAAAAlAAAAoBEQAFgAAAD8AAAAHAAAAKAREABYAAAA/QAAACEAAACgERAAWAAAABMBAAAuAAAAoBEQAFgAAAATAQAACQAAAKAREABYAAAAFAEAAAkAAACgERAAWAAAAAsBAAAuAAAAoBEQAFgAAAALAQAACQAAAKAREABYAAAADQEAAA8AAACgERAAWAAAAAwBAAAJAAAAoBEQAFgAAAAPAQAACQAAAEltcG9zc2libGUgcmVtYWluZGVyBBMQABQAAACgERAAWAAAACoBAAAWAAAAoBEQAFgAAAA7AQAACQAAABQLEADUChAAlAoQAFQKEAAUChAA1AkQABcAAAAIAAAABAAAABgAAAAZAAAAGgAAAAgAAAAEAAAAGwAAAHNhbWUtb3JpZ2lubm8tY29yc2NvcnNuYXZpZ2F0ZWF0dGVtcHRlZCB0byBjb252ZXJ0IGludmFsaWQgUmVxdWVzdE1vZGUgaW50byBKU1ZhbHVlL2hvbWUvbmduaXVzLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3dlYi1zeXMtMC4zLjU3L3NyYy9mZWF0dXJlcy9nZW5fUmVxdWVzdE1vZGUucnMAAM8TEABrAAAAAwAAAAEAAABib2R5bWV0aG9kbW9kZWFscmVhZHkgYm9ycm93ZWQAABwAAAAAAAAAAQAAAB0AAAAeAAAABAAAAAQAAAAfAAAAIAAAACEAAAAEAAAABAAAACIAAAAjAAAARm5PbmNlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS9ob21lL25nbml1cy8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuMzAvc3JjL2xpYi5ycwDAFBAAYwAAAKUAAAAPAAAAwBQQAGMAAACFAAAAJwAAAMAUEABjAAAArwAAACQAAABjYW5ub3QgYWNjZXNzIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgdmFsdWUgZHVyaW5nIG9yIGFmdGVyIGRlc3RydWN0aW9uL3J1c3RjLzRlNzI1YmFkNzM3NDdhNGM5M2EzYWM1MzEwNmU0YjQwMDZlZGM2NjUvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwAAAJoVEABPAAAApQEAABoAAAAkAAAAAAAAAAEAAAAlAAAAYWxyZWFkeSBib3Jyb3dlZCYAAAAAAAAAAQAAAB0AAAAvaG9tZS9uZ25pdXMvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjMwL3NyYy90YXNrL3NpbmdsZXRocmVhZC5ycwAAACwWEABxAAAAIQAAABUAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwWEABxAAAAVQAAACUAAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgZGVzdHJveWVkIGFscmVhZHkvcnVzdGMvNGU3MjViYWQ3Mzc0N2E0YzkzYTNhYzUzMTA2ZTRiNDAwNmVkYzY2NS9saWJyYXJ5L2FsbG9jL3NyYy9jb2xsZWN0aW9ucy92ZWNfZGVxdWUvbW9kLnJzYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5jYXAoKSA9PSBvbGRfY2FwICogMgAAAAQXEABeAAAAyggAAAkAAABhbHJlYWR5IGJvcnJvd2VkYWxyZWFkeSBtdXRhYmx5IGJvcnJvd2VkLQAAAAAAAAABAAAALgAAAC8AAAAAAAAAAQAAAB0AAAAvaG9tZS9uZ25pdXMvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjMwL3NyYy9xdWV1ZS5ycwAAAOgXEABlAAAAGgAAAC4AAADoFxAAZQAAAB0AAAApAAAA6BcQAGUAAAAyAAAAGgAAADAAAAAEAAAABAAAADEAAAAyAAAAYXNzZXJ0aW9uIGZhaWxlZDogbWlkIDw9IHNlbGYubGVuKCkvcnVzdGMvNGU3MjViYWQ3Mzc0N2E0YzkzYTNhYzUzMTA2ZTRiNDAwNmVkYzY2NS9saWJyYXJ5L2FsbG9jL3NyYy9jb2xsZWN0aW9ucy92ZWNfZGVxdWUvcmluZ19zbGljZXMucnMAAAC3GBAAZgAAACAAAAAOAAAAtxgQAGYAAAAjAAAAEQAAAGNsb3N1cmUgaW52b2tlZCByZWN1cnNpdmVseSBvciBkZXN0cm95ZWQgYWxyZWFkeTYAAAByZXR1cm4gdGhpc2Nhbm5vdCBhY2Nlc3MgYSBUaHJlYWQgTG9jYWwgU3RvcmFnZSB2YWx1ZSBkdXJpbmcgb3IgYWZ0ZXIgZGVzdHJ1Y3Rpb24vcnVzdGMvNGU3MjViYWQ3Mzc0N2E0YzkzYTNhYzUzMTA2ZTRiNDAwNmVkYzY2NS9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzxRkQAE8AAAClAQAAGgAAADcAAAAAAAAAAQAAACUAAAAvcnVzdGMvNGU3MjViYWQ3Mzc0N2E0YzkzYTNhYzUzMTA2ZTRiNDAwNmVkYzY2NS9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjLnJzVHJpZWQgdG8gc2hyaW5rIHRvIGEgbGFyZ2VyIGNhcGFjaXR5gBoQACQAAAA0GhAATAAAAKkBAAAJAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGRlc3Ryb3llZCBhbHJlYWR5TgAAAAQAAAAEAAAATwAAAFAAAABRAAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZUFjY2Vzc0Vycm9ybWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAoAAAA6GxAAFQAAAE8bEAAOAAAAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJzcBsQABgAAABEAQAACQAAAGxpYnJhcnkvc3RkL3NyYy9wYW5pY2tpbmcucnOYGxAAHAAAAEYCAAAfAAAAmBsQABwAAABHAgAAHgAAAFIAAAAMAAAABAAAAFMAAABOAAAACAAAAAQAAABUAAAAVQAAABAAAAAEAAAAVgAAAFcAAABOAAAACAAAAAQAAABYAAAAWQAAAFoAAAAEAAAABAAAAFsAAABcAAAAXQAAAFoAAAAAAAAAAQAAAAYAAABsaWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjLnJzY2FwYWNpdHkgb3ZlcmZsb3cAAABgHBAAEQAAAEQcEAAcAAAABQIAAAUAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3JsaWJyYXJ5L2FsbG9jL3NyYy9mbXQucnMAvxwQABgAAABkAgAAIAAAAO+/vQAAKUJvcnJvd0Vycm9yQm9ycm93TXV0RXJyb3JpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAAAcdEAAgAAAAJx0QABIAAABhAAAAAAAAAAEAAABiAAAA7BwQAAAAAAA6IAAA7BwQAAAAAABkHRAAAgAAAH0gfTAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5cmFuZ2Ugc3RhcnQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIABDHhAAEgAAAFUeEAAiAAAAbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pbmRleC5ycwCIHhAAHwAAADQAAAAFAAAAcmFuZ2UgZW5kIGluZGV4ILgeEAAQAAAAVR4QACIAAACIHhAAHwAAAEkAAAAFAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAA6B4QABYAAAD+HhAADQAAAIgeEAAfAAAAXAAAAAUAAABzb3VyY2Ugc2xpY2UgbGVuZ3RoICgpIGRvZXMgbm90IG1hdGNoIGRlc3RpbmF0aW9uIHNsaWNlIGxlbmd0aCAoLB8QABUAAABBHxAAKwAAAO0cEAABAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQcbAwAALMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMEBAQEBABBhMHAAAsFRXJyb3IAQZDBwAALCgEAAAAAAAAAaXoAgwEJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0YyUxLjYzLjAtbmlnaHRseSAoNGU3MjViYWQ3IDIwMjItMDYtMDQpBndhbHJ1cwYwLjE5LjAMd2FzbS1iaW5kZ2VuEjAuMi44MCAoNGNhYTk4MTY1KQ=="; + +function asciiToBinary(str) { + if (typeof atob === 'function') { + return atob(str) + } else { + return new Buffer(str, 'base64').toString('binary'); + } +} + +function decode() { + var binaryString = asciiToBinary(encoded); + var bytes = new Uint8Array(binaryString.length); + for (var i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return (async function() {return new Response(bytes.buffer);})(); +} + +export function init_embedded() { + return init(decode()) +} diff --git a/src/usdpl/usdpl_front_bg.wasm b/src/usdpl/usdpl_front_bg.wasm new file mode 100644 index 0000000..f6e1162 Binary files /dev/null and b/src/usdpl/usdpl_front_bg.wasm differ diff --git a/src/usdpl/usdpl_front_bg.wasm.d.ts b/src/usdpl/usdpl_front_bg.wasm.d.ts new file mode 100644 index 0000000..7387256 --- /dev/null +++ b/src/usdpl/usdpl_front_bg.wasm.d.ts @@ -0,0 +1,14 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function init_usdpl(a: number): void; +export function target(a: number): void; +export function call_backend(a: number, b: number, c: number, d: number): number; +export function __wbindgen_malloc(a: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number): number; +export const __wbindgen_export_2: WebAssembly.Table; +export function _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h2bd47cee569ae4c6(a: number, b: number, c: number): void; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_free(a: number, b: number): void; +export function __wbindgen_exn_store(a: number): void; +export function wasm_bindgen__convert__closures__invoke2_mut__hfe1195d34914cc54(a: number, b: number, c: number, d: number): void; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..13b0c35 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "outDir": "dist", + "module": "ESNext", + "target": "ES2020", + "jsx": "react", + "jsxFactory": "window.SP_REACT.createElement", + "declaration": false, + "moduleResolution": "node", + "noUnusedLocals": true, + "noUnusedParameters": true, + "esModuleInterop": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": true, + "strict": true, + "suppressImplicitAnyIndexErrors": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + }, + "include": ["src"], + "exclude": ["node_modules"] +}