From 0797824ea84759cbc8f3b2d37187d946d7cf05ad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Nov 2023 18:04:56 +0000 Subject: [PATCH] deploy: e631b2ab95c702991603dc99c1cd1b17c9b6c1bc --- 404.html | 19 +- assets/css/styles.307b5285.css | 3 - assets/css/styles.f7c26db7.css | 3 + ...09d1b.9a24e38b.js => 00309d1b.9df700f1.js} | 2 +- assets/js/01a85c17.7d963c01.js | 1 - assets/js/01a85c17.d4221160.js | 1 + ...9c679.33816ca2.js => 0359c679.3ca6e3fb.js} | 2 +- ...20919.ff3964a2.js => 07f20919.72a0ea98.js} | 2 +- ...d5264.a583e0ee.js => 08dd5264.7ebeebf6.js} | 2 +- ...ed6db.249775d4.js => 08ded6db.a1e0dc68.js} | 2 +- ...c38f0.e1a56ba9.js => 09ac38f0.0e47b6a8.js} | 2 +- assets/js/0dffb83e.6c9e5ec7.js | 1 - assets/js/0dffb83e.98f34a7e.js | 1 + ...1f268.80347ba6.js => 0ea1f268.b27098e9.js} | 2 +- ...dd4ac.fde097b1.js => 0fbdd4ac.514e2af7.js} | 2 +- assets/js/130.2448291a.js | 1 + assets/js/1366d7ae.4fb5075d.js | 1 + assets/js/1366d7ae.fe7fc0fe.js | 1 - ...86d62.279d55ed.js => 13986d62.c1425471.js} | 2 +- .../js/{1426.39540556.js => 1426.8a7f4119.js} | 2 +- ...de299.c3fedd0b.js => 143de299.d3a097ff.js} | 2 +- ...c226b.d148cb4c.js => 153c226b.722fc636.js} | 2 +- ...c1e74.42f49a8c.js => 155c1e74.c60231fe.js} | 2 +- ...b5465.2fd54cee.js => 166b5465.f98909ca.js} | 2 +- assets/js/1772.9796a666.js | 1 + assets/js/17896441.1c8df702.js | 1 - assets/js/17896441.dbf77ff9.js | 1 + ...183ba.be6e6772.js => 179183ba.6a924c3e.js} | 2 +- ...ee354.4835f795.js => 180ee354.b69fc369.js} | 2 +- ...c6361.b8c530ea.js => 187c6361.df90bd39.js} | 2 +- assets/js/19f79f7b.1ade0ebc.js | 1 + assets/js/19f79f7b.3e9395c7.js | 1 - assets/js/1a4e3797.3c1887b3.js.LICENSE.txt | 1 - ...e3797.3c1887b3.js => 1a4e3797.769d8c18.js} | 4 +- assets/js/1a4e3797.769d8c18.js.LICENSE.txt | 1 + assets/js/1be78505.60b95ee7.js | 1 - assets/js/1c14429f.2c119681.js | 1 + assets/js/1c14429f.6809339c.js | 1 - assets/js/1d8a5d15.2b13cbd9.js | 1 - assets/js/1d8a5d15.d895b1ed.js | 1 + ...2cabf.6cb7a47f.js => 21f2cabf.c9ad8d38.js} | 2 +- assets/js/26b85cb6.98313bc5.js | 1 + assets/js/26b85cb6.b913bd37.js | 1 - assets/js/2730e145.3bb3b825.js | 1 + assets/js/2730e145.70545291.js | 1 - ...28755.a604f963.js => 27528755.432f62b4.js} | 2 +- assets/js/29b62a39.6607397c.js | 1 + assets/js/29b62a39.d491548c.js | 1 - assets/js/29b83576.1c09dc14.js | 1 - assets/js/29b83576.d78afd48.js | 1 + ...b0b88.dfc48d4a.js => 2a6b0b88.01c63236.js} | 2 +- ...fdcac.a382b418.js => 2adfdcac.3c37a29a.js} | 2 +- ...a5a9a.4b0721ba.js => 2baa5a9a.f25a88f1.js} | 2 +- ...c9f52.80c52109.js => 2ddc9f52.1d8c6c02.js} | 2 +- ...a4d25.00fdda3c.js => 2e0a4d25.b54bdd52.js} | 2 +- assets/js/3290fbc2.83ee952a.js | 1 - assets/js/3290fbc2.dd92ec9c.js | 1 + assets/js/35230925.29f648b5.js | 1 - assets/js/35230925.dcdddd7b.js | 1 + ...7e2bf.e661e27e.js => 35a7e2bf.71209370.js} | 2 +- assets/js/3720c009.30b055b5.js | 1 + assets/js/3720c009.a4574b8c.js | 1 - ...74d2e.a089ce5c.js => 39574d2e.d1d6cecf.js} | 2 +- ...f21a8.90418f6a.js => 399f21a8.420d866d.js} | 2 +- ...94577.fb5615ec.js => 39e94577.85f019bf.js} | 2 +- ...297ac.b4ac4739.js => 3a6297ac.348b248b.js} | 2 +- ...68dbd.cd5b76ca.js => 3b168dbd.d8580674.js} | 2 +- ...cec70.f407843f.js => 3f0cec70.f7c10106.js} | 2 +- assets/js/3f90f51b.2d2941a9.js | 1 - assets/js/3f90f51b.c63e3c64.js | 1 + ...5650f.c73efbe4.js => 4035650f.9316e754.js} | 2 +- assets/js/40aeb86f.376587f0.js | 1 - assets/js/40aeb86f.bd8448f6.js | 1 + ...7aede.b2010ed6.js => 4247aede.df1864bc.js} | 2 +- ...ff3d6.d3c847c3.js => 433ff3d6.093c7d9e.js} | 2 +- ...e1886.331e3119.js => 43ee1886.d81e37f7.js} | 2 +- assets/js/445e9e2a.9a475749.js | 1 + assets/js/445e9e2a.e889d98e.js | 1 - assets/js/44969bae.7e6abc6e.js | 1 - assets/js/44969bae.ff574e4c.js | 1 + ...c3af8.59f3bef9.js => 45ac3af8.cf7a9fd9.js} | 2 +- ...86e35.7db05553.js => 45c86e35.17e3d245.js} | 2 +- ...1a117.149c1b9d.js => 45e1a117.340acc3e.js} | 2 +- ...c924f.1b5727ea.js => 469c924f.9a76c610.js} | 2 +- ...57ff6.d7494b7e.js => 48857ff6.ba1d9243.js} | 2 +- ...81e49.381d2121.js => 48e81e49.5ac56e34.js} | 2 +- assets/js/4972.0a28dda3.js | 1 - ...5e83d.31ceddd4.js => 49b5e83d.bb00ad8f.js} | 2 +- ...21728.447bd46f.js => 4a821728.3a30c2cd.js} | 2 +- ...aa780.28992a2f.js => 4beaa780.9c9386ab.js} | 2 +- ...27320.0ae961df.js => 4c027320.9f0993f7.js} | 2 +- assets/js/4c9535f7.6cbde464.js | 1 + assets/js/4c9535f7.9ccfa098.js | 1 - assets/js/4d7007b2.4b984760.js | 1 + assets/js/4d7007b2.73a373f9.js | 1 - ...02954.171a32d5.js => 50f02954.c6206aff.js} | 2 +- assets/js/514cab6e.8af2ed2b.js | 1 + assets/js/514cab6e.e8c2eaad.js | 1 - assets/js/51d5b592.a4e0e2e7.js | 1 - assets/js/51d5b592.eb15ccfd.js | 1 + ...2bfad.77ca8786.js => 51f2bfad.03938b9f.js} | 2 +- ...a291c.82f62613.js => 53ca291c.7e6b99d7.js} | 2 +- assets/js/5437f376.a307a139.js | 1 + assets/js/5437f376.dd2a93da.js | 1 - ...36d06.aef64e50.js => 54436d06.4d56aa06.js} | 2 +- ...9e604.2c5aa46d.js => 5559e604.11d96201.js} | 2 +- ...044f9.91e85ef3.js => 564044f9.b5bab01d.js} | 2 +- assets/js/581d5240.4f96a3e4.js | 1 + assets/js/581d5240.87a21bde.js | 1 - ...491fe.195d2f1b.js => 5a9491fe.79d386e5.js} | 2 +- assets/js/5b6134d1.4caed6d0.js | 1 + assets/js/5b6134d1.a464da92.js | 1 - assets/js/5bc389a1.9f343a0c.js | 1 - assets/js/5bc389a1.a5e2deb7.js | 1 + ...8f08d.ecec00ba.js => 5d08f08d.5c7abe18.js} | 2 +- ...8c936.8764d96d.js => 5d38c936.01ab4afd.js} | 2 +- assets/js/5e95c892.3e88c822.js | 1 + ...90731.f6a49b70.js => 5ec90731.4eab081d.js} | 2 +- ...0bdde.fbb18141.js => 5ef0bdde.da8175a7.js} | 2 +- assets/js/6048.a0d2f860.js | 1 - ...ee580.e30472b0.js => 616ee580.6ddee81a.js} | 2 +- ...037e5.85b42d25.js => 631037e5.adb20c2c.js} | 2 +- ...03520.0c257146.js => 64d03520.6f24231a.js} | 2 +- assets/js/665f164c.493e219b.js | 1 + assets/js/665f164c.eb74b7a6.js | 1 - assets/js/6875c492.463ee9a3.js | 1 + assets/js/6875c492.bfbc1fdc.js | 1 - ...99ecd.3b517092.js => 68b99ecd.9b719a2d.js} | 2 +- assets/js/6be32138.8a943ec7.js | 1 + assets/js/6be32138.e604e6f4.js | 1 - ...b158e.71a0d814.js => 6ccb158e.5162cfe7.js} | 2 +- ...65365.0fc782cb.js => 6e965365.33a8784c.js} | 2 +- ...964f3.0f47a8ee.js => 6f8964f3.a1c6e6fd.js} | 2 +- ...c0fd7.9b552829.js => 719c0fd7.6c3d8003.js} | 2 +- ...619b5.778e9505.js => 749619b5.eabd0923.js} | 2 +- ...c46b4.45c490ed.js => 74ec46b4.5a8f5ef0.js} | 2 +- ...8af72.de071f8d.js => 75d8af72.0db0b71a.js} | 2 +- ...344b9.ca82c87e.js => 763344b9.3fc871db.js} | 2 +- ...cc1e8.bbdd63a1.js => 779cc1e8.b5e33d5d.js} | 2 +- assets/js/7874.f6f729a5.js | 1 + ...55aff.6c794010.js => 79055aff.33b2b3c8.js} | 2 +- ...a1839.091e2e6b.js => 7aba1839.8f38c854.js} | 2 +- assets/js/7aefc753.cdd60b24.js | 1 + assets/js/7aefc753.f5cd3448.js | 1 - ...67a7f.ae55a2ab.js => 7b667a7f.8a480976.js} | 2 +- ...88087.328863f6.js => 7b788087.8948d3eb.js} | 2 +- ...de75f.0ebd6f32.js => 7b9de75f.61af48f1.js} | 2 +- assets/js/7ceaa645.42ff94cb.js | 1 + assets/js/7ceaa645.ac1d6308.js | 1 - assets/js/8105.7cae6d1f.js | 1 - ...f3328.d24f5f57.js => 814f3328.01f98a18.js} | 2 +- ...93666.f3b79821.js => 82893666.1b7a455f.js} | 2 +- assets/js/8428fe34.0509f320.js | 1 - assets/js/8428fe34.9593ce54.js | 1 + ...08f43.e19511bc.js => 84e08f43.fd8204f1.js} | 2 +- assets/js/866d553a.15ab360d.js | 1 + assets/js/866d553a.cbd99266.js | 1 - ...3bd1d.e7c31aca.js => 86c3bd1d.9115d118.js} | 2 +- assets/js/8a92e787.4f946d9f.js | 1 + assets/js/8a92e787.a068730e.js | 1 - ...21e85.eb0c3500.js => 8cf21e85.f316391c.js} | 2 +- assets/js/8def2dd5.46757c8d.js | 1 - assets/js/8def2dd5.8faef833.js | 1 + ...ecb6d.9b736857.js => 90decb6d.17716680.js} | 2 +- ...a69d3.580d79a0.js => 933a69d3.ba52a263.js} | 2 +- assets/js/935f2afb.3edf634b.js | 1 + assets/js/935f2afb.73c88fc7.js | 1 - assets/js/93df2695.12f4ff8d.js | 1 - assets/js/93df2695.300a96e1.js | 1 + assets/js/95f4d37c.0a40e7b8.js | 1 + assets/js/95f4d37c.7715ba3a.js | 1 - ...d240c.50abd3fb.js => 965d240c.50a7d323.js} | 2 +- assets/js/9722e053.24ccaeca.js | 1 - assets/js/9722e053.7ad17092.js | 1 + assets/js/98f9308d.a01bf3c4.js | 1 + assets/js/98f9308d.be94bcbf.js | 1 - ...a08cf.cbc2db42.js => 9bca08cf.cd5bdade.js} | 2 +- ...69ffc.df99b872.js => 9bd69ffc.96d0dc87.js} | 2 +- ...140f3.46c0f2b1.js => 9cc140f3.d46c2c0c.js} | 2 +- assets/js/9e4087bc.7fa7842e.js | 1 + assets/js/9e4087bc.a9c67174.js | 1 - assets/js/9f1c3232.1cf2e42e.js | 1 - assets/js/9f1c3232.754ab62e.js | 1 + assets/js/9f7d0305.7388f64a.js | 1 - assets/js/9f7d0305.ff0deaac.js | 1 + ...e0645.b94fc59c.js => a13e0645.94a2c40f.js} | 2 +- ...e2e4f.1318cb1d.js => a50e2e4f.08511bd9.js} | 2 +- ...6c4f3.9fea3752.js => a626c4f3.dee5a042.js} | 2 +- assets/js/a6aa9e1f.28469447.js | 1 - assets/js/a6aa9e1f.e40508bd.js | 1 + ...1de40.71ea664a.js => a771de40.cd72cf12.js} | 2 +- assets/js/a7bd4aaa.928fb9e5.js | 1 + assets/js/a94703ab.1851859d.js | 1 + ...76bf7.5c10b5a8.js => a9a76bf7.6ebee837.js} | 2 +- ...1941d.9d9f9412.js => aa81941d.a884d55b.js} | 2 +- ...4e600.4cda4442.js => ad04e600.80dbb210.js} | 2 +- ...13ba6.4cc80cf7.js => ae013ba6.851e7143.js} | 2 +- ...0e824.246e99e9.js => ae70e824.0e6f6d61.js} | 2 +- ...a11bf.4290cebc.js => af6a11bf.050de1e1.js} | 2 +- ...525a9.456b9285.js => b02525a9.4e924af7.js} | 2 +- ...a0ac1.7c16d2b5.js => b03a0ac1.5e843cb3.js} | 2 +- assets/js/b249ed45.77028740.js | 1 - assets/js/b249ed45.790c0dff.js | 1 + assets/js/b2f554cd.1ddf11f7.js | 1 + assets/js/b2f554cd.295697e8.js | 1 - assets/js/b35f1b7f.e3527fb9.js | 1 + assets/js/b35f1b7f.eab94299.js | 1 - assets/js/b40daf0f.2f5ab135.js | 1 + assets/js/b40daf0f.f8f42c37.js | 1 - assets/js/b5954e33.0de601d3.js | 1 - assets/js/b5954e33.3422a378.js | 1 + ...6d13b.1c632dae.js => b696d13b.67d6433c.js} | 2 +- ...66c91.eed55eb6.js => b8466c91.bdc01329.js} | 2 +- ...37621.03680a1b.js => b8c37621.3fb7580a.js} | 2 +- ...7817e.d1ea4071.js => b9b7817e.8ebc058f.js} | 2 +- ...9af11.470c9730.js => bd59af11.82aec483.js} | 2 +- ...6e15b.5e98adf3.js => bea6e15b.422e763d.js} | 2 +- assets/js/c222de09.301bcc1f.js | 1 + assets/js/c222de09.ec3d20c2.js | 1 - assets/js/c377a04b.a63d0c15.js | 1 - assets/js/c377a04b.b8a439ee.js | 1 + ...5dd14.c34d5bde.js => c3f5dd14.74ce3614.js} | 2 +- ...edc90.7e4aa2bd.js => caaedc90.0c254351.js} | 2 +- ...e0b88.61c83c7a.js => cc8e0b88.32340495.js} | 2 +- assets/js/ccc49370.084c8d77.js | 1 - assets/js/ccc49370.152e84b2.js | 1 + ...21ae3.bd881c9e.js => ce321ae3.8a69b8f3.js} | 2 +- ...635d7.d356d916.js => ce4635d7.2f6e9cd8.js} | 2 +- ...bd901.affbfa3f.js => ceabd901.23077e58.js} | 2 +- ...f6fc6.a492f280.js => d16f6fc6.dcce69ae.js} | 2 +- assets/js/d1b78a4d.8e6e2837.js | 1 - assets/js/d1b78a4d.c349bda3.js | 1 + ...29319.ebda8846.js => d1d29319.bcaebf14.js} | 2 +- assets/js/d23df0ea.1d84ae69.js | 1 + assets/js/d23df0ea.892d5604.js | 1 - ...4210a.31238def.js => d464210a.3e507ebe.js} | 2 +- assets/js/d7d81bf6.be572449.js | 1 - assets/js/d7d81bf6.dfef0ceb.js | 1 + assets/js/d8be0e5a.ea934156.js | 1 + assets/js/d8be0e5a.f9e6cd73.js | 1 - ...02ab0.79cb2336.js => da002ab0.4e4f882b.js} | 2 +- assets/js/dc2776f2.224fc2b8.js | 1 - assets/js/dc2776f2.a0c19ad7.js | 1 + assets/js/dd97a9bc.316666d0.js | 1 - assets/js/dd97a9bc.8892f4a2.js | 1 + ...25737.ae0ddde1.js => de225737.a2e520ac.js} | 2 +- assets/js/df203c0f.7f1db2f5.js | 1 + assets/js/df203c0f.8ad14275.js | 1 - ...1fbd7.8617ba2c.js => e331fbd7.29ba16bf.js} | 2 +- ...08407.1751bc14.js => e6a08407.9629e8eb.js} | 2 +- ...f52c1.e63d5f81.js => e91f52c1.d3ff2d82.js} | 2 +- ...8ad91.08a89d13.js => ec98ad91.f6dcd324.js} | 2 +- assets/js/ecfddbd4.21bb1ad5.js | 1 + assets/js/ecfddbd4.f15998ec.js | 1 - ...c0d6e.a8b752d8.js => f02c0d6e.a68a515b.js} | 2 +- assets/js/f3d7f34e.36b0c123.js | 1 + assets/js/f3d7f34e.da24e3c4.js | 1 - assets/js/f3f8ecb0.4317feec.js | 1 + assets/js/f3f8ecb0.c4976496.js | 1 - ...bce02.82543bf2.js => f41bce02.7f0e4028.js} | 2 +- ...d4511.1869451f.js => f4fd4511.35512f65.js} | 2 +- assets/js/f50a4147.0bd0271c.js | 1 + assets/js/f50a4147.103a0c55.js | 1 - ...07fb4.5389a650.js => f6807fb4.4f260ebf.js} | 2 +- ...3ec16.dafed2ec.js => f893ec16.d295f0cb.js} | 2 +- assets/js/fa69a7f4.48858406.js | 1 + assets/js/fa69a7f4.90bbc604.js | 1 - ...546af.b7f84265.js => fa7546af.7af1c866.js} | 2 +- ...63351.75cdda8a.js => fcc63351.947aff8c.js} | 2 +- assets/js/fd2b74dc.6aac091f.js | 1 - assets/js/fd2b74dc.7c595cf3.js | 1 + ...337e7.dce1780a.js => ffc337e7.5f4be381.js} | 2 +- assets/js/ffcb1b32.d590406b.js | 1 + assets/js/ffcb1b32.d819dc1a.js | 1 - assets/js/main.63e95a14.js | 2 + ...CENSE.txt => main.63e95a14.js.LICENSE.txt} | 47 +-- assets/js/main.f9c5ede1.js | 2 - assets/js/runtime~main.3cbddc6e.js | 1 + assets/js/runtime~main.85c93256.js | 1 - blog/archive/index.html | 19 +- blog/atom.xml | 134 +++++++-- .../index.html | 147 +++++++-- blog/feed.json | 4 +- blog/index.html | 19 +- blog/rss.xml | 134 +++++++-- blog/tags/blog/index.html | 19 +- blog/tags/content-routing/index.html | 19 +- blog/tags/engineering/index.html | 19 +- blog/tags/fleek-network/index.html | 19 +- blog/tags/index.html | 19 +- docs/Open-source/code-of-conduct/index.html | 74 +++-- docs/Open-source/contributing/index.html | 100 ++++++- docs/Open-source/index.html | 26 +- docs/Open-source/repositories/index.html | 22 +- docs/develop/client/index.html | 19 +- docs/develop/json-rpc/index.html | 19 +- docs/develop/overview/index.html | 19 +- docs/develop/service-development/index.html | 19 +- docs/index.html | 30 +- .../delivery-acknowledgements/index.html | 48 ++- docs/learn/developers/index.html | 30 +- docs/learn/introduction/index.html | 36 ++- docs/learn/services/index.html | 76 ++++- docs/learn/the-network/index.html | 281 +++++++++++++++++- docs/learn/token-and-economics/index.html | 101 ++++++- docs/node/analyzing-logs/index.html | 35 ++- docs/node/configuration/index.html | 19 +- docs/node/diagnostics/index.html | 19 +- docs/node/health-check/index.html | 38 ++- docs/node/install/index.html | 253 +++++++++++++++- docs/node/lightning-cli/index.html | 27 +- docs/node/overview/index.html | 39 ++- docs/node/requirements/index.html | 83 +++++- docs/node/systemd-service/index.html | 51 +++- docs/node/testnet-onboarding/index.html | 91 +++++- docs/roadmap/index.html | 67 ++++- docs/tags/about/index.html | 19 +- docs/tags/algorithms/index.html | 19 +- docs/tags/architecture/index.html | 19 +- docs/tags/awards/index.html | 19 +- docs/tags/build/index.html | 19 +- docs/tags/cdn/index.html | 19 +- docs/tags/cli/index.html | 19 +- docs/tags/client/index.html | 19 +- docs/tags/code-of-conduct/index.html | 19 +- docs/tags/codebase/index.html | 19 +- docs/tags/command-line-interface/index.html | 19 +- docs/tags/compile/index.html | 19 +- docs/tags/configuration/index.html | 19 +- docs/tags/consensus/index.html | 19 +- docs/tags/contribute/index.html | 19 +- docs/tags/control/index.html | 19 +- docs/tags/decentralization/index.html | 19 +- docs/tags/develop/index.html | 19 +- docs/tags/diagnostic/index.html | 19 +- docs/tags/diagnostics/index.html | 19 +- docs/tags/economics/index.html | 19 +- docs/tags/edge-network/index.html | 19 +- docs/tags/edge-platform/index.html | 19 +- docs/tags/fleek-network/index.html | 19 +- docs/tags/getting-started/index.html | 19 +- docs/tags/git/index.html | 19 +- docs/tags/guide/index.html | 19 +- docs/tags/healthcheck/index.html | 19 +- docs/tags/incentives/index.html | 19 +- docs/tags/index.html | 19 +- docs/tags/learn/index.html | 19 +- docs/tags/lgtn/index.html | 19 +- docs/tags/lightning/index.html | 19 +- docs/tags/logs/index.html | 19 +- docs/tags/manage/index.html | 19 +- docs/tags/manual/index.html | 19 +- docs/tags/node-status/index.html | 19 +- docs/tags/onboarding/index.html | 19 +- docs/tags/open-source/index.html | 19 +- docs/tags/permissionless/index.html | 19 +- docs/tags/phases/index.html | 19 +- docs/tags/pledge/index.html | 19 +- docs/tags/ports/index.html | 19 +- docs/tags/protocol/index.html | 19 +- docs/tags/repository/index.html | 19 +- docs/tags/reputation/index.html | 19 +- docs/tags/requirements/index.html | 19 +- docs/tags/rewards/index.html | 19 +- docs/tags/roadmap/index.html | 19 +- docs/tags/rpc/index.html | 19 +- docs/tags/rust-dependencies/index.html | 19 +- docs/tags/sdk/index.html | 19 +- docs/tags/server/index.html | 19 +- docs/tags/services/index.html | 19 +- docs/tags/snarks/index.html | 19 +- docs/tags/standards/index.html | 19 +- docs/tags/systemctl/index.html | 19 +- docs/tags/systemd/index.html | 19 +- docs/tags/testnet/index.html | 19 +- docs/tags/token/index.html | 19 +- docs/tags/tokenomics/index.html | 19 +- docs/tags/toolkit/index.html | 19 +- docs/tags/verification/index.html | 19 +- docs/tags/whitepaper/index.html | 19 +- docs/tags/wizard/index.html | 19 +- docs/whitepaper/index.html | 25 +- .../Node Operators/getting-started/index.html | 113 ++++++- .../how-to-manage-log-files/index.html | 126 +++++++- .../managing-the-keystore/index.html | 178 ++++++++++- .../running-a-node-in-docker/index.html | 160 +++++++++- .../transfering-setup-ownership/index.html | 149 +++++++++- .../updating-lightning/index.html | 124 +++++++- guides/index.html | 22 +- guides/tags/configuration/index.html | 19 +- guides/tags/container/index.html | 19 +- guides/tags/docker/index.html | 19 +- guides/tags/edge-computing/index.html | 19 +- guides/tags/fleek-network/index.html | 19 +- guides/tags/getting-started/index.html | 19 +- guides/tags/guide/index.html | 19 +- guides/tags/guides/index.html | 19 +- guides/tags/help/index.html | 19 +- guides/tags/index.html | 19 +- guides/tags/keys/index.html | 19 +- guides/tags/keystore/index.html | 19 +- guides/tags/logs/index.html | 19 +- guides/tags/ownership/index.html | 19 +- guides/tags/private-keys/index.html | 19 +- guides/tags/public-keys/index.html | 19 +- guides/tags/rebuild/index.html | 19 +- guides/tags/setup/index.html | 19 +- guides/tags/transfer/index.html | 19 +- guides/tags/update/index.html | 19 +- index.html | 19 +- .../Docker/build-and-run-in-docker/index.html | 67 ++++- .../index.html | 70 ++++- .../Docker/uninstall-docker-setup/index.html | 65 +++- .../backing-up-the-keystore/index.html | 56 +++- .../error-building-on-arm64/index.html | 36 ++- .../index.html | 34 ++- .../file-permissions-and-ownership/index.html | 86 +++++- .../index.html | 53 +++- .../Lightning CLI/keys-not-found/index.html | 24 +- .../node-secret-key-does-not-exist/index.html | 25 +- .../permission-denied-os-error-13/index.html | 40 ++- .../restore-the-keystore/index.html | 71 ++++- .../uninstall-lightning-node/index.html | 50 +++- .../update-cli-from-source-code/index.html | 107 ++++++- .../index.html | 30 +- .../shutting-down-persistance/index.html | 40 ++- references/Systemd/user-service/index.html | 63 +++- references/index.html | 22 +- references/tags/backup/index.html | 19 +- references/tags/build/index.html | 19 +- references/tags/clean/index.html | 19 +- references/tags/clear/index.html | 19 +- references/tags/cli/index.html | 19 +- references/tags/commands/index.html | 19 +- references/tags/container/index.html | 19 +- references/tags/delete/index.html | 19 +- references/tags/docker/index.html | 19 +- references/tags/file-permissions/index.html | 19 +- references/tags/fix/index.html | 19 +- references/tags/frozen/index.html | 19 +- references/tags/help/index.html | 19 +- references/tags/idle/index.html | 19 +- references/tags/image/index.html | 19 +- references/tags/index.html | 19 +- references/tags/keystore/index.html | 19 +- references/tags/lightning/index.html | 19 +- references/tags/lost-keys/index.html | 19 +- references/tags/ownership/index.html | 19 +- references/tags/permissions/index.html | 19 +- references/tags/pkill/index.html | 19 +- references/tags/process/index.html | 19 +- references/tags/reference/index.html | 19 +- references/tags/references/index.html | 19 +- references/tags/remove/index.html | 19 +- references/tags/restore/index.html | 19 +- references/tags/root/index.html | 19 +- references/tags/service-error/index.html | 19 +- references/tags/shutdown/index.html | 19 +- references/tags/sudoer/index.html | 19 +- references/tags/systemctl/index.html | 19 +- references/tags/systemd/index.html | 19 +- references/tags/uninstall/index.html | 19 +- references/tags/unit/index.html | 19 +- references/tags/update/index.html | 19 +- references/tags/upgrade/index.html | 19 +- references/tags/user-service/index.html | 19 +- search/index.html | 19 +- sitemap.xml | 2 +- 468 files changed, 4497 insertions(+), 2368 deletions(-) delete mode 100644 assets/css/styles.307b5285.css create mode 100644 assets/css/styles.f7c26db7.css rename assets/js/{00309d1b.9a24e38b.js => 00309d1b.9df700f1.js} (97%) delete mode 100644 assets/js/01a85c17.7d963c01.js create mode 100644 assets/js/01a85c17.d4221160.js rename assets/js/{0359c679.33816ca2.js => 0359c679.3ca6e3fb.js} (88%) rename assets/js/{07f20919.ff3964a2.js => 07f20919.72a0ea98.js} (89%) rename assets/js/{08dd5264.a583e0ee.js => 08dd5264.7ebeebf6.js} (95%) rename assets/js/{08ded6db.249775d4.js => 08ded6db.a1e0dc68.js} (94%) rename assets/js/{09ac38f0.e1a56ba9.js => 09ac38f0.0e47b6a8.js} (90%) delete mode 100644 assets/js/0dffb83e.6c9e5ec7.js create mode 100644 assets/js/0dffb83e.98f34a7e.js rename assets/js/{0ea1f268.80347ba6.js => 0ea1f268.b27098e9.js} (96%) rename assets/js/{0fbdd4ac.fde097b1.js => 0fbdd4ac.514e2af7.js} (87%) create mode 100644 assets/js/130.2448291a.js create mode 100644 assets/js/1366d7ae.4fb5075d.js delete mode 100644 assets/js/1366d7ae.fe7fc0fe.js rename assets/js/{13986d62.279d55ed.js => 13986d62.c1425471.js} (96%) rename assets/js/{1426.39540556.js => 1426.8a7f4119.js} (99%) rename assets/js/{143de299.c3fedd0b.js => 143de299.d3a097ff.js} (82%) rename assets/js/{153c226b.d148cb4c.js => 153c226b.722fc636.js} (84%) rename assets/js/{155c1e74.42f49a8c.js => 155c1e74.c60231fe.js} (89%) rename assets/js/{166b5465.2fd54cee.js => 166b5465.f98909ca.js} (86%) create mode 100644 assets/js/1772.9796a666.js delete mode 100644 assets/js/17896441.1c8df702.js create mode 100644 assets/js/17896441.dbf77ff9.js rename assets/js/{179183ba.be6e6772.js => 179183ba.6a924c3e.js} (83%) rename assets/js/{180ee354.4835f795.js => 180ee354.b69fc369.js} (88%) rename assets/js/{187c6361.b8c530ea.js => 187c6361.df90bd39.js} (88%) create mode 100644 assets/js/19f79f7b.1ade0ebc.js delete mode 100644 assets/js/19f79f7b.3e9395c7.js delete mode 100644 assets/js/1a4e3797.3c1887b3.js.LICENSE.txt rename assets/js/{1a4e3797.3c1887b3.js => 1a4e3797.769d8c18.js} (61%) create mode 100644 assets/js/1a4e3797.769d8c18.js.LICENSE.txt delete mode 100644 assets/js/1be78505.60b95ee7.js create mode 100644 assets/js/1c14429f.2c119681.js delete mode 100644 assets/js/1c14429f.6809339c.js delete mode 100644 assets/js/1d8a5d15.2b13cbd9.js create mode 100644 assets/js/1d8a5d15.d895b1ed.js rename assets/js/{21f2cabf.6cb7a47f.js => 21f2cabf.c9ad8d38.js} (96%) create mode 100644 assets/js/26b85cb6.98313bc5.js delete mode 100644 assets/js/26b85cb6.b913bd37.js create mode 100644 assets/js/2730e145.3bb3b825.js delete mode 100644 assets/js/2730e145.70545291.js rename assets/js/{27528755.a604f963.js => 27528755.432f62b4.js} (89%) create mode 100644 assets/js/29b62a39.6607397c.js delete mode 100644 assets/js/29b62a39.d491548c.js delete mode 100644 assets/js/29b83576.1c09dc14.js create mode 100644 assets/js/29b83576.d78afd48.js rename assets/js/{2a6b0b88.dfc48d4a.js => 2a6b0b88.01c63236.js} (94%) rename assets/js/{2adfdcac.a382b418.js => 2adfdcac.3c37a29a.js} (91%) rename assets/js/{2baa5a9a.4b0721ba.js => 2baa5a9a.f25a88f1.js} (94%) rename assets/js/{2ddc9f52.80c52109.js => 2ddc9f52.1d8c6c02.js} (91%) rename assets/js/{2e0a4d25.00fdda3c.js => 2e0a4d25.b54bdd52.js} (95%) delete mode 100644 assets/js/3290fbc2.83ee952a.js create mode 100644 assets/js/3290fbc2.dd92ec9c.js delete mode 100644 assets/js/35230925.29f648b5.js create mode 100644 assets/js/35230925.dcdddd7b.js rename assets/js/{35a7e2bf.e661e27e.js => 35a7e2bf.71209370.js} (71%) create mode 100644 assets/js/3720c009.30b055b5.js delete mode 100644 assets/js/3720c009.a4574b8c.js rename assets/js/{39574d2e.a089ce5c.js => 39574d2e.d1d6cecf.js} (94%) rename assets/js/{399f21a8.90418f6a.js => 399f21a8.420d866d.js} (85%) rename assets/js/{39e94577.fb5615ec.js => 39e94577.85f019bf.js} (85%) rename assets/js/{3a6297ac.b4ac4739.js => 3a6297ac.348b248b.js} (87%) rename assets/js/{3b168dbd.cd5b76ca.js => 3b168dbd.d8580674.js} (83%) rename assets/js/{3f0cec70.f407843f.js => 3f0cec70.f7c10106.js} (83%) delete mode 100644 assets/js/3f90f51b.2d2941a9.js create mode 100644 assets/js/3f90f51b.c63e3c64.js rename assets/js/{4035650f.c73efbe4.js => 4035650f.9316e754.js} (83%) delete mode 100644 assets/js/40aeb86f.376587f0.js create mode 100644 assets/js/40aeb86f.bd8448f6.js rename assets/js/{4247aede.b2010ed6.js => 4247aede.df1864bc.js} (83%) rename assets/js/{433ff3d6.d3c847c3.js => 433ff3d6.093c7d9e.js} (90%) rename assets/js/{43ee1886.331e3119.js => 43ee1886.d81e37f7.js} (89%) create mode 100644 assets/js/445e9e2a.9a475749.js delete mode 100644 assets/js/445e9e2a.e889d98e.js delete mode 100644 assets/js/44969bae.7e6abc6e.js create mode 100644 assets/js/44969bae.ff574e4c.js rename assets/js/{45ac3af8.59f3bef9.js => 45ac3af8.cf7a9fd9.js} (87%) rename assets/js/{45c86e35.7db05553.js => 45c86e35.17e3d245.js} (93%) rename assets/js/{45e1a117.149c1b9d.js => 45e1a117.340acc3e.js} (88%) rename assets/js/{469c924f.1b5727ea.js => 469c924f.9a76c610.js} (82%) rename assets/js/{48857ff6.d7494b7e.js => 48857ff6.ba1d9243.js} (91%) rename assets/js/{48e81e49.381d2121.js => 48e81e49.5ac56e34.js} (89%) delete mode 100644 assets/js/4972.0a28dda3.js rename assets/js/{49b5e83d.31ceddd4.js => 49b5e83d.bb00ad8f.js} (85%) rename assets/js/{4a821728.447bd46f.js => 4a821728.3a30c2cd.js} (93%) rename assets/js/{4beaa780.28992a2f.js => 4beaa780.9c9386ab.js} (82%) rename assets/js/{4c027320.0ae961df.js => 4c027320.9f0993f7.js} (95%) create mode 100644 assets/js/4c9535f7.6cbde464.js delete mode 100644 assets/js/4c9535f7.9ccfa098.js create mode 100644 assets/js/4d7007b2.4b984760.js delete mode 100644 assets/js/4d7007b2.73a373f9.js rename assets/js/{50f02954.171a32d5.js => 50f02954.c6206aff.js} (96%) create mode 100644 assets/js/514cab6e.8af2ed2b.js delete mode 100644 assets/js/514cab6e.e8c2eaad.js delete mode 100644 assets/js/51d5b592.a4e0e2e7.js create mode 100644 assets/js/51d5b592.eb15ccfd.js rename assets/js/{51f2bfad.77ca8786.js => 51f2bfad.03938b9f.js} (87%) rename assets/js/{53ca291c.82f62613.js => 53ca291c.7e6b99d7.js} (89%) create mode 100644 assets/js/5437f376.a307a139.js delete mode 100644 assets/js/5437f376.dd2a93da.js rename assets/js/{54436d06.aef64e50.js => 54436d06.4d56aa06.js} (95%) rename assets/js/{5559e604.2c5aa46d.js => 5559e604.11d96201.js} (88%) rename assets/js/{564044f9.91e85ef3.js => 564044f9.b5bab01d.js} (92%) create mode 100644 assets/js/581d5240.4f96a3e4.js delete mode 100644 assets/js/581d5240.87a21bde.js rename assets/js/{5a9491fe.195d2f1b.js => 5a9491fe.79d386e5.js} (93%) create mode 100644 assets/js/5b6134d1.4caed6d0.js delete mode 100644 assets/js/5b6134d1.a464da92.js delete mode 100644 assets/js/5bc389a1.9f343a0c.js create mode 100644 assets/js/5bc389a1.a5e2deb7.js rename assets/js/{5d08f08d.ecec00ba.js => 5d08f08d.5c7abe18.js} (98%) rename assets/js/{5d38c936.8764d96d.js => 5d38c936.01ab4afd.js} (80%) create mode 100644 assets/js/5e95c892.3e88c822.js rename assets/js/{5ec90731.f6a49b70.js => 5ec90731.4eab081d.js} (87%) rename assets/js/{5ef0bdde.fbb18141.js => 5ef0bdde.da8175a7.js} (80%) delete mode 100644 assets/js/6048.a0d2f860.js rename assets/js/{616ee580.e30472b0.js => 616ee580.6ddee81a.js} (90%) rename assets/js/{631037e5.85b42d25.js => 631037e5.adb20c2c.js} (59%) rename assets/js/{64d03520.0c257146.js => 64d03520.6f24231a.js} (84%) create mode 100644 assets/js/665f164c.493e219b.js delete mode 100644 assets/js/665f164c.eb74b7a6.js create mode 100644 assets/js/6875c492.463ee9a3.js delete mode 100644 assets/js/6875c492.bfbc1fdc.js rename assets/js/{68b99ecd.3b517092.js => 68b99ecd.9b719a2d.js} (79%) create mode 100644 assets/js/6be32138.8a943ec7.js delete mode 100644 assets/js/6be32138.e604e6f4.js rename assets/js/{6ccb158e.71a0d814.js => 6ccb158e.5162cfe7.js} (98%) rename assets/js/{6e965365.0fc782cb.js => 6e965365.33a8784c.js} (99%) rename assets/js/{6f8964f3.0f47a8ee.js => 6f8964f3.a1c6e6fd.js} (93%) rename assets/js/{719c0fd7.9b552829.js => 719c0fd7.6c3d8003.js} (82%) rename assets/js/{749619b5.778e9505.js => 749619b5.eabd0923.js} (94%) rename assets/js/{74ec46b4.45c490ed.js => 74ec46b4.5a8f5ef0.js} (84%) rename assets/js/{75d8af72.de071f8d.js => 75d8af72.0db0b71a.js} (70%) rename assets/js/{763344b9.ca82c87e.js => 763344b9.3fc871db.js} (85%) rename assets/js/{779cc1e8.bbdd63a1.js => 779cc1e8.b5e33d5d.js} (91%) create mode 100644 assets/js/7874.f6f729a5.js rename assets/js/{79055aff.6c794010.js => 79055aff.33b2b3c8.js} (91%) rename assets/js/{7aba1839.091e2e6b.js => 7aba1839.8f38c854.js} (84%) create mode 100644 assets/js/7aefc753.cdd60b24.js delete mode 100644 assets/js/7aefc753.f5cd3448.js rename assets/js/{7b667a7f.ae55a2ab.js => 7b667a7f.8a480976.js} (89%) rename assets/js/{7b788087.328863f6.js => 7b788087.8948d3eb.js} (94%) rename assets/js/{7b9de75f.0ebd6f32.js => 7b9de75f.61af48f1.js} (86%) create mode 100644 assets/js/7ceaa645.42ff94cb.js delete mode 100644 assets/js/7ceaa645.ac1d6308.js delete mode 100644 assets/js/8105.7cae6d1f.js rename assets/js/{814f3328.d24f5f57.js => 814f3328.01f98a18.js} (62%) rename assets/js/{82893666.f3b79821.js => 82893666.1b7a455f.js} (96%) delete mode 100644 assets/js/8428fe34.0509f320.js create mode 100644 assets/js/8428fe34.9593ce54.js rename assets/js/{84e08f43.e19511bc.js => 84e08f43.fd8204f1.js} (92%) create mode 100644 assets/js/866d553a.15ab360d.js delete mode 100644 assets/js/866d553a.cbd99266.js rename assets/js/{86c3bd1d.e7c31aca.js => 86c3bd1d.9115d118.js} (93%) create mode 100644 assets/js/8a92e787.4f946d9f.js delete mode 100644 assets/js/8a92e787.a068730e.js rename assets/js/{8cf21e85.eb0c3500.js => 8cf21e85.f316391c.js} (79%) delete mode 100644 assets/js/8def2dd5.46757c8d.js create mode 100644 assets/js/8def2dd5.8faef833.js rename assets/js/{90decb6d.9b736857.js => 90decb6d.17716680.js} (92%) rename assets/js/{933a69d3.580d79a0.js => 933a69d3.ba52a263.js} (92%) create mode 100644 assets/js/935f2afb.3edf634b.js delete mode 100644 assets/js/935f2afb.73c88fc7.js delete mode 100644 assets/js/93df2695.12f4ff8d.js create mode 100644 assets/js/93df2695.300a96e1.js create mode 100644 assets/js/95f4d37c.0a40e7b8.js delete mode 100644 assets/js/95f4d37c.7715ba3a.js rename assets/js/{965d240c.50abd3fb.js => 965d240c.50a7d323.js} (82%) delete mode 100644 assets/js/9722e053.24ccaeca.js create mode 100644 assets/js/9722e053.7ad17092.js create mode 100644 assets/js/98f9308d.a01bf3c4.js delete mode 100644 assets/js/98f9308d.be94bcbf.js rename assets/js/{9bca08cf.cbc2db42.js => 9bca08cf.cd5bdade.js} (90%) rename assets/js/{9bd69ffc.df99b872.js => 9bd69ffc.96d0dc87.js} (86%) rename assets/js/{9cc140f3.46c0f2b1.js => 9cc140f3.d46c2c0c.js} (89%) create mode 100644 assets/js/9e4087bc.7fa7842e.js delete mode 100644 assets/js/9e4087bc.a9c67174.js delete mode 100644 assets/js/9f1c3232.1cf2e42e.js create mode 100644 assets/js/9f1c3232.754ab62e.js delete mode 100644 assets/js/9f7d0305.7388f64a.js create mode 100644 assets/js/9f7d0305.ff0deaac.js rename assets/js/{a13e0645.b94fc59c.js => a13e0645.94a2c40f.js} (90%) rename assets/js/{a50e2e4f.1318cb1d.js => a50e2e4f.08511bd9.js} (90%) rename assets/js/{a626c4f3.9fea3752.js => a626c4f3.dee5a042.js} (83%) delete mode 100644 assets/js/a6aa9e1f.28469447.js create mode 100644 assets/js/a6aa9e1f.e40508bd.js rename assets/js/{a771de40.71ea664a.js => a771de40.cd72cf12.js} (88%) create mode 100644 assets/js/a7bd4aaa.928fb9e5.js create mode 100644 assets/js/a94703ab.1851859d.js rename assets/js/{a9a76bf7.5c10b5a8.js => a9a76bf7.6ebee837.js} (83%) rename assets/js/{aa81941d.9d9f9412.js => aa81941d.a884d55b.js} (97%) rename assets/js/{ad04e600.4cda4442.js => ad04e600.80dbb210.js} (81%) rename assets/js/{ae013ba6.4cc80cf7.js => ae013ba6.851e7143.js} (86%) rename assets/js/{ae70e824.246e99e9.js => ae70e824.0e6f6d61.js} (88%) rename assets/js/{af6a11bf.4290cebc.js => af6a11bf.050de1e1.js} (97%) rename assets/js/{b02525a9.456b9285.js => b02525a9.4e924af7.js} (82%) rename assets/js/{b03a0ac1.7c16d2b5.js => b03a0ac1.5e843cb3.js} (93%) delete mode 100644 assets/js/b249ed45.77028740.js create mode 100644 assets/js/b249ed45.790c0dff.js create mode 100644 assets/js/b2f554cd.1ddf11f7.js delete mode 100644 assets/js/b2f554cd.295697e8.js create mode 100644 assets/js/b35f1b7f.e3527fb9.js delete mode 100644 assets/js/b35f1b7f.eab94299.js create mode 100644 assets/js/b40daf0f.2f5ab135.js delete mode 100644 assets/js/b40daf0f.f8f42c37.js delete mode 100644 assets/js/b5954e33.0de601d3.js create mode 100644 assets/js/b5954e33.3422a378.js rename assets/js/{b696d13b.1c632dae.js => b696d13b.67d6433c.js} (86%) rename assets/js/{b8466c91.eed55eb6.js => b8466c91.bdc01329.js} (96%) rename assets/js/{b8c37621.03680a1b.js => b8c37621.3fb7580a.js} (97%) rename assets/js/{b9b7817e.d1ea4071.js => b9b7817e.8ebc058f.js} (95%) rename assets/js/{bd59af11.470c9730.js => bd59af11.82aec483.js} (88%) rename assets/js/{bea6e15b.5e98adf3.js => bea6e15b.422e763d.js} (93%) create mode 100644 assets/js/c222de09.301bcc1f.js delete mode 100644 assets/js/c222de09.ec3d20c2.js delete mode 100644 assets/js/c377a04b.a63d0c15.js create mode 100644 assets/js/c377a04b.b8a439ee.js rename assets/js/{c3f5dd14.c34d5bde.js => c3f5dd14.74ce3614.js} (91%) rename assets/js/{caaedc90.7e4aa2bd.js => caaedc90.0c254351.js} (83%) rename assets/js/{cc8e0b88.61c83c7a.js => cc8e0b88.32340495.js} (81%) delete mode 100644 assets/js/ccc49370.084c8d77.js create mode 100644 assets/js/ccc49370.152e84b2.js rename assets/js/{ce321ae3.bd881c9e.js => ce321ae3.8a69b8f3.js} (86%) rename assets/js/{ce4635d7.d356d916.js => ce4635d7.2f6e9cd8.js} (92%) rename assets/js/{ceabd901.affbfa3f.js => ceabd901.23077e58.js} (83%) rename assets/js/{d16f6fc6.a492f280.js => d16f6fc6.dcce69ae.js} (91%) delete mode 100644 assets/js/d1b78a4d.8e6e2837.js create mode 100644 assets/js/d1b78a4d.c349bda3.js rename assets/js/{d1d29319.ebda8846.js => d1d29319.bcaebf14.js} (86%) create mode 100644 assets/js/d23df0ea.1d84ae69.js delete mode 100644 assets/js/d23df0ea.892d5604.js rename assets/js/{d464210a.31238def.js => d464210a.3e507ebe.js} (92%) delete mode 100644 assets/js/d7d81bf6.be572449.js create mode 100644 assets/js/d7d81bf6.dfef0ceb.js create mode 100644 assets/js/d8be0e5a.ea934156.js delete mode 100644 assets/js/d8be0e5a.f9e6cd73.js rename assets/js/{da002ab0.79cb2336.js => da002ab0.4e4f882b.js} (82%) delete mode 100644 assets/js/dc2776f2.224fc2b8.js create mode 100644 assets/js/dc2776f2.a0c19ad7.js delete mode 100644 assets/js/dd97a9bc.316666d0.js create mode 100644 assets/js/dd97a9bc.8892f4a2.js rename assets/js/{de225737.ae0ddde1.js => de225737.a2e520ac.js} (95%) create mode 100644 assets/js/df203c0f.7f1db2f5.js delete mode 100644 assets/js/df203c0f.8ad14275.js rename assets/js/{e331fbd7.8617ba2c.js => e331fbd7.29ba16bf.js} (81%) rename assets/js/{e6a08407.1751bc14.js => e6a08407.9629e8eb.js} (85%) rename assets/js/{e91f52c1.e63d5f81.js => e91f52c1.d3ff2d82.js} (85%) rename assets/js/{ec98ad91.08a89d13.js => ec98ad91.f6dcd324.js} (84%) create mode 100644 assets/js/ecfddbd4.21bb1ad5.js delete mode 100644 assets/js/ecfddbd4.f15998ec.js rename assets/js/{f02c0d6e.a8b752d8.js => f02c0d6e.a68a515b.js} (89%) create mode 100644 assets/js/f3d7f34e.36b0c123.js delete mode 100644 assets/js/f3d7f34e.da24e3c4.js create mode 100644 assets/js/f3f8ecb0.4317feec.js delete mode 100644 assets/js/f3f8ecb0.c4976496.js rename assets/js/{f41bce02.82543bf2.js => f41bce02.7f0e4028.js} (82%) rename assets/js/{f4fd4511.1869451f.js => f4fd4511.35512f65.js} (84%) create mode 100644 assets/js/f50a4147.0bd0271c.js delete mode 100644 assets/js/f50a4147.103a0c55.js rename assets/js/{f6807fb4.5389a650.js => f6807fb4.4f260ebf.js} (82%) rename assets/js/{f893ec16.dafed2ec.js => f893ec16.d295f0cb.js} (90%) create mode 100644 assets/js/fa69a7f4.48858406.js delete mode 100644 assets/js/fa69a7f4.90bbc604.js rename assets/js/{fa7546af.b7f84265.js => fa7546af.7af1c866.js} (89%) rename assets/js/{fcc63351.75cdda8a.js => fcc63351.947aff8c.js} (85%) delete mode 100644 assets/js/fd2b74dc.6aac091f.js create mode 100644 assets/js/fd2b74dc.7c595cf3.js rename assets/js/{ffc337e7.dce1780a.js => ffc337e7.5f4be381.js} (94%) create mode 100644 assets/js/ffcb1b32.d590406b.js delete mode 100644 assets/js/ffcb1b32.d819dc1a.js create mode 100644 assets/js/main.63e95a14.js rename assets/js/{main.f9c5ede1.js.LICENSE.txt => main.63e95a14.js.LICENSE.txt} (76%) delete mode 100644 assets/js/main.f9c5ede1.js create mode 100644 assets/js/runtime~main.3cbddc6e.js delete mode 100644 assets/js/runtime~main.85c93256.js diff --git a/404.html b/404.html index 1380a29b9..b7f755913 100644 --- a/404.html +++ b/404.html @@ -1,9 +1,9 @@ - + - -Page Not Found | Fleek Network Docs | Decentralized Edge Platform + +Page Not Found | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/assets/css/styles.307b5285.css b/assets/css/styles.307b5285.css deleted file mode 100644 index db391f270..000000000 --- a/assets/css/styles.307b5285.css +++ /dev/null @@ -1,3 +0,0 @@ -@import url(https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-font-family-base:"IBM Plex Mono",sans-serif;--ifm-color-primary:#000;--ifm-color-primary-dark:#003;--ifm-color-primary-darker:#001ac9;--ifm-color-primary-darkest:#0048f8;--ifm-color-primary-light:#0073ff;--ifm-color-primary-lighter:#98beff;--ifm-color-primary-lightest:#fff;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docsearch-modal-background:#000!important;--custom-color-gray-blue:rgba(62,72,105,.375);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0;font-family:Atyp,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.alert a,.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.menu .menu__list a:first-letter,.menu__link:first-letter{text-transform:capitalize}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.author_card .name,.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.author_card .title,.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.author_card .discord a,.markdown li a,.markdown p a{color:var(--ifm-color-primary-darker)}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.container .banner,.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item,.markdown>h2{margin-top:0}.admonitionContent_S0QG>:last-child,.collapsibleContent_i85q>:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.DocSearch-Hit[aria-selected=true] mark,.alert a:hover,.content_knG7 a,.markdown img - -.table-of-contents li a:hover{text-decoration:underline}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;background:#000;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Atyp;src:url(/assets/fonts/AtypDisplay-Bold-de173ab13f271165dea47653efb5eed9.woff2) format("woff2"),url(/assets/fonts/AtypDisplay-Medium-58ac793c378d558af2634b06be3bdaf5.woff2) format("woff2"),url(/assets/fonts/AtypDisplay-Regular-0172926b6f46b46f356050344c00784b.woff2) format("woff2"),url(/assets/fonts/AtypDisplay-Semibold-ca360708480d01e62d606eda542d5309.woff2) format("woff2")}[data-theme=dark]{--ifm-color-primary:#fff;--ifm-color-primary-dark:#98beff;--ifm-color-primary-darker:#c9ff57;--ifm-color-primary-darkest:#0048f8;--ifm-color-primary-light:#001ac9;--ifm-color-primary-lighter:#003;--ifm-color-primary-lightest:#000;--ifm-menu-color-background-active:#ffffff1a;--docusaurus-highlighted-code-line-bg:#0000004d;--ifm-navbar-background-color:#000;--ifm-menu-color:#888}.main-wrapper a,.main-wrapper p,.main-wrapper span{line-height:1.4}.main-wrapper:before{content:" ";height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1}[data-theme=dark] .footer{background:#0000;border-top:1px solid var(--ifm-toc-border-color)}.navbar{border-bottom:1px solid var(--ifm-toc-border-color);box-shadow:none}.alert{background:#1c1c1c;border-left:4px solid #c9ff57;border-radius:0}.alert a:hover{text-decoration-thickness:2px}#__docusaurus-base-url-issue-banner-container,.DocSearch .DocSearch-Button-Keys,.DocSearch-Modal .DocSearch-Footer,.docSidebarContainer_b6E3,.sidebarLogo_isFc,.themedImage_ToTc,[aria-label="Search by Algolia"],[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,div[class*=" searchLogoColumn"],html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.DocSearch-Dropdown .DocSearch-Hit[aria-selected=true] a{background-color:#111}.navbar__items .DocSearch-Button{background:var(--docsearch-searchbox-focus-background);border:1px solid var(--ifm-toc-border-color);border-radius:0;width:250px}.navbar__items .DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);border:1px solid var(--ifm-color-primary);box-shadow:var(--ifm-toc-border-color)}.footer__bottom{padding:2rem 0}div[class*=docItemContainer]{padding:20px}.main-wrapper{padding:0 var(--ifm-spacing-horizontal)}.footer .container,.main-wrapper>[class^=docPage_],.navbar__inner{margin:0 auto;max-width:1440px;width:100%}.menu .menu__list{padding-right:2rem}nav>.menu__list{padding-bottom:4rem}.menu__link--active:not(.menu__link--sublist){background-color:initial}.menu__link{padding:var(--ifm-menu-link-padding-vertical) 0}.menu__link,.navbar__item{color:var(--ifm-menu-color)}.menu__link--active,.navbar__link--active,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.DocSearch-Button-Container svg,.DocSearch-Form .DocSearch-LoadingIndicator svg,.DocSearch-Form .DocSearch-MagnifierLabel svg{height:14px;width:14px}.DocSearch-Button-Container .DocSearch-Button-Placeholder{padding:0 .5rem}.DocSearch-Button svg,.footer [class^=footerLogoLink_]:hover{opacity:.5}.DocSearch-Button:active svg,.DocSearch-Button:focus svg,.DocSearch-Button:hover svg,.footer [class^=footerLogoLink_],.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.DocSearch-Container>.DocSearch-Modal,.DocSearch-Modal .DocSearch-Form{border:1px solid var(--ifm-toc-border-color);box-shadow:none}.DocSearch-Modal .DocSearch-Input{font-size:1em}input[class^=searchQueryInput_]{border:1px solid var(--ifm-toc-border-color);max-width:480px;width:100%}.breadcrumbs__item span,.breadcrumbs__link{color:var(--ifm-menu-color);padding:0;text-transform:capitalize}.breadcrumbs__item--active .breadcrumbs__link{background:none;color:var(--ifm-menu-color)}.col article header>h2,article h1{-webkit-text-fill-color:#0000;background:#fff;-webkit-background-clip:text}.pagination-nav__link{border-radius:0}.main-wrapper .container{max-width:1440px;padding:0}.table-of-contents__left-border{border-left-style:dashed}.table-of-contents:before{content:"Content";font-size:1rem;font-weight:700}.table-of-contents .table-of-contents__link--active:before{content:"► ";font-size:.62rem}.blog-wrapper aside nav{border-right:1px dashed var(--ifm-toc-border-color)}.author_card{display:flex;justify-content:flex-end}.author_card .discord a{font-weight:700}.author_card a{flex-shrink:0}.author_card a img{height:60px;transition:transform .3s,opacity .3s;width:60px}.author_card a img:hover{opacity:.9;transform:scale(1.03)}.author_card a,.author_card span{font-size:16px;line-height:1.4}.author_card>div{background:#1c1c1c;border:1px solid var(--ifm-color-primary-darker);border-radius:0;display:grid;gap:1rem;grid-template-columns:auto auto;height:auto;margin:40px 5px;max-width:420px;padding:20px;position:relative;width:100%}.author_card>div>div{display:flex;flex-flow:column}.author_card img{align-self:center;display:block;height:100%;overflow:hidden;width:auto}.youtube-player iframe{aspect-ratio:16/9;width:100%}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedImage--dark_i4oU,[data-theme=light] .themedImage--light_HNdA{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{--ifm-breadcrumb-separator-size-multiplier:1;color:var(--ifm-color-content-secondary);font-size:.8rem}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite a;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes a{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_gTbr,.docPage__5DB{display:flex;width:100%}.docPage__5DB{flex:1 0}.docsWrapper_BCFX{display:flex;flex:1 0 auto}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;border:0;cursor:pointer}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards b;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon,.tocCollapsibleContent_vkbj a{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}@keyframes b{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container{z-index:calc(var(--ifm-z-index-fixed) + 1)}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_LlT9{margin-bottom:1em}.admonitionHeading_tbUL{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.3rem;text-transform:uppercase}.admonitionHeading_tbUL code{text-transform:none}.admonitionIcon_kALy{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_kALy svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}@media (min-width:768px){.author_card>div{height:120px}.author_card a img{height:80px;width:80px}}@media (min-width:996px){.navbar__items{height:100%;justify-content:space-between}.navbar__items div:first-child{align-items:inherit;display:flex}.navbar__items .DocSearch-Button{justify-content:flex-start}[class^=sidebar_] .menu_node_modules-\@docusaurus-theme-classic-lib-theme-DocSidebar-Desktop-Content-styles-module{padding:1rem 0}.footer .container{padding:0}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_m80_{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.searchBox_ZlJk{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_BlDH,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_m80_:focus,.expandButton_m80_:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_m80_{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_BlDH{transform:rotate(180deg)}.docSidebarContainer_b6E3{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_b3ry{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_Xe31{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_gTbr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Uz_u{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_czyv{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.colorModeToggle_x44X,.navbar__item,.navbar__toggle+.navbar__brand,.sidebar_re4s,.tableOfContents_bqdL{display:none}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbar__items>div:nth-child(2){align-items:flex-end;display:flex;justify-content:flex-end;width:100%}.navbar__items [class^=searchBox_]{position:static}.searchBox_ZlJk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width);animation:none;-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/css/styles.f7c26db7.css b/assets/css/styles.f7c26db7.css new file mode 100644 index 000000000..e8c74b7db --- /dev/null +++ b/assets/css/styles.f7c26db7.css @@ -0,0 +1,3 @@ +@import url(https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,.hash-link{-webkit-user-select:none}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-font-family-base:"IBM Plex Mono",sans-serif;--ifm-color-primary:#000;--ifm-color-primary-dark:#003;--ifm-color-primary-darker:#001ac9;--ifm-color-primary-darkest:#0048f8;--ifm-color-primary-light:#0073ff;--ifm-color-primary-lighter:#98beff;--ifm-color-primary-lightest:#fff;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#0000001a;--docsearch-modal-background:#000!important;--custom-color-gray-blue:rgba(62,72,105,.375);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);text-rendering:optimizelegibility}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0;font-family:Atyp,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.alert a,.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.menu .menu__list a:first-letter,.menu__link:first-letter{text-transform:capitalize}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.author_card .name,.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.author_card .title,.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.author_card .discord a,.markdown li a,.markdown p a{color:var(--ifm-color-primary-darker)}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.container .banner,.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item,.markdown>h2{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;position:fixed;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{-webkit-appearance:none;appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:.9rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover,.sidebarItemLink_mo7H:hover{text-decoration:none}.pagination-nav{grid-gap:var(--ifm-spacing-horizontal);display:grid;gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.DocSearch-Hit[aria-selected=true] mark,.alert a:hover,.content_knG7 a,.markdown img + +.table-of-contents li a:hover{text-decoration:underline}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.sidebarItemTitle_pO2u,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;background:#000;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-family:Atyp;src:url(/assets/fonts/AtypDisplay-Bold-de173ab13f271165dea47653efb5eed9.woff2) format("woff2"),url(/assets/fonts/AtypDisplay-Medium-58ac793c378d558af2634b06be3bdaf5.woff2) format("woff2"),url(/assets/fonts/AtypDisplay-Regular-0172926b6f46b46f356050344c00784b.woff2) format("woff2"),url(/assets/fonts/AtypDisplay-Semibold-ca360708480d01e62d606eda542d5309.woff2) format("woff2")}[data-theme=dark]{--ifm-color-primary:#fff;--ifm-color-primary-dark:#98beff;--ifm-color-primary-darker:#c9ff57;--ifm-color-primary-darkest:#0048f8;--ifm-color-primary-light:#001ac9;--ifm-color-primary-lighter:#003;--ifm-color-primary-lightest:#000;--ifm-menu-color-background-active:#ffffff1a;--docusaurus-highlighted-code-line-bg:#0000004d;--ifm-navbar-background-color:#000;--ifm-menu-color:#888}.main-wrapper a,.main-wrapper p,.main-wrapper span{line-height:1.4}.main-wrapper:before{content:" ";height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1}[data-theme=dark] .footer{background:#0000;border-top:1px solid var(--ifm-toc-border-color)}.navbar{border-bottom:1px solid var(--ifm-toc-border-color);box-shadow:none}.alert{background:#1c1c1c;border-left:4px solid #c9ff57;border-radius:0}.alert a:hover{text-decoration-thickness:2px}#__docusaurus-base-url-issue-banner-container,.DocSearch .DocSearch-Button-Keys,.DocSearch-Modal .DocSearch-Footer,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:not(:has(>*)),.sidebarLogo_isFc,.themedComponent_mlkZ,[aria-label="Search by Algolia"],[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,div[class*=" searchLogoColumn"],html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.DocSearch-Dropdown .DocSearch-Hit[aria-selected=true] a{background-color:#111}.navbar__items .DocSearch-Button{background:var(--docsearch-searchbox-focus-background);border:1px solid var(--ifm-toc-border-color);border-radius:0;width:250px}.navbar__items .DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);border:1px solid var(--ifm-color-primary);box-shadow:var(--ifm-toc-border-color)}.footer__bottom{padding:2rem 0}div[class*=docItemContainer]{padding:20px}.footer .container,.main-wrapper,.navbar__inner{margin:0 auto;max-width:1440px;width:100%}.menu .menu__list{padding-right:2rem}nav>.menu__list{padding-bottom:4rem}.menu__link--active:not(.menu__link--sublist){background-color:initial}.menu__link{padding:var(--ifm-menu-link-padding-vertical) 0}.menu__link,.navbar__item{color:var(--ifm-menu-color)}.menu__link--active,.navbar__link--active,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.DocSearch-Button-Container svg,.DocSearch-Form .DocSearch-LoadingIndicator svg,.DocSearch-Form .DocSearch-MagnifierLabel svg{height:14px;width:14px}.DocSearch-Button-Container .DocSearch-Button-Placeholder{padding:0 .5rem}.DocSearch-Button svg,.footer [class^=footerLogoLink_]:hover{opacity:.5}.DocSearch-Button:active svg,.DocSearch-Button:focus svg,.DocSearch-Button:hover svg,.footer [class^=footerLogoLink_],.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.DocSearch-Container>.DocSearch-Modal,.DocSearch-Modal .DocSearch-Form{border:1px solid var(--ifm-toc-border-color);box-shadow:none}.DocSearch-Modal .DocSearch-Input{font-size:1em}input[class^=searchQueryInput_]{border:1px solid var(--ifm-toc-border-color);max-width:480px;width:100%}.breadcrumbs__item span,.breadcrumbs__link{color:var(--ifm-menu-color);padding:0;text-transform:capitalize}.breadcrumbs__item--active .breadcrumbs__link{background:none;color:var(--ifm-menu-color)}.col article header>h2,article h1{-webkit-text-fill-color:#0000;background:#fff;-webkit-background-clip:text}.pagination-nav__link{border-radius:0}.main-wrapper .container{max-width:1440px;padding:0}.table-of-contents__left-border{border-left-style:dashed}.table-of-contents:before{content:"Content";font-size:1rem;font-weight:700}.table-of-contents .table-of-contents__link--active:before{content:"► ";font-size:.62rem}.blog-wrapper aside nav{border-right:1px dashed var(--ifm-toc-border-color)}.author_card{display:flex;justify-content:flex-end}.author_card .discord a{font-weight:700}.author_card a{flex-shrink:0}.author_card a img{height:60px;transition:transform .3s,opacity .3s;width:60px}.author_card a img:hover{opacity:.9;transform:scale(1.03)}.author_card a,.author_card span{font-size:16px;line-height:1.4}.author_card>div{background:#1c1c1c;border:1px solid var(--ifm-color-primary-darker);border-radius:0;display:grid;gap:1rem;grid-template-columns:auto auto;height:auto;margin:40px 5px;max-width:420px;padding:20px;position:relative;width:100%}.author_card>div>div{display:flex;flex-flow:column}.author_card img{align-self:center;display:block;height:100%;overflow:hidden;width:auto}.youtube-player iframe{aspect-ratio:16/9;width:100%}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.iconExternalLink_nPIU{margin-left:.3rem}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);user-select:none}.hash-link:before{content:"#"}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.algoliaLogo_rT1R{max-width:150px}.algoliaLogoPathFill_WdUC{fill:var(--ifm-font-color-base)}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{--ifm-breadcrumb-separator-size-multiplier:1;color:var(--ifm-color-content-secondary);font-size:.8rem}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite a;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes a{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}.authorCol_Hf19{flex-grow:1!important;max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.DocSearch-Button,.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Button{background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Input,.DocSearch-Link{-webkit-appearance:none;font:inherit}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Hit-action-button,.DocSearch-Reset{-webkit-appearance:none;border:0;cursor:pointer}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards b;appearance:none;background:none;border-radius:50%;color:var(--docsearch-icon-color);padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border-radius:50%;color:inherit;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon,.tocCollapsibleContent_vkbj a{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}@keyframes b{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container{z-index:calc(var(--ifm-z-index-fixed) + 1)}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.lastUpdated_vwxv{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);text-transform:uppercase}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{fill:var(--ifm-alert-foreground-color);display:inline-block;height:1.6em;width:1.6em}.blogPostFooterDetailsFull_mRVl{flex-direction:column}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}@media (min-width:768px){.author_card>div{height:120px}.author_card a img{height:80px;width:80px}}@media (min-width:996px){.navbar__items{height:100%;justify-content:space-between}.navbar__items div:first-child{align-items:inherit;display:flex}.navbar__items .DocSearch-Button{justify-content:flex-start}[class^=sidebar_] .menu_node_modules-\@docusaurus-theme-classic-lib-theme-DocSidebar-Desktop-Content-styles-module{padding:1rem 0}.footer .container{padding:0}}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);-webkit-clip-path:inset(0);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.lastUpdated_vwxv{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.footer__link-separator{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.colorModeToggle_x44X,.navbar__item,.navbar__toggle+.navbar__brand,.sidebar_re4s,.tableOfContents_bqdL{display:none}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbar__items>div:nth-child(2){align-items:flex-end;display:flex;justify-content:flex-end;width:100%}.navbar__items [class^=searchBox_]{position:static}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{-webkit-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width);animation:none;-webkit-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/00309d1b.9a24e38b.js b/assets/js/00309d1b.9df700f1.js similarity index 97% rename from assets/js/00309d1b.9a24e38b.js rename to assets/js/00309d1b.9df700f1.js index d9732de88..f0b4ecc02 100644 --- a/assets/js/00309d1b.9a24e38b.js +++ b/assets/js/00309d1b.9df700f1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9335],{5219:e=>{e.exports=JSON.parse('{"label":"Fleek Network","permalink":"/docs/tags/fleek-network","allTagsPath":"/docs/tags","count":7,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"},{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"},{"id":"roadmap","title":"Roadmap","description":"Fleek Network\'s high-level roadmap per stage. Devnet, Testnet, and Mainnet.","permalink":"/docs/roadmap"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9335],{5219:e=>{e.exports=JSON.parse('{"label":"Fleek Network","permalink":"/docs/tags/fleek-network","allTagsPath":"/docs/tags","count":7,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"},{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"},{"id":"roadmap","title":"Roadmap","description":"Fleek Network\'s high-level roadmap per stage. Devnet, Testnet, and Mainnet.","permalink":"/docs/roadmap"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.7d963c01.js b/assets/js/01a85c17.7d963c01.js deleted file mode 100644 index a543c4833..000000000 --- a/assets/js/01a85c17.7d963c01.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4013],{9058:(e,t,a)=>{a.d(t,{Z:()=>E});var l=a(7294),r=a(6010),n=a(8888),s=a(7524),i=a(9960),c=a(5999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function o(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(3102);function d(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(i.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function g(e){return l.createElement(u.Zo,{component:d,props:e})}function b(e){let{sidebar:t}=e;const a=(0,s.i)();return t?.items.length?"mobile"===a?l.createElement(g,{sidebar:t}):l.createElement(o,{sidebar:t}):null}function E(e){const{sidebar:t,toc:a,children:s,...i}=e,c=t&&t.items.length>0;return l.createElement(n.Z,i,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(b,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":c,"col--9 col--offset-1":!c}),itemScope:!0,itemType:"http://schema.org/Blog"},s),a&&l.createElement("div",{className:"col col--2"},a))))}},4524:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294),r=a(6010),n=a(5155),s=a(833),i=a(5281),c=a(9058),m=a(6090),o=a(197);function u(e){let{tags:t,sidebar:a}=e;const u=(0,n.M)();return l.createElement(s.FG,{className:(0,r.Z)(i.k.wrapper.blogPages,i.k.page.blogTagsListPage)},l.createElement(s.d,{title:u}),l.createElement(o.Z,{tag:"blog_tags_list"}),l.createElement(c.Z,{sidebar:a},l.createElement("h1",null,u),l.createElement(m.Z,{tags:t})))}},3008:(e,t,a)=>{a.d(t,{Z:()=>i});var l=a(7294),r=a(6010),n=a(9960);const s={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function i(e){let{permalink:t,label:a,count:i}=e;return l.createElement(n.Z,{href:t,className:(0,r.Z)(s.tag,i?s.tagWithCount:s.tagRegular)},a,i&&l.createElement("span",null,i))}},6090:(e,t,a)=>{a.d(t,{Z:()=>c});var l=a(7294),r=a(5155),n=a(3008);const s={tag:"tag_Nnez"};function i(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:s.tag},l.createElement(n.Z,e))))),l.createElement("hr",null))}function c(e){let{tags:t}=e;const a=(0,r.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(i,{key:e.letter,letterEntry:e}))))}},5155:(e,t,a)=>{a.d(t,{M:()=>r,P:()=>n});var l=a(5999);const r=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function n(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/01a85c17.d4221160.js b/assets/js/01a85c17.d4221160.js new file mode 100644 index 000000000..2e1028b31 --- /dev/null +++ b/assets/js/01a85c17.d4221160.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4013],{1460:(e,t,s)=>{s.d(t,{Z:()=>v});var a=s(7294),i=s(4334),r=s(8888),l=s(7524),n=s(9960),c=s(5999),o=s(6550),d=s(8596);function m(e){const{pathname:t}=(0,o.TH)();return(0,a.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,d.Mg)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var g=s(5893);function h(e){let{sidebar:t}=e;const s=m(t.items);return(0,g.jsx)("aside",{className:"col col--3",children:(0,g.jsxs)("nav",{className:(0,i.Z)(u.sidebar,"thin-scrollbar"),"aria-label":(0,c.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,g.jsx)("div",{className:(0,i.Z)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,g.jsx)("ul",{className:(0,i.Z)(u.sidebarItemList,"clean-list"),children:s.map((e=>(0,g.jsx)("li",{className:u.sidebarItem,children:(0,g.jsx)(n.Z,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var b=s(3102);function p(e){let{sidebar:t}=e;const s=m(t.items);return(0,g.jsx)("ul",{className:"menu__list",children:s.map((e=>(0,g.jsx)("li",{className:"menu__list-item",children:(0,g.jsx)(n.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function j(e){return(0,g.jsx)(b.Zo,{component:p,props:e})}function x(e){let{sidebar:t}=e;const s=(0,l.i)();return t?.items.length?"mobile"===s?(0,g.jsx)(j,{sidebar:t}):(0,g.jsx)(h,{sidebar:t}):null}function v(e){const{sidebar:t,toc:s,children:a,...l}=e,n=t&&t.items.length>0;return(0,g.jsx)(r.Z,{...l,children:(0,g.jsx)("div",{className:"container margin-vert--lg",children:(0,g.jsxs)("div",{className:"row",children:[(0,g.jsx)(x,{sidebar:t}),(0,g.jsx)("main",{className:(0,i.Z)("col",{"col--7":n,"col--9 col--offset-1":!n}),itemScope:!0,itemType:"https://schema.org/Blog",children:a}),s&&(0,g.jsx)("div",{className:"col col--2",children:s})]})})})}},4524:(e,t,s)=>{s.r(t),s.d(t,{default:()=>u});s(7294);var a=s(4334),i=s(5155),r=s(833),l=s(5281),n=s(1460),c=s(6090),o=s(197),d=s(2503),m=s(5893);function u(e){let{tags:t,sidebar:s}=e;const u=(0,i.M)();return(0,m.jsxs)(r.FG,{className:(0,a.Z)(l.k.wrapper.blogPages,l.k.page.blogTagsListPage),children:[(0,m.jsx)(r.d,{title:u}),(0,m.jsx)(o.Z,{tag:"blog_tags_list"}),(0,m.jsxs)(n.Z,{sidebar:s,children:[(0,m.jsx)(d.Z,{as:"h1",children:u}),(0,m.jsx)(c.Z,{tags:t})]})]})}},3008:(e,t,s)=>{s.d(t,{Z:()=>n});s(7294);var a=s(4334),i=s(9960);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=s(5893);function n(e){let{permalink:t,label:s,count:n}=e;return(0,l.jsxs)(i.Z,{href:t,className:(0,a.Z)(r.tag,n?r.tagWithCount:r.tagRegular),children:[s,n&&(0,l.jsx)("span",{children:n})]})}},6090:(e,t,s)=>{s.d(t,{Z:()=>o});s(7294);var a=s(5155),i=s(3008),r=s(2503);const l={tag:"tag_Nnez"};var n=s(5893);function c(e){let{letterEntry:t}=e;return(0,n.jsxs)("article",{children:[(0,n.jsx)(r.Z,{as:"h2",id:t.letter,children:t.letter}),(0,n.jsx)("ul",{className:"padding--none",children:t.tags.map((e=>(0,n.jsx)("li",{className:l.tag,children:(0,n.jsx)(i.Z,{...e})},e.permalink)))}),(0,n.jsx)("hr",{})]})}function o(e){let{tags:t}=e;const s=(0,a.P)(t);return(0,n.jsx)("section",{className:"margin-vert--lg",children:s.map((e=>(0,n.jsx)(c,{letterEntry:e},e.letter)))})}},5155:(e,t,s)=>{s.d(t,{M:()=>i,P:()=>r});var a=s(5999);const i=()=>(0,a.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(e){const t={};return Object.values(e).forEach((e=>{const s=function(e){return e[0].toUpperCase()}(e.label);t[s]??=[],t[s].push(e)})),Object.entries(t).sort(((e,t)=>{let[s]=e,[a]=t;return s.localeCompare(a)})).map((e=>{let[t,s]=e;return{letter:t,tags:s.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/0359c679.33816ca2.js b/assets/js/0359c679.3ca6e3fb.js similarity index 88% rename from assets/js/0359c679.33816ca2.js rename to assets/js/0359c679.3ca6e3fb.js index f1b658369..632e1fda0 100644 --- a/assets/js/0359c679.33816ca2.js +++ b/assets/js/0359c679.3ca6e3fb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7649],{8511:e=>{e.exports=JSON.parse('{"label":"sudoer","permalink":"/references/tags/sudoer","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7649],{8511:e=>{e.exports=JSON.parse('{"label":"sudoer","permalink":"/references/tags/sudoer","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/07f20919.ff3964a2.js b/assets/js/07f20919.72a0ea98.js similarity index 89% rename from assets/js/07f20919.ff3964a2.js rename to assets/js/07f20919.72a0ea98.js index 16e7db1fd..45b90f439 100644 --- a/assets/js/07f20919.ff3964a2.js +++ b/assets/js/07f20919.72a0ea98.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4327],{6444:e=>{e.exports=JSON.parse('{"label":"root","permalink":"/references/tags/root","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4327],{6444:e=>{e.exports=JSON.parse('{"label":"root","permalink":"/references/tags/root","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/08dd5264.a583e0ee.js b/assets/js/08dd5264.7ebeebf6.js similarity index 95% rename from assets/js/08dd5264.a583e0ee.js rename to assets/js/08dd5264.7ebeebf6.js index 37b1da7d4..2fd60de09 100644 --- a/assets/js/08dd5264.a583e0ee.js +++ b/assets/js/08dd5264.7ebeebf6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9267],{9692:e=>{e.exports=JSON.parse('{"label":"snarks","permalink":"/docs/tags/snarks","allTagsPath":"/docs/tags","count":2,"items":[{"id":"learn/delivery-acknowledgements","title":"Delivery Acknowledgements","description":"Dive into Fleek Network\'s Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.","permalink":"/docs/learn/delivery-acknowledgements"},{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9267],{9692:e=>{e.exports=JSON.parse('{"label":"snarks","permalink":"/docs/tags/snarks","allTagsPath":"/docs/tags","count":2,"items":[{"id":"learn/delivery-acknowledgements","title":"Delivery Acknowledgements","description":"Dive into Fleek Network\'s Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.","permalink":"/docs/learn/delivery-acknowledgements"},{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/08ded6db.249775d4.js b/assets/js/08ded6db.a1e0dc68.js similarity index 94% rename from assets/js/08ded6db.249775d4.js rename to assets/js/08ded6db.a1e0dc68.js index 064d09ff5..b3aab7949 100644 --- a/assets/js/08ded6db.249775d4.js +++ b/assets/js/08ded6db.a1e0dc68.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7216],{1426:e=>{e.exports=JSON.parse('{"label":"lightning","permalink":"/references/tags/lightning","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","permalink":"/references/Lightning CLI/frequently-used-commands-for-native-setup"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7216],{1426:e=>{e.exports=JSON.parse('{"label":"lightning","permalink":"/references/tags/lightning","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","permalink":"/references/Lightning CLI/frequently-used-commands-for-native-setup"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/09ac38f0.e1a56ba9.js b/assets/js/09ac38f0.0e47b6a8.js similarity index 90% rename from assets/js/09ac38f0.e1a56ba9.js rename to assets/js/09ac38f0.0e47b6a8.js index 1b60c01a1..dc3f6e5ca 100644 --- a/assets/js/09ac38f0.e1a56ba9.js +++ b/assets/js/09ac38f0.0e47b6a8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3343],{4764:e=>{e.exports=JSON.parse('{"label":"Delete","permalink":"/references/tags/delete","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3343],{4764:e=>{e.exports=JSON.parse('{"label":"Delete","permalink":"/references/tags/delete","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/0dffb83e.6c9e5ec7.js b/assets/js/0dffb83e.6c9e5ec7.js deleted file mode 100644 index 9fcef4da3..000000000 --- a/assets/js/0dffb83e.6c9e5ec7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5075],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=r,k=u["".concat(s,".").concat(m)]||u[m]||d[m]||o;return n?a.createElement(k,l(l({ref:t},p),{},{components:n})):a.createElement(k,l({ref:t},p))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[u]="string"==typeof e?e:r,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const o={draft:!1,title:"Roadmap",date:new Date("2023-01-10T09:00:00.000Z"),description:"Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.",category:"Documentation",keywords:["roadmap"],tags:["Roadmap","Fleek Network"]},l=void 0,i={unversionedId:"roadmap",id:"roadmap",title:"Roadmap",description:"Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.",source:"@site/docs/roadmap.md",sourceDirName:".",slug:"/roadmap",permalink:"/docs/roadmap",draft:!1,tags:[{label:"Roadmap",permalink:"/docs/tags/roadmap"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"}],version:"current",frontMatter:{draft:!1,title:"Roadmap",date:"2023-01-10T09:00:00.000Z",description:"Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.",category:"Documentation",keywords:["roadmap"],tags:["Roadmap","Fleek Network"]},sidebar:"docs",previous:{title:"Lightning CLI",permalink:"/docs/node/lightning-cli"},next:{title:"Code of Conduct",permalink:"/docs/Open-source/code-of-conduct"}},s={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Current state: Road to Testnet",id:"current-state-road-to-testnet",level:2},{value:"Phases 0 to 5",id:"phases-0-to-5",level:3},{value:"Mainnet",id:"mainnet",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"Instead of restricting our network architecture/capabilities to a CDN service, Fleek Network's core was redesigned to support a fully decentralized edge platform upon which many edge services e.g. CDN, serverless functions, amongst others, can be built. The new architecture separates each aspect of the network (blockchain - edge infrastructure - services) so that anyone can build new edge services on Fleek Network."),(0,r.kt)("p",null,"Several milestones were completed toward our next early Testnet goal: the whitepaper was launched, and the Github repo was published. "),(0,r.kt)("p",null,"For a complete description of our testnet plans, road to mainnet, and testnet participation initiatives, read the following ",(0,r.kt)("a",{parentName:"p",href:"https://blog.fleek.network/post/fleek-network-testnet-plans/"},"blog post"),"."),(0,r.kt)("h2",{id:"current-state-road-to-testnet"},"Current state: Road to Testnet"),(0,r.kt)("p",null,"Our current roadmap on the road to an early testnet stands as follows, currently in *",(0,r.kt)("em",{parentName:"p"},"Phase {0}"),":"),(0,r.kt)("h3",{id:"phases-0-to-5"},"Phases 0 to 5"),(0,r.kt)("p",null,"Fleek Network will utilize a multi-phase approach to rolling out mainnet. The current high-level plan, set out below, depends on a variety of factors and may change in response to development timelines and/or data/feedback collected throughout the different phases."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Phase 0 (September 5th): Node Rollout"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Initial network and node testing (performance, hardware specs, clustering, costs, metrics, etc.)"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Phase 1 (mid-late September): SDK/Service Rollout"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Introduce the SDK and test the building and utilizing of services on the network, as well as some optimizations based on Phase 0."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Phase 2 (October):")," ",(0,r.kt)("strong",{parentName:"li"},"Initial Economics Rollout"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Introduce and test a more concrete version of the economic algorithm, including staking, pricing, and other elements/situations using test (valueless) tokens, as well as some optimizations based on Phase 1."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Phase 3 (November): Layer 2 Contracts Rollout"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Introduce a test version of the aspects of the protocol that will live on an Ethereum L2 (staking, deposit and token contracts, communication between L2/FN, etc)."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Phase 4 (December):")," ",(0,r.kt)("strong",{parentName:"li"},"Final Rollout"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Introduce the final form of the first generation of the network, based on all data/feedback and optimizations throughout all the phases, and allow testing of what a realistic mainnet environment will be like."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Phase 5 (Q1 2024):")," ",(0,r.kt)("strong",{parentName:"li"},"Mainnet Launch"))),(0,r.kt)("p",null,"The goals for all stages involve completing and revising the following:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Network performance"),(0,r.kt)("li",{parentName:"ul"},"Hardware/node specs"),(0,r.kt)("li",{parentName:"ul"},"Sandboxing of services"),(0,r.kt)("li",{parentName:"ul"},"Packaging and pricing of initial network resources/commodities"),(0,r.kt)("li",{parentName:"ul"},"Parameters related to the FLK token"),(0,r.kt)("li",{parentName:"ul"},"Security testing/auditing"),(0,r.kt)("li",{parentName:"ul"},"Criteria for allocation of pre-mainnet community tokens")),(0,r.kt)("h2",{id:"mainnet"},"Mainnet"),(0,r.kt)("p",null,"The mainnet release of Fleek Network will come with the arrival of a stable and end-to-end tested version of the protocol. Details on the transition to mainnet will be discussed later in the future."),(0,r.kt)("p",null,"We will continue to update this roadmap in the short and long term to reflect the different stages the network goes through."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0dffb83e.98f34a7e.js b/assets/js/0dffb83e.98f34a7e.js new file mode 100644 index 000000000..765631375 --- /dev/null +++ b/assets/js/0dffb83e.98f34a7e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5075],{113:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=n(5893),s=n(1151);const r={draft:!1,title:"Roadmap",date:new Date("2023-01-10T09:00:00.000Z"),description:"Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.",category:"Documentation",keywords:["roadmap"],tags:["Roadmap","Fleek Network"]},i=void 0,a={id:"roadmap",title:"Roadmap",description:"Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.",source:"@site/docs/roadmap.md",sourceDirName:".",slug:"/roadmap",permalink:"/docs/roadmap",draft:!1,unlisted:!1,tags:[{label:"Roadmap",permalink:"/docs/tags/roadmap"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"}],version:"current",frontMatter:{draft:!1,title:"Roadmap",date:"2023-01-10T09:00:00.000Z",description:"Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.",category:"Documentation",keywords:["roadmap"],tags:["Roadmap","Fleek Network"]},sidebar:"docs",previous:{title:"Lightning CLI",permalink:"/docs/node/lightning-cli"},next:{title:"Code of Conduct",permalink:"/docs/Open-source/code-of-conduct"}},l={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Current state: Road to Testnet",id:"current-state-road-to-testnet",level:2},{value:"Phases 0 to 5",id:"phases-0-to-5",level:3},{value:"Mainnet",id:"mainnet",level:2}];function c(e){const t={a:"a",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(t.p,{children:"Instead of restricting our network architecture/capabilities to a CDN service, Fleek Network's core was redesigned to support a fully decentralized edge platform upon which many edge services e.g. CDN, serverless functions, amongst others, can be built. The new architecture separates each aspect of the network (blockchain - edge infrastructure - services) so that anyone can build new edge services on Fleek Network."}),"\n",(0,o.jsx)(t.p,{children:"Several milestones were completed toward our next early Testnet goal: the whitepaper was launched, and the Github repo was published."}),"\n",(0,o.jsxs)(t.p,{children:["For a complete description of our testnet plans, road to mainnet, and testnet participation initiatives, read the following ",(0,o.jsx)(t.a,{href:"https://blog.fleek.network/post/fleek-network-testnet-plans/",children:"blog post"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"current-state-road-to-testnet",children:"Current state: Road to Testnet"}),"\n",(0,o.jsxs)(t.p,{children:["Our current roadmap on the road to an early testnet stands as follows, currently in **Phase ",0,"*:"]}),"\n",(0,o.jsx)(t.h3,{id:"phases-0-to-5",children:"Phases 0 to 5"}),"\n",(0,o.jsx)(t.p,{children:"Fleek Network will utilize a multi-phase approach to rolling out mainnet. The current high-level plan, set out below, depends on a variety of factors and may change in response to development timelines and/or data/feedback collected throughout the different phases."}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Phase 0 (September 5th): Node Rollout"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Initial network and node testing (performance, hardware specs, clustering, costs, metrics, etc.)"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Phase 1 (mid-late September): SDK/Service Rollout"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Introduce the SDK and test the building and utilizing of services on the network, as well as some optimizations based on Phase 0."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Phase 2 (October):"})," ",(0,o.jsx)(t.strong,{children:"Initial Economics Rollout"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Introduce and test a more concrete version of the economic algorithm, including staking, pricing, and other elements/situations using test (valueless) tokens, as well as some optimizations based on Phase 1."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Phase 3 (November): Layer 2 Contracts Rollout"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Introduce a test version of the aspects of the protocol that will live on an Ethereum L2 (staking, deposit and token contracts, communication between L2/FN, etc)."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Phase 4 (December):"})," ",(0,o.jsx)(t.strong,{children:"Final Rollout"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Introduce the final form of the first generation of the network, based on all data/feedback and optimizations throughout all the phases, and allow testing of what a realistic mainnet environment will be like."}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Phase 5 (Q1 2024):"})," ",(0,o.jsx)(t.strong,{children:"Mainnet Launch"})]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"The goals for all stages involve completing and revising the following:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Network performance"}),"\n",(0,o.jsx)(t.li,{children:"Hardware/node specs"}),"\n",(0,o.jsx)(t.li,{children:"Sandboxing of services"}),"\n",(0,o.jsx)(t.li,{children:"Packaging and pricing of initial network resources/commodities"}),"\n",(0,o.jsx)(t.li,{children:"Parameters related to the FLK token"}),"\n",(0,o.jsx)(t.li,{children:"Security testing/auditing"}),"\n",(0,o.jsx)(t.li,{children:"Criteria for allocation of pre-mainnet community tokens"}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"mainnet",children:"Mainnet"}),"\n",(0,o.jsx)(t.p,{children:"The mainnet release of Fleek Network will come with the arrival of a stable and end-to-end tested version of the protocol. Details on the transition to mainnet will be discussed later in the future."}),"\n",(0,o.jsx)(t.p,{children:"We will continue to update this roadmap in the short and long term to reflect the different stages the network goes through."})]})}function h(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var o=n(7294);const s={},r=o.createContext(s);function i(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0ea1f268.80347ba6.js b/assets/js/0ea1f268.b27098e9.js similarity index 96% rename from assets/js/0ea1f268.80347ba6.js rename to assets/js/0ea1f268.b27098e9.js index ab420c973..901f8b666 100644 --- a/assets/js/0ea1f268.80347ba6.js +++ b/assets/js/0ea1f268.b27098e9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[663],{454:e=>{e.exports=JSON.parse('{"label":"restore","permalink":"/references/tags/restore","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[663],{454:e=>{e.exports=JSON.parse('{"label":"restore","permalink":"/references/tags/restore","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/0fbdd4ac.fde097b1.js b/assets/js/0fbdd4ac.514e2af7.js similarity index 87% rename from assets/js/0fbdd4ac.fde097b1.js rename to assets/js/0fbdd4ac.514e2af7.js index 09145c3e7..86588e5ad 100644 --- a/assets/js/0fbdd4ac.fde097b1.js +++ b/assets/js/0fbdd4ac.514e2af7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8934],{8944:e=>{e.exports=JSON.parse('{"label":"ownership","permalink":"/guides/tags/ownership","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8934],{8944:e=>{e.exports=JSON.parse('{"label":"ownership","permalink":"/guides/tags/ownership","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/130.2448291a.js b/assets/js/130.2448291a.js new file mode 100644 index 000000000..e05d68532 --- /dev/null +++ b/assets/js/130.2448291a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[130],{1460:(e,t,s)=>{s.d(t,{Z:()=>b});var r=s(7294),a=s(4334),n=s(8888),l=s(7524),i=s(9960),o=s(5999),c=s(6550),m=s(8596);function d(e){const{pathname:t}=(0,c.TH)();return(0,r.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,m.Mg)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=s(5893);function g(e){let{sidebar:t}=e;const s=d(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,a.Z)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,a.Z)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,a.Z)(u.sidebarItemList,"clean-list"),children:s.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.Z,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var p=s(3102);function x(e){let{sidebar:t}=e;const s=d(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:s.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function j(e){return(0,h.jsx)(p.Zo,{component:x,props:e})}function f(e){let{sidebar:t}=e;const s=(0,l.i)();return t?.items.length?"mobile"===s?(0,h.jsx)(j,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function b(e){const{sidebar:t,toc:s,children:r,...l}=e,i=t&&t.items.length>0;return(0,h.jsx)(n.Z,{...l,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(f,{sidebar:t}),(0,h.jsx)("main",{className:(0,a.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"https://schema.org/Blog",children:r}),s&&(0,h.jsx)("div",{className:"col col--2",children:s})]})})})}},390:(e,t,s)=>{s.d(t,{Z:()=>L});s(7294);var r=s(4334),a=s(9460),n=s(4996),l=s(5893);function i(e){let{children:t,className:s}=e;const{frontMatter:r,assets:i,metadata:{description:o}}=(0,a.C)(),{withBaseUrl:c}=(0,n.C)(),m=i.image??r.image,d=r.keywords??[];return(0,l.jsxs)("article",{className:s,itemProp:"blogPost",itemScope:!0,itemType:"https://schema.org/BlogPosting",children:[o&&(0,l.jsx)("meta",{itemProp:"description",content:o}),m&&(0,l.jsx)("link",{itemProp:"image",href:c(m,{absolute:!0})}),d.length>0&&(0,l.jsx)("meta",{itemProp:"keywords",content:d.join(",")}),t]})}var o=s(9960);const c={title:"title_f1Hy"};function m(e){let{className:t}=e;const{metadata:s,isBlogPostPage:n}=(0,a.C)(),{permalink:i,title:m}=s,d=n?"h1":"h2";return(0,l.jsx)(d,{className:(0,r.Z)(c.title,t),itemProp:"headline",children:n?m:(0,l.jsx)(o.Z,{itemProp:"url",to:i,children:m})})}var d=s(5999),u=s(8824);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const s=function(){const{selectMessage:e}=(0,u.c)();return t=>{const s=Math.ceil(t);return e(s,(0,d.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:s}))}}();return(0,l.jsx)(l.Fragment,{children:s(t)})}function p(e){let{date:t,formattedDate:s}=e;return(0,l.jsx)("time",{dateTime:t,itemProp:"datePublished",children:s})}function x(){return(0,l.jsx)(l.Fragment,{children:" \xb7 "})}function j(e){let{className:t}=e;const{metadata:s}=(0,a.C)(),{date:n,formattedDate:i,readingTime:o}=s;return(0,l.jsxs)("div",{className:(0,r.Z)(h.container,"margin-vert--md",t),children:[(0,l.jsx)(p,{date:n,formattedDate:i}),void 0!==o&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(x,{}),(0,l.jsx)(g,{readingTime:o})]})]})}function f(e){return e.href?(0,l.jsx)(o.Z,{...e}):(0,l.jsx)(l.Fragment,{children:e.children})}function b(e){let{author:t,className:s}=e;const{name:a,title:n,url:i,imageURL:o,email:c}=t,m=i||c&&`mailto:${c}`||void 0;return(0,l.jsxs)("div",{className:(0,r.Z)("avatar margin-bottom--sm",s),children:[o&&(0,l.jsx)(f,{href:m,className:"avatar__photo-link",children:(0,l.jsx)("img",{className:"avatar__photo",src:o,alt:a,itemProp:"image"})}),a&&(0,l.jsxs)("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person",children:[(0,l.jsx)("div",{className:"avatar__name",children:(0,l.jsx)(f,{href:m,itemProp:"url",children:(0,l.jsx)("span",{itemProp:"name",children:a})})}),n&&(0,l.jsx)("small",{className:"avatar__subtitle",itemProp:"description",children:n})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function P(e){let{className:t}=e;const{metadata:{authors:s},assets:n}=(0,a.C)();if(0===s.length)return null;const i=s.every((e=>{let{name:t}=e;return!t}));return(0,l.jsx)("div",{className:(0,r.Z)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:s.map(((e,t)=>(0,l.jsx)("div",{className:(0,r.Z)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,l.jsx)(b,{author:{...e,imageURL:n.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,l.jsxs)("header",{children:[(0,l.jsx)(m,{}),(0,l.jsx)(j,{}),(0,l.jsx)(P,{})]})}var _=s(8780),k=s(2459);function Z(e){let{children:t,className:s}=e;const{isBlogPostPage:n}=(0,a.C)();return(0,l.jsx)("div",{id:n?_.blogPostContainerID:void 0,className:(0,r.Z)("markdown",s),itemProp:"articleBody",children:(0,l.jsx)(k.Z,{children:t})})}var I=s(4881),C=s(1526);function w(){return(0,l.jsx)("b",{children:(0,l.jsx)(d.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function T(e){const{blogPostTitle:t,...s}=e;return(0,l.jsx)(o.Z,{"aria-label":(0,d.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...s,children:(0,l.jsx)(w,{})})}const y={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function F(){const{metadata:e,isBlogPostPage:t}=(0,a.C)(),{tags:s,title:n,editUrl:i,hasTruncateMarker:o}=e,c=!t&&o,m=s.length>0;return m||c||i?(0,l.jsxs)("footer",{className:(0,r.Z)("row docusaurus-mt-lg",t&&y.blogPostFooterDetailsFull),children:[m&&(0,l.jsx)("div",{className:(0,r.Z)("col",{"col--9":c}),children:(0,l.jsx)(C.Z,{tags:s})}),t&&i&&(0,l.jsx)("div",{className:"col margin-top--sm",children:(0,l.jsx)(I.Z,{editUrl:i})}),c&&(0,l.jsx)("div",{className:(0,r.Z)("col text--right",{"col--3":m}),children:(0,l.jsx)(T,{blogPostTitle:n,to:e.permalink})})]}):null}function L(e){let{children:t,className:s}=e;const n=function(){const{isBlogPostPage:e}=(0,a.C)();return e?void 0:"margin-bottom--xl"}();return(0,l.jsxs)(i,{className:(0,r.Z)(n,s),children:[(0,l.jsx)(N,{}),(0,l.jsx)(Z,{children:t}),(0,l.jsx)(F,{})]})}},9460:(e,t,s)=>{s.d(t,{C:()=>o,n:()=>i});var r=s(7294),a=s(902),n=s(5893);const l=r.createContext(null);function i(e){let{children:t,content:s,isBlogPostPage:a=!1}=e;const i=function(e){let{content:t,isBlogPostPage:s}=e;return(0,r.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:s})),[t,s])}({content:s,isBlogPostPage:a});return(0,n.jsx)(l.Provider,{value:i,children:t})}function o(){const e=(0,r.useContext)(l);if(null===e)throw new a.i6("BlogPostProvider");return e}},8824:(e,t,s)=>{s.d(t,{c:()=>c});var r=s(7294),a=s(2263);const n=["zero","one","two","few","many","other"];function l(e){return n.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,a.Z)();return(0,r.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,s)=>function(e,t,s){const r=e.split("|");if(1===r.length)return r[0];r.length>s.pluralForms.length&&console.error(`For locale=${s.locale}, a maximum of ${s.pluralForms.length} plural forms are expected (${s.pluralForms.join(",")}), but the message contains ${r.length}: ${e}`);const a=s.select(t),n=s.pluralForms.indexOf(a);return r[Math.min(n,r.length-1)]}(s,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/1366d7ae.4fb5075d.js b/assets/js/1366d7ae.4fb5075d.js new file mode 100644 index 000000000..16e832a97 --- /dev/null +++ b/assets/js/1366d7ae.4fb5075d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2564],{5468:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>g,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=i(5893),s=i(1151),o=i(3872);const a={title:"Lightning CLI",slug:"lightning-cli",hide_title:!0,tags:["command line interface","cli","lightning","lgtn"]},l=void 0,c={id:"node/lightning-cli",title:"Lightning CLI",description:"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.",source:"@site/docs/node/lightning-cli.md",sourceDirName:"node",slug:"/node/lightning-cli",permalink:"/docs/node/lightning-cli",draft:!1,unlisted:!1,tags:[{label:"command line interface",permalink:"/docs/tags/command-line-interface"},{label:"cli",permalink:"/docs/tags/cli"},{label:"lightning",permalink:"/docs/tags/lightning"},{label:"lgtn",permalink:"/docs/tags/lgtn"}],version:"current",frontMatter:{title:"Lightning CLI",slug:"lightning-cli",hide_title:!0,tags:["command line interface","cli","lightning","lgtn"]},sidebar:"docs",previous:{title:"Systemd Service",permalink:"/docs/node/systemd-service"},next:{title:"Roadmap",permalink:"/docs/roadmap"}},r={},h=[{value:"Show the Lightning CLI help",id:"show-the-lightning-cli-help",level:2},{value:"Finding help for a specific option",id:"finding-help-for-a-specific-option",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command."}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["A quick reference of frequently used commands are available for ",(0,t.jsx)(n.a,{href:"/references/Lightning%20CLI/frequently-used-commands-for-native-setup",children:"native"})," and ",(0,t.jsx)(n.a,{href:"/references/Docker/frequently-used-commands-for-docker-setup",children:"docker"})," setups."]})}),"\n",(0,t.jsx)(n.h2,{id:"show-the-lightning-cli-help",children:"Show the Lightning CLI help"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"lgtn help\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"Usage: lgtn [OPTIONS] \n\nCommands:\n run Run the full node\n keys Key management utilities\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n --with-console Enable the Tokio Console asynchronous debugger\n --with-log-locations Enable code locations when printing logs\n -v... Increases the level of verbosity (the max level is -vvv)\n -h, --help Print help\n -V, --version Print version\n"})}),"\n",(0,t.jsx)(n.h2,{id:"finding-help-for-a-specific-option",children:"Finding help for a specific option"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"lgtn keys help\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"Key management utilities\n\nUsage: lgtn keys [OPTIONS] \n\nCommands:\n show Print the node's public keys\n generate Generate new private keys. This command will fail if the keys already exist\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n --with-console Enable the Tokio Console asynchronous debugger\n --with-log-locations Enable code locations when printing logs\n -v... Increases the level of verbosity (the max level is -vvv)\n -h, --help Print help\n"})}),"\n",(0,t.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function g(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},3872:(e,n,i)=>{i.d(n,{Z:()=>s});i(7294);var t=i(5893);const s=e=>{let{image:n,name:i,title:s,url:o,communityMember:a=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:o,target:"_blank",alt:i,children:(0,t.jsx)("img",{src:n,alt:i})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:o,target:"_blank",alt:i,children:i})}),(0,t.jsx)("span",{className:"title",children:s}),(0,t.jsxs)("span",{className:"discord",children:[a?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,i)=>{i.d(n,{Z:()=>l,a:()=>a});var t=i(7294);const s={},o=t.createContext(s);function a(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1366d7ae.fe7fc0fe.js b/assets/js/1366d7ae.fe7fc0fe.js deleted file mode 100644 index e215cc7e4..000000000 --- a/assets/js/1366d7ae.fe7fc0fe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2564],{3905:(e,n,t)=>{t.d(n,{Zo:()=>g,kt:()=>p});var i=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function r(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=i.createContext({}),c=function(e){var n=i.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},g=function(e){var n=c(e.components);return i.createElement(s.Provider,{value:n},e.children)},h="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},d=i.forwardRef((function(e,n){var t=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,g=l(e,["components","mdxType","originalType","parentName"]),h=c(t),d=a,p=h["".concat(s,".").concat(d)]||h[d]||m[d]||r;return t?i.createElement(p,o(o({ref:n},g),{},{components:t})):i.createElement(p,o({ref:n},g))}));function p(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var r=t.length,o=new Array(r);o[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l[h]="string"==typeof e?e:a,o[1]=l;for(var c=2;c{t.d(n,{Z:()=>a});var i=t(7294);const a=e=>{let{image:n,name:t,title:a,url:r,communityMember:o=!1}=e;return i.createElement("section",{className:"author_card"},i.createElement("div",null,i.createElement("span",{className:"avatar"},i.createElement("a",{href:r,target:"_blank",alt:t},i.createElement("img",{src:n,alt:t}))),i.createElement("div",null,i.createElement("span",{className:"name"},i.createElement("a",{href:r,target:"_blank",alt:t},t)),i.createElement("span",{className:"title"},a),i.createElement("span",{className:"discord"},o?"Join our community on":"Got questions? Find us on"," ",i.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},9963:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>g});var i=t(7462),a=(t(7294),t(3905)),r=t(3872);const o={title:"Lightning CLI",slug:"lightning-cli",hide_title:!0,tags:["command line interface","cli","lightning","lgtn"]},l=void 0,s={unversionedId:"node/lightning-cli",id:"node/lightning-cli",title:"Lightning CLI",description:"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.",source:"@site/docs/node/lightning-cli.md",sourceDirName:"node",slug:"/node/lightning-cli",permalink:"/docs/node/lightning-cli",draft:!1,tags:[{label:"command line interface",permalink:"/docs/tags/command-line-interface"},{label:"cli",permalink:"/docs/tags/cli"},{label:"lightning",permalink:"/docs/tags/lightning"},{label:"lgtn",permalink:"/docs/tags/lgtn"}],version:"current",frontMatter:{title:"Lightning CLI",slug:"lightning-cli",hide_title:!0,tags:["command line interface","cli","lightning","lgtn"]},sidebar:"docs",previous:{title:"Systemd Service",permalink:"/docs/node/systemd-service"},next:{title:"Roadmap",permalink:"/docs/roadmap"}},c={},g=[{value:"Show the Lightning CLI help",id:"show-the-lightning-cli-help",level:2},{value:"Finding help for a specific option",id:"finding-help-for-a-specific-option",level:2}],h={toc:g},m="wrapper";function d(e){let{components:n,...t}=e;return(0,a.kt)(m,(0,i.Z)({},h,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"A quick reference of frequently used commands are available for ",(0,a.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/frequently-used-commands-for-native-setup"},"native")," and ",(0,a.kt)("a",{parentName:"p",href:"/references/Docker/frequently-used-commands-for-docker-setup"},"docker")," setups.")),(0,a.kt)("h2",{id:"show-the-lightning-cli-help"},"Show the Lightning CLI help"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn help\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"Usage: lgtn [OPTIONS] \n\nCommands:\n run Run the full node\n keys Key management utilities\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n --with-console Enable the Tokio Console asynchronous debugger\n --with-log-locations Enable code locations when printing logs\n -v... Increases the level of verbosity (the max level is -vvv)\n -h, --help Print help\n -V, --version Print version\n")),(0,a.kt)("h2",{id:"finding-help-for-a-specific-option"},"Finding help for a specific option"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn keys help\n")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"Key management utilities\n\nUsage: lgtn keys [OPTIONS] \n\nCommands:\n show Print the node's public keys\n generate Generate new private keys. This command will fail if the keys already exist\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n --with-console Enable the Tokio Console asynchronous debugger\n --with-log-locations Enable code locations when printing logs\n -v... Increases the level of verbosity (the max level is -vvv)\n -h, --help Print help\n")),(0,a.kt)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/13986d62.279d55ed.js b/assets/js/13986d62.c1425471.js similarity index 96% rename from assets/js/13986d62.279d55ed.js rename to assets/js/13986d62.c1425471.js index b49f1736a..1c5d912cd 100644 --- a/assets/js/13986d62.279d55ed.js +++ b/assets/js/13986d62.c1425471.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9822],{8973:e=>{e.exports=JSON.parse('{"label":"cli","permalink":"/references/tags/cli","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","permalink":"/references/Lightning CLI/frequently-used-commands-for-native-setup"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9822],{8973:e=>{e.exports=JSON.parse('{"label":"cli","permalink":"/references/tags/cli","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","permalink":"/references/Lightning CLI/frequently-used-commands-for-native-setup"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/1426.39540556.js b/assets/js/1426.8a7f4119.js similarity index 99% rename from assets/js/1426.39540556.js rename to assets/js/1426.8a7f4119.js index ba5c1324a..966a18707 100644 --- a/assets/js/1426.39540556.js +++ b/assets/js/1426.8a7f4119.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1426],{6672:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;ipn});var a=function(){};function c(e){var t=e.item,r=e.items;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(s){u=!0,o=s}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(u)throw o}}return c}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t=3||2===r&&n>=4||1===r&&n>=10);function i(t,r,n){if(o&&void 0!==n){var i=n[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(p(r),[{headers:a}]))}else e.apply(void 0,[t].concat(p(r)))}return{init:function(t,r){e("init",{appId:t,apiKey:r})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&t.reduce((function(e,t){var r=t.items,n=d(t,f);return[].concat(p(e),p(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,r=[],n=0;n0&&e.apply(void 0,["viewedFilters"].concat(r))}}}function S(e){var t=e.items.reduce((function(e,t){var r;return e[t.__autocomplete_indexName]=(null!==(r=e[t.__autocomplete_indexName])&&void 0!==r?r:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function j(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e){return function(e){if(Array.isArray(e))return P(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return P(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return P(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&C({onItemsChange:o,items:r,insights:f,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,r=e.onSelect,n=e.onActive;s("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:f}}),r((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&l({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Selected"},c({item:t,items:m.current}))]})})),n((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&u({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Active"},c({item:t,items:m.current}))]})}))},onStateChange:function(e){var t=e.state;p({state:t})},__autocomplete_pluginOptions:e}}function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==_(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function R(e,t,r){var n,o=t.initialState;return{getState:function(){return o},dispatch:function(n,i){var a=function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(V++),plugins:o,initialState:X({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(Q(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:a,onResolve:a};Object.keys(t).forEach((function(e){t[e].__default=!0}));var n=$($({},t),e);return Promise.resolve(n)})))}))}(e,r)}))).then((function(e){return L(e)})).then((function(e){return e.map((function(e){return X(X({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))},onResolve:function(r){e.onResolve(r),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:X({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}function te(e){return te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},te(e)}function re(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ne(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ie,De,Ae,ke=null,xe=(Ie=-1,De=-1,Ae=void 0,function(e){var t=++Ie;return Promise.resolve(e).then((function(e){return Ae&&t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function He(e){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(e)}var Fe=["props","refresh","store"],Ue=["inputElement","formElement","panelElement"],Be=["inputElement"],Ve=["inputElement","maxLength"],Ke=["sourceIndex"],$e=["sourceIndex"],Je=["item","source","sourceIndex"];function ze(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function We(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e){var t=e.props,r=e.refresh,n=e.store,o=Ze(e,Fe),i=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,i=e.panelElement;function a(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,i].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return We({onTouchStart:a,onMouseDown:a,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},Ze(e,Ue))},getRootProps:function(e){return We({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return We({action:"",noValidate:!0,role:"search",onSubmit:function(i){var a;i.preventDefault(),t.onSubmit(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(a=e.inputElement)||void 0===a||a.blur()},onReset:function(i){var a;i.preventDefault(),t.onReset(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(a=e.inputElement)||void 0===a||a.focus()}},Ze(e,Be))},getLabelProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,Ke);return We({htmlFor:"".concat(i(t.id,n),"-input"),id:"".concat(i(t.id,n),"-label")},o)},getInputProps:function(e){var i;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Ce(We({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var l=e||{},u=(l.inputElement,l.maxLength),s=void 0===u?512:u,f=Ze(l,Ve),m=ge(n.getState()),p=function(e){return Boolean(e&&e.match(Me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),v=null!=m&&m.itemUrl&&!p?"go":"search";return We({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:v,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Ce(We({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,i=Le(e,_e);if("ArrowUp"===t.key||"ArrowDown"===t.key){var a=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},c=function(){var e=ge(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,a=e.itemInputValue,c=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:r,itemInputValue:a,itemUrl:c,refresh:n,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Ce(qe({event:t,props:r,query:o.getState().query,refresh:n,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),c(),setTimeout(a,0)})):(o.dispatch(t.key,{}),c(),a())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ge(o.getState()),u=l.item,s=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewTab({itemUrl:f,item:u,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewWindow({itemUrl:f,item:u,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),void r.navigator.navigate({itemUrl:f,item:u,state:o.getState()});Ce(qe({event:t,nextState:{isOpen:!1},props:r,query:s,refresh:n,store:o},i)).then((function(){m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i))}))}}}(We({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:a,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},f)},getPanelProps:function(e){return We({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,$e);return We({role:"listbox","aria-labelledby":"".concat(i(t.id,n),"-label"),id:"".concat(i(t.id,n),"-list")},o)},getItemProps:function(e){var a=e.item,c=e.source,l=e.sourceIndex,u=Ze(e,Je);return We({id:"".concat(i(t.id,l),"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=ge(n.getState());if(null!==n.getState().activeItemId&&t){var i=t.item,c=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(We({event:e,item:i,itemInputValue:c,itemUrl:l,refresh:r,source:u,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Ce(We({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(We({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},u)}}}var Xe=[{segment:"autocomplete-core",version:"1.9.3"}];function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t=r?null===n?null:0:o}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}function ct(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function lt(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){var t=e.translations,r=void 0===t?{}:t,n=At(e,Pt),o=r.noResultsText,i=void 0===o?"No results for":o,a=r.suggestedQueryText,c=void 0===a?"Try searching for":a,l=r.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,s=r.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,m=n.state.context.searchSuggestions;return yt.createElement("div",{className:"DocSearch-NoResults"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(Et,null)),yt.createElement("p",{className:"DocSearch-Title"},i,' "',yt.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&yt.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},yt.createElement("p",{className:"DocSearch-Help"},c,":"),yt.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(It(e),[yt.createElement("li",{key:t},yt.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&yt.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),yt.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var xt=function(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ct(e){switch(e.type){case"lvl1":return yt.createElement(xt,null);case"content":return yt.createElement(_t,null);default:return yt.createElement(Nt,null)}}function Nt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function _t(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Tt(){return yt.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),yt.createElement("path",{d:"M8 17l-6-6 6-6"})))}var qt=["hit","attribute","tagName"];function Rt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ft(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,i=Ht(e,qt);return(0,yt.createElement)(o,Lt(Lt({},i),{},{dangerouslySetInnerHTML:{__html:Ft(t,"_snippetResult.".concat(r,".value"))||Ft(t,r)}}))}function Bt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Vt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r|<\/mark>)/g,Wt=RegExp(zt.source);function Qt(e){var t,r,n=e;if(!n.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((n.__docsearch_parent?null===(t=n.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(r=e._highlightResult)||void 0===r||null===(r=r.hierarchy)||void 0===r?void 0:r.lvl0)||{}).value;return o&&Wt.test(o)?o.replace(zt,""):o}function Zt(){return Zt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function or(e){var t=e.translations,r=void 0===t?{}:t,n=nr(e,tr),o=r.recentSearchesTitle,i=void 0===o?"Recent":o,a=r.noRecentSearchesText,c=void 0===a?"No recent searches":a,l=r.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,s=r.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,v=r.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:yt.createElement("div",{className:"DocSearch-StartScreen"},yt.createElement("p",{className:"DocSearch-Help"},c)):!1===n.hasCollections?null:yt.createElement("div",{className:"DocSearch-Dropdown-Container"},yt.createElement($t,rr({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Xt,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(Yt,null))),yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(er,null))))}})),yt.createElement($t,rr({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Yt,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},yt.createElement(er,null)))}})))}var ir=["translations"];function ar(){return ar=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var lr=yt.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=cr(e,ir);if("error"===n.state.status)return yt.createElement(wt,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?yt.createElement(kt,ar({},n,{translations:null==r?void 0:r.noResultsScreen})):yt.createElement(Gt,n):yt.createElement(or,ar({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function ur(){return yt.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},yt.createElement("g",{fill:"none",fillRule:"evenodd"},yt.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},yt.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),yt.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},yt.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var sr=r(830),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vr(e){var t=e.translations,r=void 0===t?{}:t,n=pr(e,fr),o=r.resetButtonTitle,i=void 0===o?"Clear the query":o,a=r.resetButtonAriaLabel,c=void 0===a?"Clear the query":a,l=r.cancelButtonText,u=void 0===l?"Cancel":l,s=r.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return yt.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),yt.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),yt.createElement(yt.Fragment,null,yt.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},yt.createElement("label",mr({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),yt.createElement(sr.W,null)),yt.createElement("div",{className:"DocSearch-LoadingIndicator"},yt.createElement(ur,null)),yt.createElement("input",mr({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:ht}))),yt.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},yt.createElement(er,null))),yt.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},u))}var dr=["_highlightResult","_snippetResult"];function yr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function hr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function br(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=hr(t),i=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,yr(t,dr)),a=i.findIndex((function(e){return e.objectID===r.objectID}));a>-1&&i.splice(a,1),i.unshift(r),i=i.slice(0,n),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}function gr(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}"),i=e=>{n().setItem(t,JSON.stringify(e))};return{get:(t,r,n={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,r=o(),n=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(i(n),!t)return;const a=Object.fromEntries(Object.entries(n).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+tPromise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:r},n().setItem(t,JSON.stringify(i)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Or(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Or({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Or({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Or({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Or({caches:t}).clear()))}}function Sr(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(r);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const a=n(),c=o&&o.miss||(()=>Promise.resolve());return a.then((e=>c(e))).then((()=>a))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function jr(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function wr(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Er(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Pr="4.19.1",Ir={WithinQueryParameters:0,WithinHeaders:1};function Dr(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ar={Read:1,Write:2,Any:3},kr={Up:1,Down:2,Timeouted:3},xr=12e4;function Cr(e,t=kr.Up){return{...e,status:t,lastUpdate:Date.now()}}function Nr(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ar.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ar.Any}}const _r={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function Tr(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Cr(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===kr.Up||Date.now()-e.lastUpdate>xr}(e))),n=e.filter((e=>function(e){return e.status===kr.Timeouted&&Date.now()-e.lastUpdate<=xr}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>Nr(e))):t}}))}const qr=(e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e);function Rr(e,t,r,n){const o=[],i=function(e,t){if(e.method===_r.Get||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),a=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),c=r.method,l=r.method!==_r.Get?{}:{...r.data,...n.data},u={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let s=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Fr(o)};const p={data:i,headers:a,method:c,url:Mr(m,r.path,u),connectTimeout:l(s,e.timeouts.connect),responseTimeout:l(s,n.timeout)},v=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},d={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=v(r);return r.isTimedOut&&s++,Promise.all([e.logger.info("Retryable failure",Ur(n)),e.hostsCache.set(m,Cr(m,r.isTimedOut?kr.Timeouted:kr.Down))]).then((()=>f(t,l)))},onFail(e){throw v(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,Fr(o))}};return e.requester.send(p).then((e=>qr(e,d)))};return Tr(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Lr(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Mr(e,t,r){const n=Hr(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Hr(e){return Object.keys(e).map((t=>{return Er("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function Fr(e){return e.map((e=>Ur(e)))}function Ur(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Br=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Ir.WithinHeaders?n:{},queryParameters:()=>e===Ir.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Ir.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,hosts:l,queryParameters:u,headers:s}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,headers:s,queryParameters:u,hosts:l.map((e=>Nr(e))),read(e,t){const r=Dr(t,f.timeouts.read),n=()=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Write))),e,Dr(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ar.Read},{url:`${t}.algolia.net`,accept:Ar.Write}].concat(jr([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return wr(o,e.methods)},Vr=e=>(t,r)=>t.method===_r.Get?e.transporter.read(t,r):e.transporter.write(t,r),Kr=e=>(t,r={})=>wr({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),$r=e=>(t,r)=>{const n=t.map((e=>({...e,params:Hr(e.params||{})})));return e.transporter.read({method:_r.Post,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},Jr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...i}=t.params;return Kr(e)(t.indexName,{methods:{searchForFacetValues:Qr}}).searchForFacetValues(n,o,{...r,...i})}))),zr=e=>(t,r,n)=>e.transporter.read({method:_r.Post,path:Er("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),Wr=e=>(t,r)=>e.transporter.read({method:_r.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:_r.Post,path:Er("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),Zr={Debug:1,Info:2,Error:3};function Gr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let i;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(o),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=Zr.Error,{debug:(e,t)=>(Zr.Debug>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Zr.Info>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Sr(),requestsCache:Sr({serializable:!1}),hostsCache:Or({caches:[gr({key:`${Pr}-${e}`}),Sr()]}),userAgent:Lr(Pr).add({segment:"Browser",version:"lite"}),authMode:Ir.WithinQueryParameters};var o;return Br({...n,...r,methods:{search:$r,searchForFacetValues:Jr,multipleQueries:$r,multipleSearchForFacetValues:Jr,customRequest:Vr,initIndex:e=>t=>Kr(e)(t,{methods:{search:Wr,searchForFacetValues:Qr,findAnswers:zr}})}})}Gr.version=Pr;const Xr=Gr;var Yr="3.5.2";function en(){}function tn(e){return e}function rn(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function nn(e,t,r){return e.reduce((function(e,n){var o=t(n);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(r||5)&&e[o].push(n),e}),{})}var on=["footer","searchBox"];function an(){return an=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pn(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,i=void 0===o?"Search docs":o,a=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?en:l,s=e.transformItems,f=void 0===s?tn:s,m=e.hitComponent,p=void 0===m?St:m,v=e.resultsFooterComponent,d=void 0===v?function(){return null}:v,y=e.navigator,h=e.initialScrollY,b=void 0===h?0:h,g=e.transformSearchClient,O=void 0===g?tn:g,S=e.disableUserPersonalization,j=void 0!==S&&S,w=e.initialQuery,E=void 0===w?"":w,P=e.translations,I=void 0===P?{}:P,D=e.getMissingResultsUrl,A=e.insights,k=void 0!==A&&A,x=I.footer,C=I.searchBox,N=mn(I,on),_=sn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=_[0],q=_[1],R=yt.useRef(null),L=yt.useRef(null),M=yt.useRef(null),H=yt.useRef(null),F=yt.useRef(null),U=yt.useRef(10),B=yt.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,ht):"").current,V=yt.useRef(E||B).current,K=function(e,t,r){return yt.useMemo((function(){var n=Xr(e,t);return n.addAlgoliaAgent("docsearch",Yr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",Yr),r(n)}),[e,t,r])}(t,r,O),$=yt.useRef(br({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,J=yt.useRef(br({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===$.getAll().length?7:4})).current,z=yt.useCallback((function(e){if(!j){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===$.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&J.add(t)}}),[$,J,j]),W=yt.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,r={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(r)}}),[T.context.algoliaInsightsPlugin]),Q=yt.useMemo((function(){return dt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:y,onStateChange:function(e){q(e.state)},getSources:function(e){var o=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!o)return j?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return J.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return $.getAll()}}];var m=Boolean(k);return K.search([{query:o,indexName:n,params:ln({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(U.current),"hierarchy.lvl2:".concat(U.current),"hierarchy.lvl3:".concat(U.current),"hierarchy.lvl4:".concat(U.current),"hierarchy.lvl5:".concat(U.current),"hierarchy.lvl6:".concat(U.current),"content:".concat(U.current)],snippetEllipsisText:"\u2026",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:m},a)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],a=o.hits,s=o.nbHits,p=nn(a,(function(e){return Qt(e)}),c);i.context.searchSuggestions.length0&&(X(),F.current&&F.current.focus())}),[V,X]),yt.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),yt.createElement("div",an({ref:R},G({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),yt.createElement("div",{className:"DocSearch-Modal",ref:L},yt.createElement("header",{className:"DocSearch-SearchBar",ref:M},yt.createElement(vr,an({},Q,{state:T,autoFocus:0===V.length,inputRef:F,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:u}))),yt.createElement("div",{className:"DocSearch-Dropdown",ref:H},yt.createElement(lr,an({},Q,{indexName:n,state:T,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:j,recentSearches:J,favoriteSearches:$,inputRef:F,translations:N,getMissingResultsUrl:D,onItemClick:function(e,t){W(e),z(e),rn(t)||u()}}))),yt.createElement("footer",{className:"DocSearch-Footer"},yt.createElement(Ot,{translations:x}))))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1426],{6672:(e,t,r)=>{function n(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;ipn});var a=function(){};function c(e){var t=e.item,r=e.items;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex((function(e){return e.objectID===t.objectID}))],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],l=!0,u=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);l=!0);}catch(s){u=!0,o=s}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(u)throw o}}return c}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return u(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return u(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t=3||2===r&&n>=4||1===r&&n>=10);function i(t,r,n){if(o&&void 0!==n){var i=n[0].__autocomplete_algoliaCredentials,a={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(p(r),[{headers:a}]))}else e.apply(void 0,[t].concat(p(r)))}return{init:function(t,r){e("init",{appId:t,apiKey:r})},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("clickedObjectIDsAfterSearch",g(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("clickedObjectIDs",g(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n0&&e.apply(void 0,["clickedFilters"].concat(r))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("convertedObjectIDsAfterSearch",g(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&i("convertedObjectIDs",g(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,r=new Array(t),n=0;n0&&e.apply(void 0,["convertedFilters"].concat(r))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r0&&t.reduce((function(e,t){var r=t.items,n=d(t,f);return[].concat(p(e),p(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,r=[],n=0;n0&&e.apply(void 0,["viewedFilters"].concat(r))}}}function S(e){var t=e.items.reduce((function(e,t){var r;return e[t.__autocomplete_indexName]=(null!==(r=e[t.__autocomplete_indexName])&&void 0!==r?r:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function j(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e){return function(e){if(Array.isArray(e))return P(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return P(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return P(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r0&&C({onItemsChange:o,items:r,insights:f,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,r=e.onSelect,n=e.onActive;s("addAlgoliaAgent","insights-plugin"),t({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:f}}),r((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&l({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Selected"},c({item:t,items:m.current}))]})})),n((function(e){var t=e.item,r=e.state,n=e.event;j(t)&&u({state:r,event:n,insights:f,item:t,insightsEvents:[D({eventName:"Item Active"},c({item:t,items:m.current}))]})}))},onStateChange:function(e){var t=e.state;p({state:t})},__autocomplete_pluginOptions:e}}function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function q(e,t,r){return(t=function(e){var t=function(e,t){if("object"!==_(e)||null===e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!==_(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===_(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function R(e,t,r){var n,o=t.initialState;return{getState:function(){return o},dispatch:function(n,i){var a=function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r0},reshape:function(e){return e.sources}},e),{},{id:null!==(r=e.id)&&void 0!==r?r:"autocomplete-".concat(V++),plugins:o,initialState:X({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var r;null===(r=e.onStateChange)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onStateChange)||void 0===r?void 0:r.call(e,t)}))},onSubmit:function(t){var r;null===(r=e.onSubmit)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onSubmit)||void 0===r?void 0:r.call(e,t)}))},onReset:function(t){var r;null===(r=e.onReset)||void 0===r||r.call(e,t),o.forEach((function(e){var r;return null===(r=e.onReset)||void 0===r?void 0:r.call(e,t)}))},getSources:function(r){return Promise.all([].concat(Q(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var r=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,r.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));r.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:a,onResolve:a};Object.keys(t).forEach((function(e){t[e].__default=!0}));var n=$($({},t),e);return Promise.resolve(n)})))}))}(e,r)}))).then((function(e){return L(e)})).then((function(e){return e.map((function(e){return X(X({},e),{},{onSelect:function(r){e.onSelect(r),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,r)}))},onActive:function(r){e.onActive(r),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,r)}))},onResolve:function(r){e.onResolve(r),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,r)}))}})}))}))},navigator:X({navigate:function(e){var t=e.itemUrl;n.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,r=n.open(t,"_blank","noopener");null==r||r.focus()},navigateNewWindow:function(e){var t=e.itemUrl;n.open(t,"_blank","noopener")}},e.navigator)})}function te(e){return te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},te(e)}function re(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function ne(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Ie,De,Ae,ke=null,xe=(Ie=-1,De=-1,Ae=void 0,function(e){var t=++Ie;return Promise.resolve(e).then((function(e){return Ae&&t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var Me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function He(e){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(e)}var Fe=["props","refresh","store"],Ue=["inputElement","formElement","panelElement"],Be=["inputElement"],Ve=["inputElement","maxLength"],Ke=["sourceIndex"],$e=["sourceIndex"],Je=["item","source","sourceIndex"];function ze(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function We(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ge(e){var t=e.props,r=e.refresh,n=e.store,o=Ze(e,Fe),i=function(e,t){return void 0!==t?"".concat(e,"-").concat(t):e};return{getEnvironmentProps:function(e){var r=e.inputElement,o=e.formElement,i=e.panelElement;function a(e){!n.getState().isOpen&&n.pendingRequests.isEmpty()||e.target===r||!1===[o,i].some((function(t){return r=t,n=e.target,r===n||r.contains(n);var r,n}))&&(n.dispatch("blur",null),t.debug||n.pendingRequests.cancelAll())}return We({onTouchStart:a,onMouseDown:a,onTouchMove:function(e){!1!==n.getState().isOpen&&r===t.environment.document.activeElement&&e.target!==r&&r.blur()}},Ze(e,Ue))},getRootProps:function(e){return We({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label")},e)},getFormProps:function(e){e.inputElement;return We({action:"",noValidate:!0,role:"search",onSubmit:function(i){var a;i.preventDefault(),t.onSubmit(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),null===(a=e.inputElement)||void 0===a||a.blur()},onReset:function(i){var a;i.preventDefault(),t.onReset(We({event:i,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),null===(a=e.inputElement)||void 0===a||a.focus()}},Ze(e,Be))},getLabelProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,Ke);return We({htmlFor:"".concat(i(t.id,n),"-input"),id:"".concat(i(t.id,n),"-label")},o)},getInputProps:function(e){var i;function c(e){(t.openOnFocus||Boolean(n.getState().query))&&Ce(We({event:e,props:t,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var l=e||{},u=(l.inputElement,l.maxLength),s=void 0===u?512:u,f=Ze(l,Ve),m=ge(n.getState()),p=function(e){return Boolean(e&&e.match(Me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),v=null!=m&&m.itemUrl&&!p?"go":"search";return We({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&null!==n.getState().activeItemId?"".concat(t.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(t.id,"-list"):void 0,"aria-labelledby":"".concat(t.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(t.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:v,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:s,type:"search",onChange:function(e){Ce(We({event:e,props:t,query:e.currentTarget.value.slice(0,s),refresh:r,store:n},o))},onKeyDown:function(e){!function(e){var t=e.event,r=e.props,n=e.refresh,o=e.store,i=Le(e,_e);if("ArrowUp"===t.key||"ArrowDown"===t.key){var a=function(){var e=r.environment.document.getElementById("".concat(r.id,"-item-").concat(o.getState().activeItemId));e&&(e.scrollIntoViewIfNeeded?e.scrollIntoViewIfNeeded(!1):e.scrollIntoView(!1))},c=function(){var e=ge(o.getState());if(null!==o.getState().activeItemId&&e){var r=e.item,a=e.itemInputValue,c=e.itemUrl,l=e.source;l.onActive(qe({event:t,item:r,itemInputValue:a,itemUrl:c,refresh:n,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(r.openOnFocus||Boolean(o.getState().query))?Ce(qe({event:t,props:r,query:o.getState().query,refresh:n,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:r.defaultActiveItemId}),c(),setTimeout(a,0)})):(o.dispatch(t.key,{}),c(),a())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(r.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=ge(o.getState()),u=l.item,s=l.itemInputValue,f=l.itemUrl,m=l.source;if(t.metaKey||t.ctrlKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewTab({itemUrl:f,item:u,state:o.getState()}));else if(t.shiftKey)void 0!==f&&(m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),r.navigator.navigateNewWindow({itemUrl:f,item:u,state:o.getState()}));else if(t.altKey);else{if(void 0!==f)return m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i)),void r.navigator.navigate({itemUrl:f,item:u,state:o.getState()});Ce(qe({event:t,nextState:{isOpen:!1},props:r,query:s,refresh:n,store:o},i)).then((function(){m.onSelect(qe({event:t,item:u,itemInputValue:s,itemUrl:f,refresh:n,source:m,state:o.getState()},i))}))}}}(We({event:e,props:t,refresh:r,store:n},o))},onFocus:c,onBlur:a,onClick:function(r){e.inputElement!==t.environment.document.activeElement||n.getState().isOpen||c(r)}},f)},getPanelProps:function(e){return We({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},e)},getListProps:function(e){var r=e||{},n=r.sourceIndex,o=Ze(r,$e);return We({role:"listbox","aria-labelledby":"".concat(i(t.id,n),"-label"),id:"".concat(i(t.id,n),"-list")},o)},getItemProps:function(e){var a=e.item,c=e.source,l=e.sourceIndex,u=Ze(e,Je);return We({id:"".concat(i(t.id,l),"-item-").concat(a.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",a.__autocomplete_id);var t=ge(n.getState());if(null!==n.getState().activeItemId&&t){var i=t.item,c=t.itemInputValue,l=t.itemUrl,u=t.source;u.onActive(We({event:e,item:i,itemInputValue:c,itemUrl:l,refresh:r,source:u,state:n.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=c.getItemInputValue({item:a,state:n.getState()}),l=c.getItemUrl({item:a,state:n.getState()});(l?Promise.resolve():Ce(We({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:r,store:n},o))).then((function(){c.onSelect(We({event:e,item:a,itemInputValue:i,itemUrl:l,refresh:r,source:c,state:n.getState()},o))}))}},u)}}}var Xe=[{segment:"autocomplete-core",version:"1.9.3"}];function Ye(e){return Ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ye(e)}function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function tt(e){for(var t=1;t=r?null===n?null:0:o}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}function ct(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function lt(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function kt(e){var t=e.translations,r=void 0===t?{}:t,n=At(e,Pt),o=r.noResultsText,i=void 0===o?"No results for":o,a=r.suggestedQueryText,c=void 0===a?"Try searching for":a,l=r.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,s=r.reportMissingResultsLinkText,f=void 0===s?"Let us know.":s,m=n.state.context.searchSuggestions;return yt.createElement("div",{className:"DocSearch-NoResults"},yt.createElement("div",{className:"DocSearch-Screen-Icon"},yt.createElement(Et,null)),yt.createElement("p",{className:"DocSearch-Title"},i,' "',yt.createElement("strong",null,n.state.query),'"'),m&&m.length>0&&yt.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},yt.createElement("p",{className:"DocSearch-Help"},c,":"),yt.createElement("ul",null,m.slice(0,3).reduce((function(e,t){return[].concat(It(e),[yt.createElement("li",{key:t},yt.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){n.setQuery(t.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},t))])}),[]))),n.getMissingResultsUrl&&yt.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),yt.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},f)))}var xt=function(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Ct(e){switch(e.type){case"lvl1":return yt.createElement(xt,null);case"content":return yt.createElement(_t,null);default:return yt.createElement(Nt,null)}}function Nt(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function _t(){return yt.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Tt(){return yt.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},yt.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},yt.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),yt.createElement("path",{d:"M8 17l-6-6 6-6"})))}var qt=["hit","attribute","tagName"];function Rt(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Lt(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Ft(e,t){return t.split(".").reduce((function(e,t){return null!=e&&e[t]?e[t]:null}),e)}function Ut(e){var t=e.hit,r=e.attribute,n=e.tagName,o=void 0===n?"span":n,i=Ht(e,qt);return(0,yt.createElement)(o,Lt(Lt({},i),{},{dangerouslySetInnerHTML:{__html:Ft(t,"_snippetResult.".concat(r,".value"))||Ft(t,r)}}))}function Bt(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,i=[],a=!0,c=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);a=!0);}catch(l){c=!0,o=l}finally{try{a||null==r.return||r.return()}finally{if(c)throw o}}return i}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return Vt(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Vt(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r|<\/mark>)/g,Wt=RegExp(zt.source);function Qt(e){var t,r,n=e;if(!n.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=((n.__docsearch_parent?null===(t=n.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(r=e._highlightResult)||void 0===r||null===(r=r.hierarchy)||void 0===r?void 0:r.lvl0)||{}).value;return o&&Wt.test(o)?o.replace(zt,""):o}function Zt(){return Zt=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function or(e){var t=e.translations,r=void 0===t?{}:t,n=nr(e,tr),o=r.recentSearchesTitle,i=void 0===o?"Recent":o,a=r.noRecentSearchesText,c=void 0===a?"No recent searches":a,l=r.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,s=r.removeRecentSearchButtonTitle,f=void 0===s?"Remove this search from history":s,m=r.favoriteSearchesTitle,p=void 0===m?"Favorite":m,v=r.removeFavoriteSearchButtonTitle,d=void 0===v?"Remove this search from favorites":v;return"idle"===n.state.status&&!1===n.hasCollections?n.disableUserPersonalization?null:yt.createElement("div",{className:"DocSearch-StartScreen"},yt.createElement("p",{className:"DocSearch-Help"},c)):!1===n.hasCollections?null:yt.createElement("div",{className:"DocSearch-Dropdown-Container"},yt.createElement($t,rr({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Xt,null))},renderAction:function(e){var t=e.item,r=e.runFavoriteTransition,o=e.runDeleteTransition;return yt.createElement(yt.Fragment,null,yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.add(t),n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(Yt,null))),yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),o((function(){n.recentSearches.remove(t),n.refresh()}))}},yt.createElement(er,null))))}})),yt.createElement($t,rr({},n,{title:p,collection:n.state.collections[1],renderIcon:function(){return yt.createElement("div",{className:"DocSearch-Hit-icon"},yt.createElement(Yt,null))},renderAction:function(e){var t=e.item,r=e.runDeleteTransition;return yt.createElement("div",{className:"DocSearch-Hit-action"},yt.createElement("button",{className:"DocSearch-Hit-action-button",title:d,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),r((function(){n.favoriteSearches.remove(t),n.refresh()}))}},yt.createElement(er,null)))}})))}var ir=["translations"];function ar(){return ar=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var lr=yt.memo((function(e){var t=e.translations,r=void 0===t?{}:t,n=cr(e,ir);if("error"===n.state.status)return yt.createElement(wt,{translations:null==r?void 0:r.errorScreen});var o=n.state.collections.some((function(e){return e.items.length>0}));return n.state.query?!1===o?yt.createElement(kt,ar({},n,{translations:null==r?void 0:r.noResultsScreen})):yt.createElement(Gt,n):yt.createElement(or,ar({},n,{hasCollections:o,translations:null==r?void 0:r.startScreen}))}),(function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}));function ur(){return yt.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},yt.createElement("g",{fill:"none",fillRule:"evenodd"},yt.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},yt.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),yt.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},yt.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}var sr=r(830),fr=["translations"];function mr(){return mr=Object.assign||function(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function vr(e){var t=e.translations,r=void 0===t?{}:t,n=pr(e,fr),o=r.resetButtonTitle,i=void 0===o?"Clear the query":o,a=r.resetButtonAriaLabel,c=void 0===a?"Clear the query":a,l=r.cancelButtonText,u=void 0===l?"Cancel":l,s=r.cancelButtonAriaLabel,f=void 0===s?"Cancel":s,m=n.getFormProps({inputElement:n.inputRef.current}).onReset;return yt.useEffect((function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()}),[n.autoFocus,n.inputRef]),yt.useEffect((function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()}),[n.isFromSelection,n.inputRef]),yt.createElement(yt.Fragment,null,yt.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:m},yt.createElement("label",mr({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),yt.createElement(sr.W,null)),yt.createElement("div",{className:"DocSearch-LoadingIndicator"},yt.createElement(ur,null)),yt.createElement("input",mr({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:ht}))),yt.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},yt.createElement(er,null))),yt.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:n.onClose},u))}var dr=["_highlightResult","_snippetResult"];function yr(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function hr(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(t){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}function br(e){var t=e.key,r=e.limit,n=void 0===r?5:r,o=hr(t),i=o.getItem().slice(0,n);return{add:function(e){var t=e,r=(t._highlightResult,t._snippetResult,yr(t,dr)),a=i.findIndex((function(e){return e.objectID===r.objectID}));a>-1&&i.splice(a,1),i.unshift(r),i=i.slice(0,n),o.setItem(i)},remove:function(e){i=i.filter((function(t){return t.objectID!==e.objectID})),o.setItem(i)},getAll:function(){return i}}}function gr(e){const t=`algoliasearch-client-js-${e.key}`;let r;const n=()=>(void 0===r&&(r=e.localStorage||window.localStorage),r),o=()=>JSON.parse(n().getItem(t)||"{}"),i=e=>{n().setItem(t,JSON.stringify(e))};return{get:(t,r,n={miss:()=>Promise.resolve()})=>Promise.resolve().then((()=>{(()=>{const t=e.timeToLive?1e3*e.timeToLive:null,r=o(),n=Object.fromEntries(Object.entries(r).filter((([,e])=>void 0!==e.timestamp)));if(i(n),!t)return;const a=Object.fromEntries(Object.entries(n).filter((([,e])=>{const r=(new Date).getTime();return!(e.timestamp+tPromise.all([e?e.value:r(),void 0!==e]))).then((([e,t])=>Promise.all([e,t||n.miss(e)]))).then((([e])=>e)),set:(e,r)=>Promise.resolve().then((()=>{const i=o();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:r},n().setItem(t,JSON.stringify(i)),r})),delete:e=>Promise.resolve().then((()=>{const r=o();delete r[JSON.stringify(e)],n().setItem(t,JSON.stringify(r))})),clear:()=>Promise.resolve().then((()=>{n().removeItem(t)}))}}function Or(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then((e=>Promise.all([e,r.miss(e)]))).then((([e])=>e)),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,n,o={miss:()=>Promise.resolve()})=>r.get(e,n,o).catch((()=>Or({caches:t}).get(e,n,o))),set:(e,n)=>r.set(e,n).catch((()=>Or({caches:t}).set(e,n))),delete:e=>r.delete(e).catch((()=>Or({caches:t}).delete(e))),clear:()=>r.clear().catch((()=>Or({caches:t}).clear()))}}function Sr(e={serializable:!0}){let t={};return{get(r,n,o={miss:()=>Promise.resolve()}){const i=JSON.stringify(r);if(i in t)return Promise.resolve(e.serializable?JSON.parse(t[i]):t[i]);const a=n(),c=o&&o.miss||(()=>Promise.resolve());return a.then((e=>c(e))).then((()=>a))},set:(r,n)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function jr(e){let t=e.length-1;for(;t>0;t--){const r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function wr(e,t){return t?(Object.keys(t).forEach((r=>{e[r]=t[r](e)})),e):e}function Er(e,...t){let r=0;return e.replace(/%s/g,(()=>encodeURIComponent(t[r++])))}const Pr="4.20.0",Ir={WithinQueryParameters:0,WithinHeaders:1};function Dr(e,t){const r=e||{},n=r.data||{};return Object.keys(r).forEach((e=>{-1===["timeout","headers","queryParameters","data","cacheable"].indexOf(e)&&(n[e]=r[e])})),{data:Object.entries(n).length>0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}const Ar={Read:1,Write:2,Any:3},kr={Up:1,Down:2,Timeouted:3},xr=12e4;function Cr(e,t=kr.Up){return{...e,status:t,lastUpdate:Date.now()}}function Nr(e){return"string"==typeof e?{protocol:"https",url:e,accept:Ar.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||Ar.Any}}const _r={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};function Tr(e,t){return Promise.all(t.map((t=>e.get(t,(()=>Promise.resolve(Cr(t))))))).then((e=>{const r=e.filter((e=>function(e){return e.status===kr.Up||Date.now()-e.lastUpdate>xr}(e))),n=e.filter((e=>function(e){return e.status===kr.Timeouted&&Date.now()-e.lastUpdate<=xr}(e))),o=[...r,...n];return{getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t,statelessHosts:o.length>0?o.map((e=>Nr(e))):t}}))}const qr=(e,t)=>(e=>{const t=e.status;return e.isTimedOut||(({isTimedOut:e,status:t})=>!e&&0==~~t)(e)||2!=~~(t/100)&&4!=~~(t/100)})(e)?t.onRetry(e):(({status:e})=>2==~~(e/100))(e)?t.onSuccess(e):t.onFail(e);function Rr(e,t,r,n){const o=[],i=function(e,t){if(e.method===_r.Get||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(r,n),a=function(e,t){const r={...e.headers,...t.headers},n={};return Object.keys(r).forEach((e=>{const t=r[e];n[e.toLowerCase()]=t})),n}(e,n),c=r.method,l=r.method!==_r.Get?{}:{...r.data,...n.data},u={"x-algolia-agent":e.userAgent.value,...e.queryParameters,...l,...n.queryParameters};let s=0;const f=(t,l)=>{const m=t.pop();if(void 0===m)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:Fr(o)};const p={data:i,headers:a,method:c,url:Mr(m,r.path,u),connectTimeout:l(s,e.timeouts.connect),responseTimeout:l(s,n.timeout)},v=e=>{const r={request:p,response:e,host:m,triesLeft:t.length};return o.push(r),r},d={onSuccess:e=>function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e),onRetry(r){const n=v(r);return r.isTimedOut&&s++,Promise.all([e.logger.info("Retryable failure",Ur(n)),e.hostsCache.set(m,Cr(m,r.isTimedOut?kr.Timeouted:kr.Down))]).then((()=>f(t,l)))},onFail(e){throw v(e),function({content:e,status:t},r){let n=e;try{n=JSON.parse(e).message}catch(o){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(n,t,r)}(e,Fr(o))}};return e.requester.send(p).then((e=>qr(e,d)))};return Tr(e.hostsCache,t).then((e=>f([...e.statelessHosts].reverse(),e.getTimeout)))}function Lr(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}function Mr(e,t,r){const n=Hr(r);let o=`${e.protocol}://${e.url}/${"/"===t.charAt(0)?t.substr(1):t}`;return n.length&&(o+=`?${n}`),o}function Hr(e){return Object.keys(e).map((t=>{return Er("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function Fr(e){return e.map((e=>Ur(e)))}function Ur(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}const Br=e=>{const t=e.appId,r=function(e,t,r){const n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:()=>e===Ir.WithinHeaders?n:{},queryParameters:()=>e===Ir.WithinQueryParameters?n:{}}}(void 0!==e.authMode?e.authMode:Ir.WithinHeaders,t,e.apiKey),n=function(e){const{hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,hosts:l,queryParameters:u,headers:s}=e,f={hostsCache:t,logger:r,requester:n,requestsCache:o,responsesCache:i,timeouts:a,userAgent:c,headers:s,queryParameters:u,hosts:l.map((e=>Nr(e))),read(e,t){const r=Dr(t,f.timeouts.read),n=()=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Read))),e,r);if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();const o={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(o,(()=>f.requestsCache.get(o,(()=>f.requestsCache.set(o,n()).then((e=>Promise.all([f.requestsCache.delete(o),e])),(e=>Promise.all([f.requestsCache.delete(o),Promise.reject(e)]))).then((([e,t])=>t))))),{miss:e=>f.responsesCache.set(o,e)})},write:(e,t)=>Rr(f,f.hosts.filter((e=>0!=(e.accept&Ar.Write))),e,Dr(t,f.timeouts.write))};return f}({hosts:[{url:`${t}-dsn.algolia.net`,accept:Ar.Read},{url:`${t}.algolia.net`,accept:Ar.Write}].concat(jr([{url:`${t}-1.algolianet.com`},{url:`${t}-2.algolianet.com`},{url:`${t}-3.algolianet.com`}])),...e,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...e.headers},queryParameters:{...r.queryParameters(),...e.queryParameters}}),o={transporter:n,appId:t,addAlgoliaAgent(e,t){n.userAgent.add({segment:e,version:t})},clearCache:()=>Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then((()=>{}))};return wr(o,e.methods)},Vr=e=>(t,r)=>t.method===_r.Get?e.transporter.read(t,r):e.transporter.write(t,r),Kr=e=>(t,r={})=>wr({transporter:e.transporter,appId:e.appId,indexName:t},r.methods),$r=e=>(t,r)=>{const n=t.map((e=>({...e,params:Hr(e.params||{})})));return e.transporter.read({method:_r.Post,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)},Jr=e=>(t,r)=>Promise.all(t.map((t=>{const{facetName:n,facetQuery:o,...i}=t.params;return Kr(e)(t.indexName,{methods:{searchForFacetValues:Qr}}).searchForFacetValues(n,o,{...r,...i})}))),zr=e=>(t,r,n)=>e.transporter.read({method:_r.Post,path:Er("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n),Wr=e=>(t,r)=>e.transporter.read({method:_r.Post,path:Er("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r),Qr=e=>(t,r,n)=>e.transporter.read({method:_r.Post,path:Er("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n),Zr={Debug:1,Info:2,Error:3};function Gr(e,t,r){const n={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:e=>new Promise((t=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((t=>r.setRequestHeader(t,e.headers[t])));const n=(e,n)=>setTimeout((()=>{r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e),o=n(e.connectTimeout,"Connection timeout");let i;r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(o),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(o),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(o),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))},logger:(o=Zr.Error,{debug:(e,t)=>(Zr.Debug>=o&&console.debug(e,t),Promise.resolve()),info:(e,t)=>(Zr.Info>=o&&console.info(e,t),Promise.resolve()),error:(e,t)=>(console.error(e,t),Promise.resolve())}),responsesCache:Sr(),requestsCache:Sr({serializable:!1}),hostsCache:Or({caches:[gr({key:`${Pr}-${e}`}),Sr()]}),userAgent:Lr(Pr).add({segment:"Browser",version:"lite"}),authMode:Ir.WithinQueryParameters};var o;return Br({...n,...r,methods:{search:$r,searchForFacetValues:Jr,multipleQueries:$r,multipleSearchForFacetValues:Jr,customRequest:Vr,initIndex:e=>t=>Kr(e)(t,{methods:{search:Wr,searchForFacetValues:Qr,findAnswers:zr}})}})}Gr.version=Pr;const Xr=Gr;var Yr="3.5.2";function en(){}function tn(e){return e}function rn(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function nn(e,t,r){return e.reduce((function(e,n){var o=t(n);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(r||5)&&e[o].push(n),e}),{})}var on=["footer","searchBox"];function an(){return an=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function pn(e){var t=e.appId,r=e.apiKey,n=e.indexName,o=e.placeholder,i=void 0===o?"Search docs":o,a=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?en:l,s=e.transformItems,f=void 0===s?tn:s,m=e.hitComponent,p=void 0===m?St:m,v=e.resultsFooterComponent,d=void 0===v?function(){return null}:v,y=e.navigator,h=e.initialScrollY,b=void 0===h?0:h,g=e.transformSearchClient,O=void 0===g?tn:g,S=e.disableUserPersonalization,j=void 0!==S&&S,w=e.initialQuery,E=void 0===w?"":w,P=e.translations,I=void 0===P?{}:P,D=e.getMissingResultsUrl,A=e.insights,k=void 0!==A&&A,x=I.footer,C=I.searchBox,N=mn(I,on),_=sn(yt.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),T=_[0],q=_[1],R=yt.useRef(null),L=yt.useRef(null),M=yt.useRef(null),H=yt.useRef(null),F=yt.useRef(null),U=yt.useRef(10),B=yt.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,ht):"").current,V=yt.useRef(E||B).current,K=function(e,t,r){return yt.useMemo((function(){var n=Xr(e,t);return n.addAlgoliaAgent("docsearch",Yr),!1===/docsearch.js \(.*\)/.test(n.transporter.userAgent.value)&&n.addAlgoliaAgent("docsearch-react",Yr),r(n)}),[e,t,r])}(t,r,O),$=yt.useRef(br({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,J=yt.useRef(br({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:0===$.getAll().length?7:4})).current,z=yt.useCallback((function(e){if(!j){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===$.getAll().findIndex((function(e){return e.objectID===t.objectID}))&&J.add(t)}}),[$,J,j]),W=yt.useCallback((function(e){if(T.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,r={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};T.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(r)}}),[T.context.algoliaInsightsPlugin]),Q=yt.useMemo((function(){return dt({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:V,context:{searchSuggestions:[]}},insights:k,navigator:y,onStateChange:function(e){q(e.state)},getSources:function(e){var o=e.query,i=e.state,l=e.setContext,s=e.setStatus;if(!o)return j?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return J.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,r=e.event;z(t),rn(r)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return $.getAll()}}];var m=Boolean(k);return K.search([{query:o,indexName:n,params:ln({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(U.current),"hierarchy.lvl2:".concat(U.current),"hierarchy.lvl3:".concat(U.current),"hierarchy.lvl4:".concat(U.current),"hierarchy.lvl5:".concat(U.current),"hierarchy.lvl6:".concat(U.current),"content:".concat(U.current)],snippetEllipsisText:"\u2026",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:m},a)}]).catch((function(e){throw"RetryError"===e.name&&s("error"),e})).then((function(e){var o=e.results[0],a=o.hits,s=o.nbHits,p=nn(a,(function(e){return Qt(e)}),c);i.context.searchSuggestions.length0&&(X(),F.current&&F.current.focus())}),[V,X]),yt.useEffect((function(){function e(){if(L.current){var e=.01*window.innerHeight;L.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}}),[]),yt.createElement("div",an({ref:R},G({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===T.status&&"DocSearch-Container--Stalled","error"===T.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),yt.createElement("div",{className:"DocSearch-Modal",ref:L},yt.createElement("header",{className:"DocSearch-SearchBar",ref:M},yt.createElement(vr,an({},Q,{state:T,autoFocus:0===V.length,inputRef:F,isFromSelection:Boolean(V)&&V===B,translations:C,onClose:u}))),yt.createElement("div",{className:"DocSearch-Dropdown",ref:H},yt.createElement(lr,an({},Q,{indexName:n,state:T,hitComponent:p,resultsFooterComponent:d,disableUserPersonalization:j,recentSearches:J,favoriteSearches:$,inputRef:F,translations:N,getMissingResultsUrl:D,onItemClick:function(e,t){W(e),z(e),rn(t)||u()}}))),yt.createElement("footer",{className:"DocSearch-Footer"},yt.createElement(Ot,{translations:x}))))}}}]); \ No newline at end of file diff --git a/assets/js/143de299.c3fedd0b.js b/assets/js/143de299.d3a097ff.js similarity index 82% rename from assets/js/143de299.c3fedd0b.js rename to assets/js/143de299.d3a097ff.js index d4607af27..ae5540cee 100644 --- a/assets/js/143de299.c3fedd0b.js +++ b/assets/js/143de299.d3a097ff.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8427],{9162:e=>{e.exports=JSON.parse('{"label":"algorithms","permalink":"/docs/tags/algorithms","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8427],{9162:e=>{e.exports=JSON.parse('{"label":"algorithms","permalink":"/docs/tags/algorithms","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/153c226b.d148cb4c.js b/assets/js/153c226b.722fc636.js similarity index 84% rename from assets/js/153c226b.d148cb4c.js rename to assets/js/153c226b.722fc636.js index cc724c54f..3563b8788 100644 --- a/assets/js/153c226b.d148cb4c.js +++ b/assets/js/153c226b.722fc636.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7249],{9141:e=>{e.exports=JSON.parse('{"label":"compile","permalink":"/docs/tags/compile","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7249],{9141:e=>{e.exports=JSON.parse('{"label":"compile","permalink":"/docs/tags/compile","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/155c1e74.42f49a8c.js b/assets/js/155c1e74.c60231fe.js similarity index 89% rename from assets/js/155c1e74.42f49a8c.js rename to assets/js/155c1e74.c60231fe.js index 45c9cc81d..3f87a71c9 100644 --- a/assets/js/155c1e74.42f49a8c.js +++ b/assets/js/155c1e74.c60231fe.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[747],{8095:e=>{e.exports=JSON.parse('{"label":"reference","permalink":"/references/tags/reference","allTagsPath":"/references/tags","count":2,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[747],{8095:e=>{e.exports=JSON.parse('{"label":"reference","permalink":"/references/tags/reference","allTagsPath":"/references/tags","count":2,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/166b5465.2fd54cee.js b/assets/js/166b5465.f98909ca.js similarity index 86% rename from assets/js/166b5465.2fd54cee.js rename to assets/js/166b5465.f98909ca.js index fac9d537b..238e157b2 100644 --- a/assets/js/166b5465.2fd54cee.js +++ b/assets/js/166b5465.f98909ca.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1517],{9151:e=>{e.exports=JSON.parse('{"label":"pkill","permalink":"/references/tags/pkill","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1517],{9151:e=>{e.exports=JSON.parse('{"label":"pkill","permalink":"/references/tags/pkill","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/1772.9796a666.js b/assets/js/1772.9796a666.js new file mode 100644 index 000000000..424da85d7 --- /dev/null +++ b/assets/js/1772.9796a666.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1772],{5658:(e,t,n)=>{n.d(t,{Z:()=>r});n(7294);var i=n(4334),o=n(5999),s=n(2503),a=n(5893);function r(e){let{className:t}=e;return(0,a.jsx)("main",{className:(0,i.Z)("container margin-vert--xl",t),children:(0,a.jsx)("div",{className:"row",children:(0,a.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,a.jsx)(s.Z,{as:"h1",className:"hero__title",children:(0,a.jsx)(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,a.jsx)("p",{children:(0,a.jsx)(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},1772:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(7294);var i=n(5999),o=n(833),s=n(8888),a=n(5658),r=n(5893);function d(){const e=(0,i.I)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.d,{title:e}),(0,r.jsx)(s.Z,{children:(0,r.jsx)(a.Z,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/17896441.1c8df702.js b/assets/js/17896441.1c8df702.js deleted file mode 100644 index bb3f79fe8..000000000 --- a/assets/js/17896441.1c8df702.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7918],{8945:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ie});var a=n(7294),l=n(833),o=n(902);const r=a.createContext(null);function s(e){let{children:t,content:n}=e;const l=function(e){return(0,a.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return a.createElement(r.Provider,{value:l},t)}function c(){const e=(0,a.useContext)(r);if(null===e)throw new o.i6("DocProvider");return e}function i(){const{metadata:e,frontMatter:t,assets:n}=c();return a.createElement(l.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var d=n(6010),m=n(7524),u=n(7462),v=n(5999),b=n(2244);function p(e){const{previous:t,next:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,v.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"})},t&&a.createElement(b.Z,(0,u.Z)({},t,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),n&&a.createElement(b.Z,(0,u.Z)({},n,{subLabel:a.createElement(v.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}function h(){const{metadata:e}=c();return a.createElement(p,{previous:e.previous,next:e.next})}var f=n(2263),E=n(9960),g=n(143),L=n(5281),C=n(373),N=n(4477);const k={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return a.createElement(v.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:a.createElement("b",null,n.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function _(e){const t=k[e.versionMetadata.banner];return a.createElement(t,e)}function Z(e){let{versionLabel:t,to:n,onClick:l}=e;return a.createElement(v.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:a.createElement("b",null,a.createElement(E.Z,{to:n,onClick:l},a.createElement(v.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function x(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:l}}=(0,f.Z)(),{pluginId:o}=(0,g.gA)({failfast:!0}),{savePreferredVersionName:r}=(0,C.J)(o),{latestDocSuggestion:s,latestVersionSuggestion:c}=(0,g.Jo)(o),i=s??(m=c).docs.find((e=>e.id===m.mainDocId));var m;return a.createElement("div",{className:(0,d.Z)(t,L.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},a.createElement("div",null,a.createElement(_,{siteTitle:l,versionMetadata:n})),a.createElement("div",{className:"margin-top--md"},a.createElement(Z,{versionLabel:c.label,to:i.path,onClick:()=>r(c.name)})))}function T(e){let{className:t}=e;const n=(0,N.E)();return n.banner?a.createElement(x,{className:t,versionMetadata:n}):null}function H(e){let{className:t}=e;const n=(0,N.E)();return n.badge?a.createElement("span",{className:(0,d.Z)(t,L.k.docs.docVersionBadge,"badge badge--secondary")},a.createElement(v.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label}},"Version: {versionLabel}")):null}function U(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:a.createElement("b",null,a.createElement("time",{dateTime:new Date(1e3*t).toISOString()},n))}}," on {date}")}function y(e){let{lastUpdatedBy:t}=e;return a.createElement(v.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:a.createElement("b",null,t)}}," by {user}")}function A(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:l}=e;return a.createElement("span",{className:L.k.common.lastUpdated},a.createElement(v.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?a.createElement(U,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:l?a.createElement(y,{lastUpdatedBy:l}):""}},"Last updated{atDate}{byUser}"),!1)}var w=n(4881),M=n(1526);const I={lastUpdated:"lastUpdated_vwxv"};function B(e){return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterTagsRow,"row margin-bottom--sm")},a.createElement("div",{className:"col"},a.createElement(M.Z,e)))}function O(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:l,formattedLastUpdatedAt:o}=e;return a.createElement("div",{className:(0,d.Z)(L.k.docs.docFooterEditMetaRow,"row")},a.createElement("div",{className:"col"},t&&a.createElement(w.Z,{editUrl:t})),a.createElement("div",{className:(0,d.Z)("col",I.lastUpdated)},(n||l)&&a.createElement(A,{lastUpdatedAt:n,formattedLastUpdatedAt:o,lastUpdatedBy:l})))}function V(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:l,lastUpdatedBy:o,tags:r}=e,s=r.length>0,i=!!(t||n||o);return s||i?a.createElement("footer",{className:(0,d.Z)(L.k.docs.docFooter,"docusaurus-mt-lg")},s&&a.createElement(B,{tags:r}),i&&a.createElement(O,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:o,formattedLastUpdatedAt:l})):null}var P=n(6043),S=n(3743);const D={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function R(e){let{collapsed:t,...n}=e;return a.createElement("button",(0,u.Z)({type:"button"},n,{className:(0,d.Z)("clean-btn",D.tocCollapsibleButton,!t&&D.tocCollapsibleButtonExpanded,n.className)}),a.createElement(v.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component"},"On this page"))}const F={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function z(e){let{toc:t,className:n,minHeadingLevel:l,maxHeadingLevel:o}=e;const{collapsed:r,toggleCollapsed:s}=(0,P.u)({initialState:!0});return a.createElement("div",{className:(0,d.Z)(F.tocCollapsible,!r&&F.tocCollapsibleExpanded,n)},a.createElement(R,{collapsed:r,onClick:s}),a.createElement(P.z,{lazy:!0,className:F.tocCollapsibleContent,collapsed:r},a.createElement(S.Z,{toc:t,minHeadingLevel:l,maxHeadingLevel:o})))}const q={tocMobile:"tocMobile_ITEo"};function j(){const{toc:e,frontMatter:t}=c();return a.createElement(z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,d.Z)(L.k.docs.docTocMobile,q.tocMobile)})}var $=n(9407);function G(){const{toc:e,frontMatter:t}=c();return a.createElement($.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:L.k.docs.docTocDesktop})}var J=n(2503),Y=n(8718);function K(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return a.createElement("div",{className:(0,d.Z)(L.k.docs.docMarkdown,"markdown")},n&&a.createElement("header",null,a.createElement(J.Z,{as:"h1"},n)),a.createElement(Y.Z,null,t))}var Q=n(2802),W=n(8596),X=n(4996);function ee(e){return a.createElement("svg",(0,u.Z)({viewBox:"0 0 24 24"},e),a.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const te={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function ne(){const e=(0,X.Z)("/");return a.createElement("li",{className:"breadcrumbs__item"},a.createElement(E.Z,{"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},a.createElement(ee,{className:te.breadcrumbHomeIcon})))}const ae={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function le(e){let{children:t,href:n,isLast:l}=e;const o="breadcrumbs__link";return l?a.createElement("span",{className:o,itemProp:"name"},t):n?a.createElement(E.Z,{className:o,href:n,itemProp:"item"},a.createElement("span",{itemProp:"name"},t)):a.createElement("span",{className:o},t)}function oe(e){let{children:t,active:n,index:l,addMicrodata:o}=e;return a.createElement("li",(0,u.Z)({},o&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,d.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n})}),t,a.createElement("meta",{itemProp:"position",content:String(l+1)}))}function re(){const e=(0,Q.s1)(),t=(0,W.Ns)();return e?a.createElement("nav",{className:(0,d.Z)(L.k.docs.docBreadcrumbs,ae.breadcrumbsContainer),"aria-label":(0,v.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},a.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&a.createElement(ne,null),e.map(((t,n)=>{const l=n===e.length-1;return a.createElement(oe,{key:n,active:l,index:n,addMicrodata:!!t.href},a.createElement(le,{href:t.href,isLast:l},t.label))})))):null}const se={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function ce(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),l=e.hide_table_of_contents,o=!l&&t.length>0;return{hidden:l,mobile:o?a.createElement(j,null):void 0,desktop:!o||"desktop"!==n&&"ssr"!==n?void 0:a.createElement(G,null)}}();return a.createElement("div",{className:"row"},a.createElement("div",{className:(0,d.Z)("col",!n.hidden&&se.docItemCol)},a.createElement(T,null),a.createElement("div",{className:se.docItemContainer},a.createElement("article",null,a.createElement(re,null),a.createElement(H,null),n.mobile,a.createElement(K,null,t),a.createElement(V,null)),a.createElement(h,null))),n.desktop&&a.createElement("div",{className:"col col--3"},n.desktop))}function ie(e){const t=`docs-doc-id-${e.content.metadata.unversionedId}`,n=e.content;return a.createElement(s,{content:e.content},a.createElement(l.FG,{className:t},a.createElement(i,null),a.createElement(ce,null,a.createElement(n,null))))}},9407:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(7462),l=n(7294),o=n(6010),r=n(3743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",i="table-of-contents__link--active";function d(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,o.Z)(s.tableOfContents,"thin-scrollbar",t)},l.createElement(r.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:i})))}},3743:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(7462),l=n(7294),o=n(6668);function r(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function s(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=s({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function i(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function m(e){const t=(0,l.useRef)(void 0),n=d();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:o,maxHeadingLevel:r}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=i(s,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?l.createElement("ul",{className:o?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const v=l.memo(u);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:i,minHeadingLevel:d,maxHeadingLevel:u,...b}=e;const p=(0,o.L)(),h=d??p.tableOfContents.minHeadingLevel,f=u??p.tableOfContents.maxHeadingLevel,E=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>s({toc:r(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:h,maxHeadingLevel:f});return m((0,l.useMemo)((()=>{if(c&&i)return{linkClassName:c,linkActiveClassName:i,minHeadingLevel:h,maxHeadingLevel:f}}),[c,i,h,f])),l.createElement(v,(0,a.Z)({toc:E,className:n,linkClassName:c},b))}},4477:(e,t,n)=>{n.d(t,{E:()=>s,q:()=>r});var a=n(7294),l=n(902);const o=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(o.Provider,{value:n},t)}function s(){const e=(0,a.useContext)(o);if(null===e)throw new l.i6("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/17896441.dbf77ff9.js b/assets/js/17896441.dbf77ff9.js new file mode 100644 index 000000000..286e9d2e4 --- /dev/null +++ b/assets/js/17896441.dbf77ff9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7918],{8945:(e,t,n)=>{n.r(t),n.d(t,{default:()=>de});var s=n(7294),a=n(833),i=n(902),l=n(5893);const o=s.createContext(null);function r(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,l.jsx)(o.Provider,{value:a,children:t})}function c(){const e=(0,s.useContext)(o);if(null===e)throw new i.i6("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=c();return(0,l.jsx)(a.d,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(4334),m=n(7524),h=n(5999),v=n(2244);function b(e){const{previous:t,next:n}=e;return(0,l.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,l.jsx)(v.Z,{...t,subLabel:(0,l.jsx)(h.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,l.jsx)(v.Z,{...n,subLabel:(0,l.jsx)(h.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function x(){const{metadata:e}=c();return(0,l.jsx)(b,{previous:e.previous,next:e.next})}var p=n(2263),f=n(9960),g=n(143),j=n(5281),L=n(373),C=n(4477);const N={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,l.jsx)(h.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,l.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function k(e){const t=N[e.versionMetadata.banner];return(0,l.jsx)(t,{...e})}function Z(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,l.jsx)(h.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(f.Z,{to:n,onClick:s,children:(0,l.jsx)(h.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function _(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,p.Z)(),{pluginId:a}=(0,g.gA)({failfast:!0}),{savePreferredVersionName:i}=(0,L.J)(a),{latestDocSuggestion:o,latestVersionSuggestion:r}=(0,g.Jo)(a),c=o??(d=r).docs.find((e=>e.id===d.mainDocId));var d;return(0,l.jsxs)("div",{className:(0,u.Z)(t,j.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(k,{siteTitle:s,versionMetadata:n})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(Z,{versionLabel:r.label,to:c.path,onClick:()=>i(r.name)})})]})}function T(e){let{className:t}=e;const n=(0,C.E)();return n.banner?(0,l.jsx)(_,{className:t,versionMetadata:n}):null}function U(e){let{className:t}=e;const n=(0,C.E)();return n.badge?(0,l.jsx)("span",{className:(0,u.Z)(t,j.k.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(h.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}function H(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return(0,l.jsx)(h.Z,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:new Date(1e3*t).toISOString(),children:n})})},children:" on {date}"})}function y(e){let{lastUpdatedBy:t}=e;return(0,l.jsx)(h.Z,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:t})},children:" by {user}"})}function A(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:s}=e;return(0,l.jsxs)("span",{className:j.k.common.lastUpdated,children:[(0,l.jsx)(h.Z,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?(0,l.jsx)(H,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:s?(0,l.jsx)(y,{lastUpdatedBy:s}):""},children:"Last updated{atDate}{byUser}"}),!1]})}var w=n(4881),M=n(1526);const I={lastUpdated:"lastUpdated_vwxv"};function B(e){return(0,l.jsx)("div",{className:(0,u.Z)(j.k.docs.docFooterTagsRow,"row margin-bottom--sm"),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(M.Z,{...e})})})}function E(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,formattedLastUpdatedAt:a}=e;return(0,l.jsxs)("div",{className:(0,u.Z)(j.k.docs.docFooterEditMetaRow,"row"),children:[(0,l.jsx)("div",{className:"col",children:t&&(0,l.jsx)(w.Z,{editUrl:t})}),(0,l.jsx)("div",{className:(0,u.Z)("col",I.lastUpdated),children:(n||s)&&(0,l.jsx)(A,{lastUpdatedAt:n,formattedLastUpdatedAt:a,lastUpdatedBy:s})})]})}function O(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:s,lastUpdatedBy:a,tags:i}=e,o=i.length>0,r=!!(t||n||a);return o||r?(0,l.jsxs)("footer",{className:(0,u.Z)(j.k.docs.docFooter,"docusaurus-mt-lg"),children:[o&&(0,l.jsx)(B,{tags:i}),r&&(0,l.jsx)(E,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:a,formattedLastUpdatedAt:s})]}):null}var S=n(6043),V=n(3743);const P={tocCollapsibleButton:"tocCollapsibleButton_TO0P",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_MG3E"};function D(e){let{collapsed:t,...n}=e;return(0,l.jsx)("button",{type:"button",...n,className:(0,u.Z)("clean-btn",P.tocCollapsibleButton,!t&&P.tocCollapsibleButtonExpanded,n.className),children:(0,l.jsx)(h.Z,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const R={tocCollapsible:"tocCollapsible_ETCw",tocCollapsibleContent:"tocCollapsibleContent_vkbj",tocCollapsibleExpanded:"tocCollapsibleExpanded_sAul"};function F(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:i,toggleCollapsed:o}=(0,S.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,u.Z)(R.tocCollapsible,!i&&R.tocCollapsibleExpanded,n),children:[(0,l.jsx)(D,{collapsed:i,onClick:o}),(0,l.jsx)(S.z,{lazy:!0,className:R.tocCollapsibleContent,collapsed:i,children:(0,l.jsx)(V.Z,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const z={tocMobile:"tocMobile_ITEo"};function q(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(F,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.Z)(j.k.docs.docTocMobile,z.tocMobile)})}var $=n(9407);function G(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)($.Z,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:j.k.docs.docTocDesktop})}var J=n(2503),Y=n(2459);function K(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=c();return t.hide_title||void 0!==n?null:e.title}();return(0,l.jsxs)("div",{className:(0,u.Z)(j.k.docs.docMarkdown,"markdown"),children:[n&&(0,l.jsx)("header",{children:(0,l.jsx)(J.Z,{as:"h1",children:n})}),(0,l.jsx)(Y.Z,{children:t})]})}var Q=n(2802),W=n(8596),X=n(4996);function ee(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const te={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function ne(){const e=(0,X.Z)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(f.Z,{"aria-label":(0,h.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)(ee,{className:te.breadcrumbHomeIcon})})})}const se={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function ae(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,l.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,l.jsx)(f.Z,{className:a,href:n,itemProp:"item",children:(0,l.jsx)("span",{itemProp:"name",children:t})}):(0,l.jsx)("span",{className:a,children:t})}function ie(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,l.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.Z)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,l.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function le(){const e=(0,Q.s1)(),t=(0,W.Ns)();return e?(0,l.jsx)("nav",{className:(0,u.Z)(j.k.docs.docBreadcrumbs,se.breadcrumbsContainer),"aria-label":(0,h.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,l.jsx)(ne,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,l.jsx)(ie,{active:s,index:n,addMicrodata:!!a,children:(0,l.jsx)(ae,{href:a,isLast:s,children:t.label})},n)}))]})}):null}var oe=n(2212);const re={docItemContainer:"docItemContainer_Djhp",docItemCol:"docItemCol_VOVn"};function ce(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=c(),n=(0,m.i)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,l.jsx)(q,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,l.jsx)(G,{})}}(),{metadata:{unlisted:s}}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,u.Z)("col",!n.hidden&&re.docItemCol),children:[s&&(0,l.jsx)(oe.Z,{}),(0,l.jsx)(T,{}),(0,l.jsxs)("div",{className:re.docItemContainer,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(le,{}),(0,l.jsx)(U,{}),n.mobile,(0,l.jsx)(K,{children:t}),(0,l.jsx)(O,{})]}),(0,l.jsx)(x,{})]})]}),n.desktop&&(0,l.jsx)("div",{className:"col col--3",children:n.desktop})]})}function de(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(a.FG,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(ce,{children:(0,l.jsx)(n,{})})]})})}},9407:(e,t,n)=>{n.d(t,{Z:()=>c});n(7294);var s=n(4334),a=n(3743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=n(5893);const o="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,l.jsx)("div",{className:(0,s.Z)(i.tableOfContents,"thin-scrollbar",t),children:(0,l.jsx)(a.Z,{...n,linkClassName:o,linkActiveClassName:r})})}},3743:(e,t,n)=>{n.d(t,{Z:()=>b});var s=n(7294),a=n(6668);function i(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function l(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=l({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function o(e){const t=e.getBoundingClientRect();return t.top===t.bottom?o(e.parentNode):t}function r(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>o(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,s.useRef)(void 0),n=c();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:i,maxHeadingLevel:l}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),o=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:i,maxHeadingLevel:l}),c=r(o,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,n])}var u=n(9960),m=n(5893);function h(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.Z,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const v=s.memo(h);function b(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const b=(0,a.L)(),x=c??b.tableOfContents.minHeadingLevel,p=u??b.tableOfContents.maxHeadingLevel,f=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>l({toc:i(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:x,maxHeadingLevel:p});return d((0,s.useMemo)((()=>{if(o&&r)return{linkClassName:o,linkActiveClassName:r,minHeadingLevel:x,maxHeadingLevel:p}}),[o,r,x,p])),(0,m.jsx)(v,{toc:f,className:n,linkClassName:o,...h})}},2212:(e,t,n)=>{n.d(t,{Z:()=>h});n(7294);var s=n(4334),a=n(5999),i=n(5742),l=n(5893);function o(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(5281),u=n(9047);function m(e){let{className:t}=e;return(0,l.jsx)(u.Z,{type:"caution",title:(0,l.jsx)(o,{}),className:(0,s.Z)(t,d.k.common.unlistedBanner),children:(0,l.jsx)(r,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/179183ba.be6e6772.js b/assets/js/179183ba.6a924c3e.js similarity index 83% rename from assets/js/179183ba.be6e6772.js rename to assets/js/179183ba.6a924c3e.js index 1bad856dd..5edbeba74 100644 --- a/assets/js/179183ba.be6e6772.js +++ b/assets/js/179183ba.6a924c3e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6601],{655:e=>{e.exports=JSON.parse('{"label":"protocol","permalink":"/docs/tags/protocol","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6601],{655:e=>{e.exports=JSON.parse('{"label":"protocol","permalink":"/docs/tags/protocol","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/180ee354.4835f795.js b/assets/js/180ee354.b69fc369.js similarity index 88% rename from assets/js/180ee354.4835f795.js rename to assets/js/180ee354.b69fc369.js index f29ef168e..d168508a2 100644 --- a/assets/js/180ee354.4835f795.js +++ b/assets/js/180ee354.b69fc369.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9316],{5601:e=>{e.exports=JSON.parse('{"label":"manage","permalink":"/docs/tags/manage","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9316],{5601:e=>{e.exports=JSON.parse('{"label":"manage","permalink":"/docs/tags/manage","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/187c6361.b8c530ea.js b/assets/js/187c6361.df90bd39.js similarity index 88% rename from assets/js/187c6361.b8c530ea.js rename to assets/js/187c6361.df90bd39.js index 4ec7d7f3e..a7c776388 100644 --- a/assets/js/187c6361.b8c530ea.js +++ b/assets/js/187c6361.df90bd39.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6788],{1461:e=>{e.exports=JSON.parse('{"label":"Edge Network","permalink":"/docs/tags/edge-network","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6788],{1461:e=>{e.exports=JSON.parse('{"label":"Edge Network","permalink":"/docs/tags/edge-network","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/19f79f7b.1ade0ebc.js b/assets/js/19f79f7b.1ade0ebc.js new file mode 100644 index 000000000..d3f784db7 --- /dev/null +++ b/assets/js/19f79f7b.1ade0ebc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8489],{8816:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>g,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var o=n(5893),i=n(1151),s=n(3872);const r={title:"How to manage log files",hide_title:!0,slug:"how-to-manage-log-files",date:new Date("2023-10-27T12:00:00.000Z"),image:"./assets/managing-the-keystore.png?202311181211",description:"Learn how to rotate, compress the log files",category:"Tutorial",tags:["guide","logs"]},l=void 0,a={id:"Node Operators/how-to-manage-logfiles",title:"How to manage log files",description:"Learn how to rotate, compress the log files",source:"@site/guides/Node Operators/how-to-manage-logfiles.md",sourceDirName:"Node Operators",slug:"/Node Operators/how-to-manage-log-files",permalink:"/guides/Node Operators/how-to-manage-log-files",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/how-to-manage-logfiles.md",tags:[{label:"guide",permalink:"/guides/tags/guide"},{label:"logs",permalink:"/guides/tags/logs"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"How to manage log files",hide_title:!0,slug:"how-to-manage-log-files",date:"2023-10-27T12:00:00.000Z",image:"./assets/managing-the-keystore.png?202311181211",description:"Learn how to rotate, compress the log files",category:"Tutorial",tags:["guide","logs"]},sidebar:"defaultSidebar",previous:{title:"Getting Started",permalink:"/guides/Node Operators/getting-started"},next:{title:"Managing the keystore",permalink:"/guides/Node Operators/managing-the-keystore"}},c={image:n(4110).Z},d=[{value:"Introduction",id:"introduction",level:2},{value:"Journal",id:"journal",level:2},{value:"Commands",id:"commands",level:3},{value:"Disk utilization checkup",id:"disk-utilization-checkup",level:4},{value:"Clearing logs manually",id:"clearing-logs-manually",level:4},{value:"Follow or tail logs of service",id:"follow-or-tail-logs-of-service",level:4},{value:"Show all service entries",id:"show-all-service-entries",level:4},{value:"Configuration file",id:"configuration-file",level:3},{value:"Create the directory and config file",id:"create-the-directory-and-config-file",level:3},{value:"Configuration settings",id:"configuration-settings",level:3},{value:"Logrotate",id:"logrotate",level:2},{value:"Prerequesite",id:"prerequesite",level:3},{value:"Explore the Configuration files",id:"explore-the-configuration-files",level:3},{value:"Create the Lightning logrotate configuration file",id:"create-the-lightning-logrotate-configuration-file",level:3},{value:"Lightning Configuration Settings",id:"lightning-configuration-settings",level:3},{value:"Cron job",id:"cron-job",level:3},{value:"Conclusion",id:"conclusion",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:(0,o.jsx)(t.img,{alt:"How to manage log files",src:n(5407).Z+"",width:"1450",height:"816"})}),"\n","\n","\n",(0,o.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(t.p,{children:"The Fleek Network node streams text messages to the standard output and error in Linux. Given that disk space is a limited resource for most systems, the number of text data can be a cause of concern. Managing the file sizes by means of rotation and compression can help."}),"\n",(0,o.jsx)(t.p,{children:"A conventional Fleek Network Service setup (as per the documentation and tool recommendations), have the text data stored in a special directory for storing logs called /var/log. The /var/log directory contains logs from various applications running on the operating system, the operating system itself, and others."}),"\n",(0,o.jsx)(t.p,{children:"For the purpose of storing network node operation logs, it defaults to the /var/log/lightning directory where the files output.log (stdout) and diagnostic.log (stderr) is located and accumulated. As the node runs, the size of the files increase, as it aggregates all the output generated by the Fleek Network service operations, such as info, errors, etc."}),"\n",(0,o.jsx)(t.p,{children:"A Node Operator can configure the system to rotate, compress, and set maximum size of these files to safeguard any concerns or issues that can get out of control, such as causing disk space to become full quickly."}),"\n",(0,o.jsxs)(t.p,{children:["In this guide, we'll look into some options available to manage the logs. First, we'll look into journald.conf which controls where to store journal data (the journal is a component of systemd that handles all the messages in a Systemd enabled system). Afterwards, we'll look into ",(0,o.jsx)(t.a,{href:"https://linux.die.net/man/8/logrotate",children:"Logrotate"})," an application to help us manage automatic rotation and compression of log files."]}),"\n",(0,o.jsx)(t.p,{children:"In essence, the journal and the logs duplicate the same information, and we want to make sure that we set measures to control it."}),"\n",(0,o.jsx)(t.h2,{id:"journal",children:"Journal"}),"\n",(0,o.jsxs)(t.p,{children:["Journal is a component of Systemd, a centralized location for all messages logged by different components in a systemd-enabled Linux system. The systemd journal will happily run in parallel with the standard type log files in ",(0,o.jsx)(t.code,{children:"/var/log/*"})," where the Fleek Network Systemd Unit Service outputs Standard Output and Standard Error in the location ",(0,o.jsx)(t.code,{children:"/var/log/lightning/*.log"}),"."]}),"\n",(0,o.jsxs)(t.p,{children:["Here, we are going to learn how to configure the ",(0,o.jsx)(t.code,{children:"journald.conf"})," service configuration file for the system-wide settings (meaning that it applies to all services), but firstly we're going to learn some commands to help us troubleshoot when necessary."]}),"\n",(0,o.jsx)(t.h3,{id:"commands",children:"Commands"}),"\n",(0,o.jsx)(t.h4,{id:"disk-utilization-checkup",children:"Disk utilization checkup"}),"\n",(0,o.jsx)(t.p,{children:"To check how much disk space is used by Systemd log files, run the command below:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo journalctl --disk-usage\n"})}),"\n",(0,o.jsx)(t.p,{children:"It provides information of how much disk space is utilized by the log files in your system."}),"\n",(0,o.jsx)(t.h4,{id:"clearing-logs-manually",children:"Clearing logs manually"}),"\n",(0,o.jsxs)(t.p,{children:["The best way to clear log files is done automatically by the ",(0,o.jsx)(t.code,{children:"journald.conf"})," configuration file, discussed in ",(0,o.jsx)(t.a,{href:"#configuration-file",children:"Configuration file"}),". In the ideal world, you shouldn't have to manually delete the log files, but this can be useful to know about when troubleshooting."]}),"\n",(0,o.jsxs)(t.p,{children:["To ",(0,o.jsx)(t.code,{children:"flush"})," the log files run the command below:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo journalctl --flush --rotate\nsudo journalctl --vacuum-time=1s\n"})}),"\n",(0,o.jsxs)(t.admonition,{type:"tip",children:[(0,o.jsx)(t.p,{children:"The flush and rotate flag is used, as vaccum-time only clears archived logs and not active ones. It'll flush:"}),(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Move /run/log/journal to /var/log/journal"}),"\n",(0,o.jsx)(t.li,{children:"Rotate (this flag archives logs and retains it)"}),"\n"]}),(0,o.jsx)(t.p,{children:"Since it'll only keep the past 1-second-long files, it'll effectively clear everything."})]}),"\n",(0,o.jsx)(t.h4,{id:"follow-or-tail-logs-of-service",children:"Follow or tail logs of service"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo journalctl -u .service -f\n"})}),"\n",(0,o.jsx)(t.p,{children:"For example, for a conventional native install (if you haven't followed the conventions, make the appropriate tweaks to fit your needs)."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo journalctl -u lightning.service -f\n"})}),"\n",(0,o.jsx)(t.p,{children:"The Docker service"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo journalctl -u docker-lightning.service -f\n"})}),"\n",(0,o.jsx)(t.h4,{id:"show-all-service-entries",children:"Show all service entries"}),"\n",(0,o.jsx)(t.p,{children:"Show all journal entries, which can be fairly long:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo journalctl\n"})}),"\n",(0,o.jsx)(t.h3,{id:"configuration-file",children:"Configuration file"}),"\n",(0,o.jsxs)(t.p,{children:["The default configuration file is located at ",(0,o.jsx)(t.code,{children:"/etc/systemd/journald.conf"}),". This is the main file that journal reads the configuration from, for the system instances that are controlled by root."]}),"\n",(0,o.jsxs)(t.p,{children:["In addition to the main configuration file there are a few other locations that take higher precedence and override the main configuration file. To learn more about journald read ",(0,o.jsx)(t.a,{href:"https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html#Options",children:"here"}),"."]}),"\n",(0,o.jsxs)(t.p,{children:["To keep the guide short we are going to use the main location ",(0,o.jsx)(t.code,{children:"/etc/systemd/journald.conf"}),"."]}),"\n",(0,o.jsx)(t.h3,{id:"create-the-directory-and-config-file",children:"Create the directory and config file"}),"\n",(0,o.jsxs)(t.p,{children:["If the ",(0,o.jsx)(t.code,{children:"/etc/systemd/journald.conf"})," file doesn't exist, create it by:"]}),"\n",(0,o.jsxs)(t.p,{children:["Create the ",(0,o.jsx)(t.code,{children:"journald.conf"})," file:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo touch /etc/systemd/journald.conf\n"})}),"\n",(0,o.jsx)(t.h3,{id:"configuration-settings",children:"Configuration settings"}),"\n",(0,o.jsx)(t.p,{children:"The Systemd provides many options for you to manage the log files and by combining these parameters you can limit the disk space used by the journal files."}),"\n",(0,o.jsxs)(t.p,{children:["A list of the available options are ",(0,o.jsx)(t.a,{href:"https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html#Options",children:"here"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"Here is a quick description of the options we're going to use for our example:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Storage"}),", controls where to store journal data"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"SystemMaxUse"}),", specifies the maximum disk space that can be used by the journal in persistent storage"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"SystemMaxFileSize"}),", controls how large individual journal files can grow to in persistent storage before being rotated"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"RuntimeMaxUse"}),", control how much disk space the journal may use up at most"]}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["You should open the ",(0,o.jsx)(t.code,{children:"/etc/systemd/journald.conf"})," file in your favorite text editor and put:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-toml",children:"[Journal]\nStorage=persistent\nSystemMaxUse=1G\nSystemMaxFileSize=100M\nRuntimeMaxUse=100M\n"})}),"\n",(0,o.jsx)(t.p,{children:"Here, we set 1G and 100M, which means 1 Gigabyte and 100 Megabytes. You can also use K for Kbytes, amongst others."}),"\n",(0,o.jsx)(t.p,{children:"After the changes, you have to restart the journald after updating the file. To restart use the command:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo systemctl restart systemd-journald\n"})}),"\n",(0,o.jsx)(t.p,{children:"You can verify the integrity of the log files by running:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo journalctl --verify\n"})}),"\n",(0,o.jsx)(t.h2,{id:"logrotate",children:"Logrotate"}),"\n",(0,o.jsx)(t.p,{children:"Logrotate is a tool to manage the log files created by a system processes. It can automatically compress, rename, remove logs and more for your convenience and save your system's resources. Log files can be handled timely, or when it grows too large."}),"\n",(0,o.jsx)(t.h3,{id:"prerequesite",children:"Prerequesite"}),"\n",(0,o.jsx)(t.p,{children:"The logrotate tools is available by default on Ubuntu."}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"We're using Ubuntu for our guide to keep it simple. If you are using a different and support operating system make sure you install Logrotate before proceeding."})}),"\n",(0,o.jsx)(t.p,{children:"You can check if logrotate is installed by executing:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"logrotate --version\n"})}),"\n",(0,o.jsx)(t.p,{children:"At the time this guide was written, we got the following output:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"logrotate 3.21.0\n\n Default mail command: /usr/bin/mail\n Default compress command: /bin/gzip\n Default uncompress command: /bin/gunzip\n Default compress extension: .gz\n Default state file path: /var/lib/logrotate/status\n ACL support: yes\n SELinux support: yes\n"})}),"\n",(0,o.jsx)(t.p,{children:"If you run an earlier or older version, changes or tweaks might apply."}),"\n",(0,o.jsx)(t.h3,{id:"explore-the-configuration-files",children:"Explore the Configuration files"}),"\n",(0,o.jsx)(t.p,{children:"The configuration files we'll be exploring today are found in the following locations in Ubuntu:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"/etc/logrotate.conf"}),", is the main configuration settings file. It includes the statement to pull in configuration files from other directories, e.g. the ",(0,o.jsx)(t.code,{children:"/etc/logrotate.d"})]}),"\n"]}),"\n",(0,o.jsxs)(t.li,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:"/etc/logrotate.d/"}),", a directory where packages drop log rotation information"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"We use Ubuntu for our guide, if you are on a different distro, you have to determine the file configuration file locations"})}),"\n",(0,o.jsxs)(t.p,{children:["The content of the file ",(0,o.jsx)(t.code,{children:"/etc/logrotate.conf"})," should be similar to:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:'# see "man logrotate" for details\n\n# global options do not affect preceding include directives\n\n# rotate log files weekly\nweekly\n\n# use the adm group by default, since this is the owning group\n# of /var/log/.\nsu root adm\n\n# keep 4 weeks worth of backlogs\nrotate 4\n\n# create new (empty) log files after rotating old ones\ncreate\n\n# use date as a suffix of the rotated file\n#dateext\n\n# uncomment this if you want your log files compressed\n#compress\n\n# packages drop log rotation information into this directory\ninclude /etc/logrotate.d\n\n# system-specific logs may also be configured here.\n'})}),"\n",(0,o.jsx)(t.p,{children:"The configuration settings if anything like the above, tell us that the rotation happens weekly, keeping 4 weeks worth of backlogs, etc."}),"\n",(0,o.jsxs)(t.p,{children:["To learn more about other configuration options consult the ",(0,o.jsx)(t.a,{href:"https://linux.die.net/man/8/logrotate",children:"logrotate manual page"}),"."]}),"\n",(0,o.jsx)(t.h3,{id:"create-the-lightning-logrotate-configuration-file",children:"Create the Lightning logrotate configuration file"}),"\n",(0,o.jsx)(t.p,{children:"Let's create a Logrotate configuration file for Fleek Network Lightning Service. Create the file by running the command:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo touch /etc/logrotate.d/lightning\n"})}),"\n",(0,o.jsx)(t.h3,{id:"lightning-configuration-settings",children:"Lightning Configuration Settings"}),"\n",(0,o.jsxs)(t.p,{children:["Open the recently created file ",(0,o.jsx)(t.code,{children:"/etc/logrotate.d/lightning"})," in your favorite text editor."]}),"\n",(0,o.jsx)(t.p,{children:"Add the following lines to the file:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"/var/log/lightning/*.log {\n rotate 5\n daily\n size 50M\n notifempty\n compress\n}\n"})}),"\n",(0,o.jsx)(t.p,{children:"Remember to save the file before exiting the text editor. You can test the configuration file by running the command:"}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"sudo logrotate /etc/logrotate.conf --debug\n"})}),"\n",(0,o.jsxs)(t.p,{children:["The configuration file above declares that for the log files in the ",(0,o.jsx)(t.code,{children:"/var/log/lightning"})," directory, the log files are rotated 5 times daily before being removed, as long they grow bigger than 50 megabytes in file size or empty. Old versions of log files are compressed with gzip."]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsxs)(t.p,{children:["Bear in mind that this configuration file also inherit the default behavior, e.g. the ",(0,o.jsx)(t.code,{children:"create"})," as set in the main configuration file ",(0,o.jsx)(t.code,{children:"/etc/logrotate.conf"}),"."]})}),"\n",(0,o.jsxs)(t.p,{children:["Feel free to customize the settings to your liking by checking the documentation in the ",(0,o.jsx)(t.a,{href:"https://linux.die.net/man/8/logrotate",children:"logrotate manual page"}),"."]}),"\n",(0,o.jsx)(t.h3,{id:"cron-job",children:"Cron job"}),"\n",(0,o.jsx)(t.admonition,{type:"note",children:(0,o.jsx)(t.p,{children:"Depending on the operating system, you have to set up a cron job to execute logrotate with the configuration file daily. Since we are using Ubuntu for our example, a daily cron job runner is already set up for us. If you are on a different Distro/OS make the required amends."})}),"\n",(0,o.jsxs)(t.p,{children:["Verify that the ",(0,o.jsx)(t.code,{children:"/etc/cron.daily/logrotate"})," exists and includes the execution of ",(0,o.jsx)(t.code,{children:"logrotate"})," with the configuration argument ",(0,o.jsx)(t.code,{children:"/etc/logrotate.conf"}),"."]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"/usr/sbin/logrotate /etc/logrotate.conf\n"})}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsx)(t.p,{children:"If you have modified the location of the binary or main configuration file, make sure this is set correctly to your custom locations."})}),"\n",(0,o.jsxs)(t.p,{children:["To summarize, the ",(0,o.jsx)(t.code,{children:"logrotate /etc/logrotate.conf"})," is executed and as logrotate.conf goes through its list of commands, it calls ",(0,o.jsx)(t.code,{children:"include /etc/logrotate.d"}),". It means that any scripts in ",(0,o.jsx)(t.code,{children:"/etc/logrotate.d"})," are executed, such as the ",(0,o.jsx)(t.a,{href:"#lightning-configuration-settings",children:"Lightning Configuration Settings"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,o.jsx)(t.p,{children:"The guide starts by warning us about the stream text messages that the Fleek Network emits by default. As the text data is aggregated and stored in the file system it can lead to fill up the limited available disk space quickly, causing issues to the operation of the system."}),"\n",(0,o.jsx)(t.p,{children:"To help control it, the journald is introduced, by explaining its role as a centralized message system, that runs alongside the application logs. Then, have it configured to limit the maximum file size, amongst other system-wide settings."}),"\n",(0,o.jsx)(t.p,{children:"Finally, logrotate is discussed in helping us manage the Fleek Network Lightning application log files by setting it to automatically compress, rename, remove logs for the system admin convenience and saving system's resources."}),"\n",(0,o.jsx)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function g(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},3872:(e,t,n)=>{n.d(t,{Z:()=>i});n(7294);var o=n(5893);const i=e=>{let{image:t,name:n,title:i,url:s,communityMember:r=!1}=e;return(0,o.jsx)("section",{className:"author_card",children:(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"avatar",children:(0,o.jsx)("a",{href:s,target:"_blank",alt:n,children:(0,o.jsx)("img",{src:t,alt:n})})}),(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"name",children:(0,o.jsx)("a",{href:s,target:"_blank",alt:n,children:n})}),(0,o.jsx)("span",{className:"title",children:i}),(0,o.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,o.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},4110:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/managing-the-keystore-fe4cdb19d2f59c54bcf864b0e069b535.png"},5407:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/how-to-manage-log-files-be3f38ea329523fb5ec346ee98946dbe.png"},1151:(e,t,n)=>{n.d(t,{Z:()=>l,a:()=>r});var o=n(7294);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/19f79f7b.3e9395c7.js b/assets/js/19f79f7b.3e9395c7.js deleted file mode 100644 index e39ce13de..000000000 --- a/assets/js/19f79f7b.3e9395c7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8489],{3905:(e,t,o)=>{o.d(t,{Zo:()=>c,kt:()=>m});var n=o(7294);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function r(e){for(var t=1;t=0||(a[o]=e[o]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(a[o]=e[o])}return a}var s=n.createContext({}),u=function(e){var t=n.useContext(s),o=t;return e&&(o="function"==typeof e?e(t):r(r({},t),e)),o},c=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var o=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(o),p=a,m=d["".concat(s,".").concat(p)]||d[p]||g[p]||i;return o?n.createElement(m,r(r({ref:t},c),{},{components:o})):n.createElement(m,r({ref:t},c))}));function m(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=o.length,r=new Array(i);r[0]=p;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:a,r[1]=l;for(var u=2;u{o.r(t),o.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var n=o(7462),a=(o(7294),o(3905)),i=o(3872);const r={title:"How to manage log files",hide_title:!0,slug:"how-to-manage-log-files",date:new Date("2023-10-27T12:00:00.000Z"),image:"./assets/managing-the-keystore.png?202311181211",description:"Learn how to rotate, compress the log files",category:"Tutorial",tags:["guide","logs"]},l=void 0,s={unversionedId:"Node Operators/how-to-manage-logfiles",id:"Node Operators/how-to-manage-logfiles",title:"How to manage log files",description:"Learn how to rotate, compress the log files",source:"@site/guides/Node Operators/how-to-manage-logfiles.md",sourceDirName:"Node Operators",slug:"/Node Operators/how-to-manage-log-files",permalink:"/guides/Node Operators/how-to-manage-log-files",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/how-to-manage-logfiles.md",tags:[{label:"guide",permalink:"/guides/tags/guide"},{label:"logs",permalink:"/guides/tags/logs"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"How to manage log files",hide_title:!0,slug:"how-to-manage-log-files",date:"2023-10-27T12:00:00.000Z",image:"./assets/managing-the-keystore.png?202311181211",description:"Learn how to rotate, compress the log files",category:"Tutorial",tags:["guide","logs"]},sidebar:"defaultSidebar",previous:{title:"Getting Started",permalink:"/guides/Node Operators/getting-started"},next:{title:"Managing the keystore",permalink:"/guides/Node Operators/managing-the-keystore"}},u={image:o(4350).Z},c=[{value:"Introduction",id:"introduction",level:2},{value:"Journal",id:"journal",level:2},{value:"Commands",id:"commands",level:3},{value:"Disk utilization checkup",id:"disk-utilization-checkup",level:4},{value:"Clearing logs manually",id:"clearing-logs-manually",level:4},{value:"Follow or tail logs of service",id:"follow-or-tail-logs-of-service",level:4},{value:"Show all service entries",id:"show-all-service-entries",level:4},{value:"Configuration file",id:"configuration-file",level:3},{value:"Create the directory and config file",id:"create-the-directory-and-config-file",level:3},{value:"Configuration settings",id:"configuration-settings",level:3},{value:"Logrotate",id:"logrotate",level:2},{value:"Prerequesite",id:"prerequesite",level:3},{value:"Explore the Configuration files",id:"explore-the-configuration-files",level:3},{value:"Create the Lightning logrotate configuration file",id:"create-the-lightning-logrotate-configuration-file",level:3},{value:"Lightning Configuration Settings",id:"lightning-configuration-settings",level:3},{value:"Cron job",id:"cron-job",level:3},{value:"Conclusion",id:"conclusion",level:2}],d={toc:c},g="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(g,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"How to manage log files",src:o(5407).Z,width:"1450",height:"816"})),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"The Fleek Network node streams text messages to the standard output and error in Linux. Given that disk space is a limited resource for most systems, the number of text data can be a cause of concern. Managing the file sizes by means of rotation and compression can help."),(0,a.kt)("p",null,"A conventional Fleek Network Service setup (as per the documentation and tool recommendations), have the text data stored in a special directory for storing logs called /var/log. The /var/log directory contains logs from various applications running on the operating system, the operating system itself, and others."),(0,a.kt)("p",null,"For the purpose of storing network node operation logs, it defaults to the /var/log/lightning directory where the files output.log (stdout) and diagnostic.log (stderr) is located and accumulated. As the node runs, the size of the files increase, as it aggregates all the output generated by the Fleek Network service operations, such as info, errors, etc."),(0,a.kt)("p",null,"A Node Operator can configure the system to rotate, compress, and set maximum size of these files to safeguard any concerns or issues that can get out of control, such as causing disk space to become full quickly."),(0,a.kt)("p",null,"In this guide, we'll look into some options available to manage the logs. First, we'll look into journald.conf which controls where to store journal data (the journal is a component of systemd that handles all the messages in a Systemd enabled system). Afterwards, we'll look into ",(0,a.kt)("a",{parentName:"p",href:"https://linux.die.net/man/8/logrotate"},"Logrotate")," an application to help us manage automatic rotation and compression of log files."),(0,a.kt)("p",null,"In essence, the journal and the logs duplicate the same information, and we want to make sure that we set measures to control it."),(0,a.kt)("h2",{id:"journal"},"Journal"),(0,a.kt)("p",null,"Journal is a component of Systemd, a centralized location for all messages logged by different components in a systemd-enabled Linux system. The systemd journal will happily run in parallel with the standard type log files in ",(0,a.kt)("inlineCode",{parentName:"p"},"/var/log/*")," where the Fleek Network Systemd Unit Service outputs Standard Output and Standard Error in the location ",(0,a.kt)("inlineCode",{parentName:"p"},"/var/log/lightning/*.log"),"."),(0,a.kt)("p",null,"Here, we are going to learn how to configure the ",(0,a.kt)("inlineCode",{parentName:"p"},"journald.conf")," service configuration file for the system-wide settings (meaning that it applies to all services), but firstly we're going to learn some commands to help us troubleshoot when necessary."),(0,a.kt)("h3",{id:"commands"},"Commands"),(0,a.kt)("h4",{id:"disk-utilization-checkup"},"Disk utilization checkup"),(0,a.kt)("p",null,"To check how much disk space is used by Systemd log files, run the command below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo journalctl --disk-usage\n")),(0,a.kt)("p",null,"It provides information of how much disk space is utilized by the log files in your system."),(0,a.kt)("h4",{id:"clearing-logs-manually"},"Clearing logs manually"),(0,a.kt)("p",null,"The best way to clear log files is done automatically by the ",(0,a.kt)("inlineCode",{parentName:"p"},"journald.conf")," configuration file, discussed in ",(0,a.kt)("a",{parentName:"p",href:"#configuration-file"},"Configuration file"),". In the ideal world, you shouldn't have to manually delete the log files, but this can be useful to know about when troubleshooting."),(0,a.kt)("p",null,"To ",(0,a.kt)("inlineCode",{parentName:"p"},"flush")," the log files run the command below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo journalctl --flush --rotate\nsudo journalctl --vacuum-time=1s\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The flush and rotate flag is used, as vaccum-time only clears archived logs and not active ones. It'll flush:"),(0,a.kt)("ul",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ul"},"Move /run/log/journal to /var/log/journal"),(0,a.kt)("li",{parentName:"ul"},"Rotate (this flag archives logs and retains it)")),(0,a.kt)("p",{parentName:"admonition"},"Since it'll only keep the past 1-second-long files, it'll effectively clear everything.")),(0,a.kt)("h4",{id:"follow-or-tail-logs-of-service"},"Follow or tail logs of service"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo journalctl -u .service -f\n")),(0,a.kt)("p",null,"For example, for a conventional native install (if you haven't followed the conventions, make the appropriate tweaks to fit your needs)."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo journalctl -u lightning.service -f\n")),(0,a.kt)("p",null,"The Docker service"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo journalctl -u docker-lightning.service -f\n")),(0,a.kt)("h4",{id:"show-all-service-entries"},"Show all service entries"),(0,a.kt)("p",null,"Show all journal entries, which can be fairly long:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo journalctl\n")),(0,a.kt)("h3",{id:"configuration-file"},"Configuration file"),(0,a.kt)("p",null,"The default configuration file is located at ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/systemd/journald.conf"),". This is the main file that journal reads the configuration from, for the system instances that are controlled by root."),(0,a.kt)("p",null,"In addition to the main configuration file there are a few other locations that take higher precedence and override the main configuration file. To learn more about journald read ",(0,a.kt)("a",{parentName:"p",href:"https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html#Options"},"here"),"."),(0,a.kt)("p",null,"To keep the guide short we are going to use the main location ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/systemd/journald.conf"),"."),(0,a.kt)("h3",{id:"create-the-directory-and-config-file"},"Create the directory and config file"),(0,a.kt)("p",null,"If the ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/systemd/journald.conf")," file doesn't exist, create it by:"),(0,a.kt)("p",null,"Create the ",(0,a.kt)("inlineCode",{parentName:"p"},"journald.conf")," file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo touch /etc/systemd/journald.conf\n")),(0,a.kt)("h3",{id:"configuration-settings"},"Configuration settings"),(0,a.kt)("p",null,"The Systemd provides many options for you to manage the log files and by combining these parameters you can limit the disk space used by the journal files."),(0,a.kt)("p",null,"A list of the available options are ",(0,a.kt)("a",{parentName:"p",href:"https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html#Options"},"here"),"."),(0,a.kt)("p",null,"Here is a quick description of the options we're going to use for our example:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Storage"),", controls where to store journal data\t"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"SystemMaxUse"),", specifies the maximum disk space that can be used by the journal in persistent storage"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"SystemMaxFileSize"),", controls how large individual journal files can grow to in persistent storage before being rotated"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"RuntimeMaxUse"),", control how much disk space the journal may use up at most")),(0,a.kt)("p",null,"You should open the ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/systemd/journald.conf")," file in your favorite text editor and put:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},"[Journal]\nStorage=persistent\nSystemMaxUse=1G\nSystemMaxFileSize=100M\nRuntimeMaxUse=100M\n")),(0,a.kt)("p",null,"Here, we set 1G and 100M, which means 1 Gigabyte and 100 Megabytes. You can also use K for Kbytes, amongst others."),(0,a.kt)("p",null,"After the changes, you have to restart the journald after updating the file. To restart use the command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo systemctl restart systemd-journald\n")),(0,a.kt)("p",null,"You can verify the integrity of the log files by running:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo journalctl --verify\n")),(0,a.kt)("h2",{id:"logrotate"},"Logrotate"),(0,a.kt)("p",null,"Logrotate is a tool to manage the log files created by a system processes. It can automatically compress, rename, remove logs and more for your convenience and save your system's resources. Log files can be handled timely, or when it grows too large."),(0,a.kt)("h3",{id:"prerequesite"},"Prerequesite"),(0,a.kt)("p",null,"The logrotate tools is available by default on Ubuntu."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"We're using Ubuntu for our guide to keep it simple. If you are using a different and support operating system make sure you install Logrotate before proceeding.")),(0,a.kt)("p",null,"You can check if logrotate is installed by executing:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"logrotate --version\n")),(0,a.kt)("p",null,"At the time this guide was written, we got the following output:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"logrotate 3.21.0\n\n Default mail command: /usr/bin/mail\n Default compress command: /bin/gzip\n Default uncompress command: /bin/gunzip\n Default compress extension: .gz\n Default state file path: /var/lib/logrotate/status\n ACL support: yes\n SELinux support: yes\n")),(0,a.kt)("p",null,"If you run an earlier or older version, changes or tweaks might apply."),(0,a.kt)("h3",{id:"explore-the-configuration-files"},"Explore the Configuration files"),(0,a.kt)("p",null,"The configuration files we'll be exploring today are found in the following locations in Ubuntu:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"/etc/logrotate.conf"),", is the main configuration settings file. It includes the statement to pull in configuration files from other directories, e.g. the ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/logrotate.d"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"/etc/logrotate.d/"),", a directory where packages drop log rotation information"))),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"We use Ubuntu for our guide, if you are on a different distro, you have to determine the file configuration file locations")),(0,a.kt)("p",null,"The content of the file ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/logrotate.conf")," should be similar to:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'# see "man logrotate" for details\n\n# global options do not affect preceding include directives\n\n# rotate log files weekly\nweekly\n\n# use the adm group by default, since this is the owning group\n# of /var/log/.\nsu root adm\n\n# keep 4 weeks worth of backlogs\nrotate 4\n\n# create new (empty) log files after rotating old ones\ncreate\n\n# use date as a suffix of the rotated file\n#dateext\n\n# uncomment this if you want your log files compressed\n#compress\n\n# packages drop log rotation information into this directory\ninclude /etc/logrotate.d\n\n# system-specific logs may also be configured here.\n')),(0,a.kt)("p",null,"The configuration settings if anything like the above, tell us that the rotation happens weekly, keeping 4 weeks worth of backlogs, etc."),(0,a.kt)("p",null,"To learn more about other configuration options consult the ",(0,a.kt)("a",{parentName:"p",href:"https://linux.die.net/man/8/logrotate"},"logrotate manual page"),"."),(0,a.kt)("h3",{id:"create-the-lightning-logrotate-configuration-file"},"Create the Lightning logrotate configuration file"),(0,a.kt)("p",null,"Let's create a Logrotate configuration file for Fleek Network Lightning Service. Create the file by running the command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo touch /etc/logrotate.d/lightning\n")),(0,a.kt)("h3",{id:"lightning-configuration-settings"},"Lightning Configuration Settings"),(0,a.kt)("p",null,"Open the recently created file ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/logrotate.d/lightning")," in your favorite text editor."),(0,a.kt)("p",null,"Add the following lines to the file:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"/var/log/lightning/*.log {\n rotate 5\n daily\n size 50M\n notifempty\n compress\n}\n")),(0,a.kt)("p",null,"Remember to save the file before exiting the text editor. You can test the configuration file by running the command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"sudo logrotate /etc/logrotate.conf --debug\n")),(0,a.kt)("p",null,"The configuration file above declares that for the log files in the ",(0,a.kt)("inlineCode",{parentName:"p"},"/var/log/lightning")," directory, the log files are rotated 5 times daily before being removed, as long they grow bigger than 50 megabytes in file size or empty. Old versions of log files are compressed with gzip."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Bear in mind that this configuration file also inherit the default behavior, e.g. the ",(0,a.kt)("inlineCode",{parentName:"p"},"create")," as set in the main configuration file ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/logrotate.conf"),".")),(0,a.kt)("p",null,"Feel free to customize the settings to your liking by checking the documentation in the ",(0,a.kt)("a",{parentName:"p",href:"https://linux.die.net/man/8/logrotate"},"logrotate manual page"),"."),(0,a.kt)("h3",{id:"cron-job"},"Cron job"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"Depending on the operating system, you have to set up a cron job to execute logrotate with the configuration file daily. Since we are using Ubuntu for our example, a daily cron job runner is already set up for us. If you are on a different Distro/OS make the required amends.")),(0,a.kt)("p",null,"Verify that the ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/cron.daily/logrotate")," exists and includes the execution of ",(0,a.kt)("inlineCode",{parentName:"p"},"logrotate")," with the configuration argument ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/logrotate.conf"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"/usr/sbin/logrotate /etc/logrotate.conf\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"If you have modified the location of the binary or main configuration file, make sure this is set correctly to your custom locations.")),(0,a.kt)("p",null,"To summarize, the ",(0,a.kt)("inlineCode",{parentName:"p"},"logrotate /etc/logrotate.conf")," is executed and as logrotate.conf goes through its list of commands, it calls ",(0,a.kt)("inlineCode",{parentName:"p"},"include /etc/logrotate.d"),". It means that any scripts in ",(0,a.kt)("inlineCode",{parentName:"p"},"/etc/logrotate.d")," are executed, such as the ",(0,a.kt)("a",{parentName:"p",href:"#lightning-configuration-settings"},"Lightning Configuration Settings"),"."),(0,a.kt)("h2",{id:"conclusion"},"Conclusion"),(0,a.kt)("p",null,"The guide starts by warning us about the stream text messages that the Fleek Network emits by default. As the text data is aggregated and stored in the file system it can lead to fill up the limited available disk space quickly, causing issues to the operation of the system."),(0,a.kt)("p",null,"To help control it, the journald is introduced, by explaining its role as a centralized message system, that runs alongside the application logs. Then, have it configured to limit the maximum file size, amongst other system-wide settings."),(0,a.kt)("p",null,"Finally, logrotate is discussed in helping us manage the Fleek Network Lightning application log files by setting it to automatically compress, rename, remove logs for the system admin convenience and saving system's resources."),(0,a.kt)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}p.isMDXComponent=!0},3872:(e,t,o)=>{o.d(t,{Z:()=>a});var n=o(7294);const a=e=>{let{image:t,name:o,title:a,url:i,communityMember:r=!1}=e;return n.createElement("section",{className:"author_card"},n.createElement("div",null,n.createElement("span",{className:"avatar"},n.createElement("a",{href:i,target:"_blank",alt:o},n.createElement("img",{src:t,alt:o}))),n.createElement("div",null,n.createElement("span",{className:"name"},n.createElement("a",{href:i,target:"_blank",alt:o},o)),n.createElement("span",{className:"title"},a),n.createElement("span",{className:"discord"},r?"Join our community on":"Got questions? Find us on"," ",n.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},5407:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/how-to-manage-log-files-be3f38ea329523fb5ec346ee98946dbe.png"},4350:(e,t,o)=>{o.d(t,{Z:()=>n});const n=o.p+"assets/images/managing-the-keystore-fe4cdb19d2f59c54bcf864b0e069b535.png"}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.3c1887b3.js.LICENSE.txt b/assets/js/1a4e3797.3c1887b3.js.LICENSE.txt deleted file mode 100644 index f167ba6c6..000000000 --- a/assets/js/1a4e3797.3c1887b3.js.LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -/*! algoliasearch-lite.umd.js | 4.19.1 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1a4e3797.3c1887b3.js b/assets/js/1a4e3797.769d8c18.js similarity index 61% rename from assets/js/1a4e3797.3c1887b3.js rename to assets/js/1a4e3797.769d8c18.js index 8778523d8..340d3590d 100644 --- a/assets/js/1a4e3797.3c1887b3.js +++ b/assets/js/1a4e3797.769d8c18.js @@ -1,2 +1,2 @@ -/*! For license information please see 1a4e3797.3c1887b3.js.LICENSE.txt */ -(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7920],{7331:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,a,s,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(a=this._events[e]))return!1;if(r(a))switch(arguments.length){case 1:a.call(this);break;case 2:a.call(this,arguments[1]);break;case 3:a.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),a.apply(this,c)}else if(n(a))for(c=Array.prototype.slice.call(arguments,1),s=(o=a.slice()).length,u=0;u0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,a,s,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(s=(i=this._events[e]).length,a=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=s;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){a=c;break}if(a<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},8131:(e,t,r)=>{"use strict";var n=r(9374),i=r(7775),a=r(3076);function s(e,t,r){return new n(e,t,r)}s.version=r(4336),s.AlgoliaSearchHelper=n,s.SearchParameters=i,s.SearchResults=a,e.exports=s},8078:(e,t,r)=>{"use strict";var n=r(7331);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(4853)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},2437:(e,t,r)=>{"use strict";var n=r(2344),i=r(116),a=r(9803),s={addRefinement:function(e,t,r){if(s.isRefined(e,t,r))return e;var i=""+r,a=e[t]?e[t].concat(i):[i],c={};return c[t]=a,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return s.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return s.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return s.isRefined(e,t,r)?s.removeRefinement(e,t,r):s.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return a(e,[t]);if("function"==typeof t){var n=!1,s=Object.keys(e).reduce((function(i,a){var s=e[a]||[],c=s.filter((function(e){return!t(e,a,r)}));return c.length!==s.length&&(n=!0),i[a]=c,i}),{});return n?s:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=s},7775:(e,t,r)=>{"use strict";var n=r(2344),i=r(7888),a=r(2686),s=r(185),c=r(116),u=r(9803),o=r(8023),h=r(6801),f=r(2437);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return s({},e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=o(r);if(this.isNumericRefined(e,t,n))return this;var i=s({},this.numericRefinements);return i[e]=s({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,o(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var a=r[i],s={};return a=a||{},Object.keys(a).forEach((function(r){var n=a[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),s[r]=c})),n[i]=s,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var a,s,c=o(r),u=void 0!==(a=this.numericRefinements[e][t],s=c,i(a,(function(e){return l(e,s)})));return n&&u},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=a(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return a(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),a=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(a)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},210:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=a(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,a){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m{"use strict";var n=r(4587),i=r(2344),a=r(4039),s=r(7888),c=r(9725),u=r(2293),o=r(185),h=r(2148),f=a.escapeFacetValue,l=a.unescapeFacetValue,m=r(210);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var a=t[0];this._rawResults=t;var u=this;Object.keys(a).forEach((function(e){u[e]=a[e]})),Object.keys(r||{}).forEach((function(e){u[e]=r[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var h=e.getRefinedDisjunctiveFacets(),f=d(e.facets),v=d(e.disjunctiveFacets),g=1,y=a.facets||{};Object.keys(y).forEach((function(t){var r,n,i=y[t],o=(r=e.hierarchicalFacets,n=t,s(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(o){var h=o.attributes.indexOf(t),l=c(e.hierarchicalFacets,(function(e){return e.name===o.name}));u.hierarchicalFacets[l][h]={attribute:t,data:i,exhaustive:a.exhaustiveFacetsCount}}else{var m,d=-1!==e.disjunctiveFacets.indexOf(t),g=-1!==e.facets.indexOf(t);d&&(m=v[t],u.disjunctiveFacets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.disjunctiveFacets[m],a.facets_stats,t)),g&&(m=f[t],u.facets[m]={name:t,data:i,exhaustive:a.exhaustiveFacetsCount},p(u.facets[m],a.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),h.forEach((function(r){var n=t[g],s=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(s).forEach((function(t){var r,f=s[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(u.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;u.hierarchicalFacets[r][m].data=o({},u.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=a.facets&&a.facets[t]||{};u.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(u.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!u.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(u.disjunctiveFacets[r].data[n]=0)}))}})),g++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),a=e._getHierarchicalFacetSeparator(n),s=e.getHierarchicalRefinement(r);0===s.length||s[0].split(a).length<2||t.slice(g).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var o=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(u.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(s.length>0){var m=s[0].split(a)[0];l[m]=u.hierarchicalFacets[h][f].data[m]}u.hierarchicalFacets[h][f].data=i(l,o,u.hierarchicalFacets[h][f].data)}})),g++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=f[t];u.facets[n]={name:t,data:y[t],exhaustive:a.exhaustiveFacetsCount},r.forEach((function(e){u.facets[n]=u.facets[n]||{name:t},u.facets[n].data=u.facets[n].data||{},u.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=s(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=s(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var a=s(e.hierarchicalFacets,r);if(!a)return a;var c=e._state.getHierarchicalFacetByName(t),u=e._state._getHierarchicalFacetSeparator(c),o=l(e._state.getHierarchicalRefinement(t)[0]||"");0===o.indexOf(c.rootPath)&&(o=o.replace(c.rootPath+u,""));var h=o.split(u);return h.unshift(t),y(a,h,0),a}}function y(e,t,r){e.isRefined=e.name===t[r],e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var a=t.data.map((function(t){return R(e,t,r,n+1)})),s=e(a,r[n]);return i({data:s},t)}function F(e,t){var r=s(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var a=s(i,(function(e){return e.name===r})),c=a&&a.data&&a.data[n]?a.data[n]:0,u=a&&a.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return s(this.facets,t)||s(this.disjunctiveFacets,t)||s(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,a=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),s=this;if(Array.isArray(r))n=[e];else n=s._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(a.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(s,t);if(r)return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var a,s=t.sortRemainingBy;return"hidden"===s?r:(a="alpha"===s?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(a.sortBy)){var n=u(a.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof a.sortBy)return function(e,t){return t.sort(e)}(a.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),a=e._getHierarchicalFacetSeparator(i),c=r.split(a),u=s(n,(function(e){return e.name===t})),o=c.reduce((function(e,t){var r=e&&s(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},9374:(e,t,r)=>{"use strict";var n=r(7331),i=r(8078),a=r(4039).escapeFacetValue,s=r(4853),c=r(185),u=r(116),o=r(9803),h=r(6394),f=r(7775),l=r(3076),m=r(4336);function d(e,t,r){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.setClient(e);var n=r||{};n.index=t,this.state=f.make(n),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}s(d,n),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return h._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=h._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new l(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new l(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:o(h._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),a="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(a);var s=this.client.initIndex(n.index);if("function"!=typeof s.findAnswers)throw new Error(a);return s.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,s="function"==typeof this.client.initIndex;if(!i&&!s&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=h.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var f,l=this;return i?f=this.client.searchForFacetValues([{indexName:c.index,params:o}]):s?f=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,f=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),f.then((function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=a(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:f.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new f(e),this},d.prototype.hasRefinements=function(e){return!!u(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=h._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?h._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),a=Array.prototype.concat.apply(n,i),s=this._queryId++;if(this._currentNbQueries++,!a.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,s));try{this.client.search(a).then(this._dispatchAlgoliaResponse.bind(this,r,s)).catch(this._dispatchAlgoliaError.bind(this,s))}catch(c){this.emit("error",{error:c})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){if(!(t0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new i(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},4587:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},2344:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},4039:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},7888:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{"use strict";var n=r(7888);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),a=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!a?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(a[0]),e[1].push(a[1]),e)}),[[],[]])}},4853:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},2686:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},185:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var a=n[i],s=e[i];void 0!==s&&void 0===a||(t(s)&&t(a)?e[i]=r(s,a):e[i]="object"==typeof(c=a)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},9803:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},2148:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,a=null===t;if(!a&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?a:"desc"===n[i]?-a:a}return e.index-r.index})),i.map((function(e){return e.value}))}},8023:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},6394:(e,t,r)=>{"use strict";var n=r(185);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var a={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:a._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:a._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),s=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(s.length>0&&s[0].split(c).length>1){var u=s[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,s){var c=a._getDisjunctiveFacetSearchParams(t,n.attribute,0===s);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[s-1];c.facetFilters=s>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(a._getHitsHierarchicalFacetsAttributes(e)).sort(),r=a._getFacetFilters(e),s=a._getNumericFilters(e),c=a._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),s.length>0&&(u.numericFilters=s),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var s=a._getFacetFilters(e,t,r),c=a._getNumericFilters(e,t),u=a._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?a._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),s.length>0&&(o.facetFilters=s),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var a=i[e]||[];t!==n&&a.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).sort().forEach((function(t){n.push(e+":"+t)}))}));var a=e.facetsExcludes||{};Object.keys(a).sort().forEach((function(e){(a[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var s=e.disjunctiveFacetsRefinements||{};Object.keys(s).sort().forEach((function(e){var r=s[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var a=(c[i]||[])[0];if(void 0!==a){var s,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===a.indexOf(h)||!f&&!0===r||f&&f.split(h).length===a.split(h).length)return;f?(u=f.split(h).length-1,a=f):(u=a.split(h).length-2,a=a.slice(0,a.lastIndexOf(h))),s=o.attributes[u]}else u=a.split(h).length-1,s=o.attributes[u];s&&n.push([s+":"+a])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),a=n.split(i).length,s=r.attributes.slice(0,a+1);return t.concat(s)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),a=0;return i&&(a=i.split(n).length),[t.attributes[a]]}var s=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,s+1)},getSearchForFacetQuery:function(e,t,r,s){var c=s.isDisjunctiveFacet(e)?s.clearRefinements(e):s,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},a._getHitsSearchParams(c),u))}};e.exports=a},6801:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},4336:e=>{"use strict";e.exports="3.14.0"},290:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,a=void 0;try{for(var s,c=e[Symbol.iterator]();!(n=(s=c.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){i=!0,a=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw a}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return a()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],a=t[1];return Promise.all([n,a||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=a();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=a();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=a(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(r);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=n(),c=i&&i.miss||function(){return Promise.resolve()};return s.then((function(e){return c(e)})).then((function(){return s}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function P(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(a(r),a(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function j(e,t,n,i){var s=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,a){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(s)};var m={data:c,headers:u,method:o,url:E(h,n.path,f),connectTimeout:a(l,e.timeouts.connect),responseTimeout:a(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return s.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,a)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(s))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return P(e.hostsCache,t).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function _(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function E(e,t,r){var n=x(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function x(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var N=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),a=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,a=e.requestsCache,s=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:a,responsesCache:s,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var a={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(a,(function(){return f.requestsCache.get(a,(function(){return f.requestsCache.set(a,n()).then((function(e){return Promise.all([f.requestsCache.delete(a),e])}),(function(e){return Promise.all([f.requestsCache.delete(a),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(a,e)}})},write:function(e,t){return j(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:a,appId:t,addAlgoliaAgent:function(e,t){a.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:x(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var a=t.params,s=a.facetName,c=a.facetQuery,u=n(a,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(s,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},k=1,D=2,q=3;function V(e,t,n){var i,a={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},a=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(a),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(a),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(a),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return k>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return D>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[s({key:"".concat("4.19.1","-").concat(e)}),u()]}),userAgent:_("4.19.1").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return N(r(r(r({},a),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:A,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:Q}})}}}}))}return V.version="4.19.1",V}()},8824:(e,t,r)=>{"use strict";r.d(t,{c:()=>o});var n=r(7294),i=r(2263);const a=["zero","one","two","few","many","other"];function s(e){return a.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:s(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,i.Z)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:s(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function o(){const e=u();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),a=r.pluralForms.indexOf(i);return n[Math.min(a,n.length-1)]}(r,t,e)}}},9172:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>x});var n=r(7294),i=r(6010),a=r(8131),s=r.n(a),c=r(290),u=r.n(c),o=r(412),h=r(5742),f=r(9960),l=r(143),m=r(8824),d=r(6177),p=r(902),v=r(833),g=r(2128),y=r(5999),R=r(2263),F=r(6278),b=r(239),P=r(8888);const j={searchQueryInput:"searchQueryInput_u2C7",searchVersionInput:"searchVersionInput_m0Ui",searchResultsColumn:"searchResultsColumn_JPFH",algoliaLogo:"algoliaLogo_rT1R",algoliaLogoPathFill:"algoliaLogoPathFill_WdUC",searchResultItem:"searchResultItem_Tv2o",searchResultItemHeading:"searchResultItemHeading_KbCB",searchResultItemPath:"searchResultItemPath_lhe1",searchResultItemSummary:"searchResultItemSummary_AEaO",searchQueryColumn:"searchQueryColumn_RTkw",searchVersionColumn:"searchVersionColumn_ypXd",searchLogoColumn:"searchLogoColumn_rJIA",loadingSpinner:"loadingSpinner_XVxU","loading-spin":"loading-spin_vzvp",loader:"loader_vvXV"};function _(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return n.createElement("div",{className:(0,i.Z)("col","col--3","padding-left--none",j.searchVersionColumn)},r.map((e=>{let[i,a]=e;const s=r.length>1?`${i}: `:"";return n.createElement("select",{key:i,onChange:e=>t.setSearchVersion(i,e.target.value),defaultValue:t.searchVersions[i],className:j.searchVersionInput},a.versions.map(((e,t)=>n.createElement("option",{key:t,label:`${s}${e.label}`,value:e.name}))))})))}function E(){const{i18n:{currentLocale:e}}=(0,R.Z)(),{algolia:{appId:t,apiKey:r,indexName:a}}=(0,F.L)(),c=(0,b.l)(),v=function(){const{selectMessage:e}=(0,m.c)();return t=>e(t,(0,y.I)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),E=function(){const e=(0,l._r)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[x,O]=(0,d.K)(),w={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[N,A]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return w;case"loading":return{...e,loading:!0};case"update":return x!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),w),H=u()(t,r),S=s()(H,a,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});S.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:a}}=e;if(""===t||!Array.isArray(r))return void A({type:"reset"});const s=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>s(r[e].value)));return{title:i.pop(),url:c(t),summary:n.content?`${s(n.content.value)}...`:"",breadcrumbs:i}}));A({type:"update",value:{items:u,query:t,totalResults:i,totalPages:a,lastPage:n,hasMore:a>n+1,loading:!1}})}));const[T,Q]=(0,n.useState)(null),C=(0,n.useRef)(0),I=(0,n.useRef)(o.Z.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&C.current>r&&A({type:"advance"}),C.current=r}),{threshold:1})),k=()=>x?(0,y.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:x}):(0,y.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),D=(0,p.zX)((function(t){void 0===t&&(t=0),S.addDisjunctiveFacetRefinement("docusaurus_tag","default"),S.addDisjunctiveFacetRefinement("language",e),Object.entries(E.searchVersions).forEach((e=>{let[t,r]=e;S.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),S.setQuery(x).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!T)return;const e=I.current;return e?(e.observe(T),()=>e.unobserve(T)):()=>!0}),[T]),(0,n.useEffect)((()=>{A({type:"reset"}),x&&(A({type:"loading"}),setTimeout((()=>{D()}),300))}),[x,E.searchVersions,D]),(0,n.useEffect)((()=>{N.lastPage&&0!==N.lastPage&&D(N.lastPage)}),[D,N.lastPage]),n.createElement(P.Z,null,n.createElement(h.Z,null,n.createElement("title",null,(0,g.p)(k())),n.createElement("meta",{property:"robots",content:"noindex, follow"})),n.createElement("div",{className:"container margin-vert--lg"},n.createElement("h1",null,k()),n.createElement("form",{className:"row",onSubmit:e=>e.preventDefault()},n.createElement("div",{className:(0,i.Z)("col",j.searchQueryColumn,{"col--9":E.versioningEnabled,"col--12":!E.versioningEnabled})},n.createElement("input",{type:"search",name:"q",className:j.searchQueryInput,placeholder:(0,y.I)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,y.I)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>O(e.target.value),value:x,autoComplete:"off",autoFocus:!0})),E.versioningEnabled&&n.createElement(_,{docsSearchVersionsHelpers:E})),n.createElement("div",{className:"row"},n.createElement("div",{className:(0,i.Z)("col","col--8",j.searchResultsColumn)},!!N.totalResults&&v(N.totalResults)),n.createElement("div",{className:(0,i.Z)("col","col--4","text--right",j.searchLogoColumn)},n.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://www.algolia.com/","aria-label":(0,y.I)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"})},n.createElement("svg",{viewBox:"0 0 168 24",className:j.algoliaLogo},n.createElement("g",{fill:"none"},n.createElement("path",{className:j.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),n.createElement("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),n.createElement("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})))))),N.items.length>0?n.createElement("main",null,N.items.map(((e,t)=>{let{title:r,url:a,summary:s,breadcrumbs:c}=e;return n.createElement("article",{key:t,className:j.searchResultItem},n.createElement("h2",{className:j.searchResultItemHeading},n.createElement(f.Z,{to:a,dangerouslySetInnerHTML:{__html:r}})),c.length>0&&n.createElement("nav",{"aria-label":"breadcrumbs"},n.createElement("ul",{className:(0,i.Z)("breadcrumbs",j.searchResultItemPath)},c.map(((e,t)=>n.createElement("li",{key:t,className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}}))))),s&&n.createElement("p",{className:j.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}}))}))):[x&&!N.loading&&n.createElement("p",{key:"no-results"},n.createElement(y.Z,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result"},"No results were found")),!!N.loading&&n.createElement("div",{key:"spinner",className:j.loadingSpinner})],N.hasMore&&n.createElement("div",{className:j.loader,ref:Q},n.createElement(y.Z,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results"},"Fetching new results..."))))}function x(){return n.createElement(v.FG,{className:"search-page-wrapper"},n.createElement(E,null))}}}]); \ No newline at end of file +/*! For license information please see 1a4e3797.769d8c18.js.LICENSE.txt */ +(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7920],{7331:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,u,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(o=s.slice()).length,u=0;u0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},8131:(e,t,r)=>{"use strict";var n=r(9374),i=r(7775),s=r(3076);function a(e,t,r){return new n(e,t,r)}a.version=r(4336),a.AlgoliaSearchHelper=n,a.SearchParameters=i,a.SearchResults=s,e.exports=a},8078:(e,t,r)=>{"use strict";var n=r(7331);function i(e,t){this.main=e,this.fn=t,this.lastResults=null}r(4853)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},e.exports=i},2437:(e,t,r)=>{"use strict";var n=r(2344),i=r(116),s=r(9803),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},7775:(e,t,r)=>{"use strict";var n=r(2344),i=r(7888),s=r(2686),a=r(185),c=r(116),u=r(9803),o=r(8023),h=r(6801),f=r(2437);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a({},e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=o(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,o(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return u(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=o(r),u=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&u},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?u(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},210:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],o=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(o,h,f){var l=o;if(f>0){var m=0;for(l=o;m{"use strict";var n=r(4587),i=r(2344),s=r(4039),a=r(7888),c=r(9725),u=r(2293),o=r(185),h=r(2148),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(210);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function v(e,t,r){var s=t[0];this._rawResults=t;var u=this;Object.keys(s).forEach((function(e){u[e]=s[e]})),Object.keys(r||{}).forEach((function(e){u[e]=r[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var h=e.getRefinedDisjunctiveFacets(),f=d(e.facets),v=d(e.disjunctiveFacets),g=1,y=s.facets||{};Object.keys(y).forEach((function(t){var r,n,i=y[t],o=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(o){var h=o.attributes.indexOf(t),l=c(e.hierarchicalFacets,(function(e){return e.name===o.name}));u.hierarchicalFacets[l][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var m,d=-1!==e.disjunctiveFacets.indexOf(t),g=-1!==e.facets.indexOf(t);d&&(m=v[t],u.disjunctiveFacets[m]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(u.disjunctiveFacets[m],s.facets_stats,t)),g&&(m=f[t],u.facets[m]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(u.facets[m],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),h.forEach((function(r){var n=t[g],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(u.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;u.hierarchicalFacets[r][m].data=o({},u.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=s.facets&&s.facets[t]||{};u.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(u.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!u.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(u.disjunctiveFacets[r].data[n]=0)}))}})),g++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(g).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var o=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(u.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0){var m=a[0].split(s)[0];l[m]=u.hierarchicalFacets[h][f].data[m]}u.hierarchicalFacets[h][f].data=i(l,o,u.hierarchicalFacets[h][f].data)}})),g++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=f[t];u.facets[n]={name:t,data:y[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){u.facets[n]=u.facets[n]||{name:t},u.facets[n].data=u.facets[n].data||{},u.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function g(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),u=e._state._getHierarchicalFacetSeparator(c),o=l(e._state.getHierarchicalRefinement(t)[0]||"");0===o.indexOf(c.rootPath)&&(o=o.replace(c.rootPath+u,""));var h=o.split(u);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===t[r],e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,u=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:u}}v.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},v.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],v.prototype.getFacetValues=function(e,t){var r=g(this,e);if(r){var n,s=i({},t,{sortBy:v.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var s,a=t.sortRemainingBy;return"hidden"===a?r:(s="alpha"===a?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,s[0],s[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=u(s.sortBy,v.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},v.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},v.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),u=a(n,(function(e){return e.name===t})),o=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),u),h=o&&o.count||0,f=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=v},9374:(e,t,r)=>{"use strict";var n=r(7331),i=r(8078),s=r(4039).escapeFacetValue,a=r(4853),c=r(185),u=r(116),o=r(9803),h=r(6394),f=r(7775),l=r(3076),m=r(4336);function d(e,t,r){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.setClient(e);var n=r||{};n.index=t,this.state=f.make(n),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0}function p(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function v(){return this.state.page}a(d,n),d.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},d.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},d.prototype.getQuery=function(){var e=this.state;return h._getHitsSearchParams(e)},d.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=h._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new l(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new l(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},d.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:o(h._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},d.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),u=c.isDisjunctiveFacet(e),o=h.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var f,l=this;return i?f=this.client.searchForFacetValues([{indexName:c.index,params:o}]):a?f=this.client.initIndex(c.index).searchForFacetValues(o):(delete o.facetName,f=this.client.search([{type:"facet",facet:e,indexName:c.index,params:o}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),f.then((function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=u?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e}))},d.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},d.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},d.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},d.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},d.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},d.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},d.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},d.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},d.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},d.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},d.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},d.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},d.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},d.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},d.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},d.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},d.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},d.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},d.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},d.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},d.prototype.setCurrentPage=p,d.prototype.setPage=p,d.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},d.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},d.prototype.setState=function(e){return this._change({state:f.make(e),isPageReset:!1}),this},d.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new f(e),this},d.prototype.hasRefinements=function(e){return!!u(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},d.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},d.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},d.prototype.hasTag=function(e){return this.state.isTagRefined(e)},d.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},d.prototype.getIndex=function(){return this.state.index},d.prototype.getCurrentPage=v,d.prototype.getPage=v,d.prototype.getTags=function(){return this.state.tagRefinements},d.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},d.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},d.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},d.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=h._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?h._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},d.prototype._dispatchAlgoliaResponse=function(e,t,r){if(!(t0},d.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},d.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},d.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+m+")"),this.client=e),this},d.prototype.getClient=function(){return this.client},d.prototype.derive=function(e){var t=new i(this,e);return this.derivedHelpers.push(t),t},d.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},d.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=d},4587:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},2344:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},4039:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},7888:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{"use strict";var n=r(7888);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},4853:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},2686:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},185:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},9803:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},2148:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},8023:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},6394:(e,t,r)=>{"use strict";var n=r(185);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var u=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);u.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function o(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!o(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||o(t)||e.push(t),e}),[]),f=u[a-1];c.facetFilters=a>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),u={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(u.facetFilters=r),a.length>0&&(u.numericFilters=a),i(n({},e.getQueryParams(),u))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),u=s._getTagFilters(e),o={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};u.length>0&&(o.tagFilters=u);var h=e.getHierarchicalFacetByName(t);return o.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(o.numericFilters=c),a.length>0&&(o.facetFilters=a),i(n({},e.getQueryParams(),o))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,u,o=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(o),f=e._getHierarchicalRootPath(o);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(u=f.split(h).length-1,s=f):(u=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=o.attributes[u]}else u=s.split(h).length-1,a=o.attributes[u];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,u={facetQuery:t,facetName:e};return"number"==typeof r&&(u.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),u))}};e.exports=s},6801:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},4336:e=>{"use strict";e.exports="3.15.0"},290:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,v=2,g=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function P(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),u=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),o=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(a)};var m={data:c,headers:u,method:o,url:_(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?g:v))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&0==~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function x(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function _(e,t,r){var n=E(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function E(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var A=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:u,headers:e.headers,queryParameters:h,hosts:o.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return P(f,f.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},N=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},H=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},S=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:E(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},T=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,u=n(s,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(a,c,r(r({},i),u))})))}},Q=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,k=2,q=3;function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.20.0","-").concat(e)}),u()]}),userAgent:x("4.20.0").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return A(r(r(r({},s),n),{},{methods:{search:S,searchForFacetValues:T,multipleQueries:S,multipleSearchForFacetValues:T,customRequest:N,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:Q}})}}}}))}return V.version="4.20.0",V}()},8824:(e,t,r)=>{"use strict";r.d(t,{c:()=>o});var n=r(7294),i=r(2263);const s=["zero","one","two","few","many","other"];function a(e){return s.filter((t=>e.includes(t)))}const c={locale:"en",pluralForms:a(["one","other"]),select:e=>1===e?"one":"other"};function u(){const{i18n:{currentLocale:e}}=(0,i.Z)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:a(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),c}}),[e])}function o(){const e=u();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}},2026:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>A});var n=r(7294);function i(e){var t,r,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t{let[,t]=e;return t.versions.length>1}));return(0,E.jsx)("div",{className:s("col","col--3","padding-left--none",_.searchVersionColumn),children:r.map((e=>{let[n,i]=e;const s=r.length>1?`${n}: `:"";return(0,E.jsx)("select",{onChange:e=>t.setSearchVersion(n,e.target.value),defaultValue:t.searchVersions[n],className:_.searchVersionInput,children:i.versions.map(((e,t)=>(0,E.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},n)}))})}function w(){const{i18n:{currentLocale:e}}=(0,F.Z)(),{algolia:{appId:t,apiKey:r,indexName:i}}=(0,b.L)(),a=(0,j.l)(),u=function(){const{selectMessage:e}=(0,d.c)();return t=>e(t,(0,R.I)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),g=function(){const e=(0,m._r)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[w,A]=(0,p.K)(),N={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[H,S]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return N;case"loading":return{...e,loading:!0};case"update":return w!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),N),T=o()(t,r),Q=c()(T,i,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["language","docusaurus_tag"]});Q.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void S({type:"reset"});const c=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),u=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>c(r[e].value)));return{title:i.pop(),url:a(t),summary:n.content?`${c(n.content.value)}...`:"",breadcrumbs:i}}));S({type:"update",value:{items:u,query:t,totalResults:i,totalPages:s,lastPage:n,hasMore:s>n+1,loading:!1}})}));const[C,I]=(0,n.useState)(null),D=(0,n.useRef)(0),k=(0,n.useRef)(h.Z.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&D.current>r&&S({type:"advance"}),D.current=r}),{threshold:1})),q=()=>w?(0,R.I)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:w}):(0,R.I)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),V=(0,v.zX)((function(t){void 0===t&&(t=0),Q.addDisjunctiveFacetRefinement("docusaurus_tag","default"),Q.addDisjunctiveFacetRefinement("language",e),Object.entries(g.searchVersions).forEach((e=>{let[t,r]=e;Q.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)})),Q.setQuery(w).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!C)return;const e=k.current;return e?(e.observe(C),()=>e.unobserve(C)):()=>!0}),[C]),(0,n.useEffect)((()=>{S({type:"reset"}),w&&(S({type:"loading"}),setTimeout((()=>{V()}),300))}),[w,g.searchVersions,V]),(0,n.useEffect)((()=>{H.lastPage&&0!==H.lastPage&&V(H.lastPage)}),[V,H.lastPage]),(0,E.jsxs)(P.Z,{children:[(0,E.jsxs)(f.Z,{children:[(0,E.jsx)("title",{children:(0,y.p)(q())}),(0,E.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,E.jsxs)("div",{className:"container margin-vert--lg",children:[(0,E.jsx)(x.Z,{as:"h1",children:q()}),(0,E.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,E.jsx)("div",{className:s("col",_.searchQueryColumn,{"col--9":g.versioningEnabled,"col--12":!g.versioningEnabled}),children:(0,E.jsx)("input",{type:"search",name:"q",className:_.searchQueryInput,placeholder:(0,R.I)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,R.I)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>A(e.target.value),value:w,autoComplete:"off",autoFocus:!0})}),g.versioningEnabled&&(0,E.jsx)(O,{docsSearchVersionsHelpers:g})]}),(0,E.jsxs)("div",{className:"row",children:[(0,E.jsx)("div",{className:s("col","col--8",_.searchResultsColumn),children:!!H.totalResults&&u(H.totalResults)}),(0,E.jsx)("div",{className:s("col","col--4","text--right",_.searchLogoColumn),children:(0,E.jsx)(l.Z,{to:"https://www.algolia.com/","aria-label":(0,R.I)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,E.jsx)("svg",{viewBox:"0 0 168 24",className:_.algoliaLogo,children:(0,E.jsxs)("g",{fill:"none",children:[(0,E.jsx)("path",{className:_.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,E.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,E.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),H.items.length>0?(0,E.jsx)("main",{children:H.items.map(((e,t)=>{let{title:r,url:n,summary:i,breadcrumbs:a}=e;return(0,E.jsxs)("article",{className:_.searchResultItem,children:[(0,E.jsx)(x.Z,{as:"h2",className:_.searchResultItemHeading,children:(0,E.jsx)(l.Z,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,E.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,E.jsx)("ul",{className:s("breadcrumbs",_.searchResultItemPath),children:a.map(((e,t)=>(0,E.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),i&&(0,E.jsx)("p",{className:_.searchResultItemSummary,dangerouslySetInnerHTML:{__html:i}})]},t)}))}):[w&&!H.loading&&(0,E.jsx)("p",{children:(0,E.jsx)(R.Z,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!H.loading&&(0,E.jsx)("div",{className:_.loadingSpinner},"spinner")],H.hasMore&&(0,E.jsx)("div",{className:_.loader,ref:I,children:(0,E.jsx)(R.Z,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function A(){return(0,E.jsx)(g.FG,{className:"search-page-wrapper",children:(0,E.jsx)(w,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.769d8c18.js.LICENSE.txt b/assets/js/1a4e3797.769d8c18.js.LICENSE.txt new file mode 100644 index 000000000..8c17e740e --- /dev/null +++ b/assets/js/1a4e3797.769d8c18.js.LICENSE.txt @@ -0,0 +1 @@ +/*! algoliasearch-lite.umd.js | 4.20.0 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */ diff --git a/assets/js/1be78505.60b95ee7.js b/assets/js/1be78505.60b95ee7.js deleted file mode 100644 index 863ce31a1..000000000 --- a/assets/js/1be78505.60b95ee7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9514,4972],{3803:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ge});var a=n(7294),o=n(6010),l=n(833),r=n(5281),c=n(3320),i=n(2802),s=n(4477),d=n(1116),m=n(8888),u=n(5999),b=n(2466),p=n(5936);const h={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};function E(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),l=(0,a.useRef)(!1),{startScroll:r,cancelScroll:c}=(0,b.Ct)();return(0,b.RF)(((e,n)=>{let{scrollY:a}=e;const r=n?.scrollY;r&&(l.current?l.current=!1:a>=r?(c(),o(!1)):a{e.location.hash&&(l.current=!0,o(!1))})),{shown:n,scrollToTop:()=>r(0)}}({threshold:300});return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.Z)("clean-btn",r.k.common.backToTopButton,h.backToTopButton,e&&h.backToTopButtonShow),type:"button",onClick:t})}var f=n(1442),g=n(6550),v=n(7524),k=n(6668),_=n(1327),C=n(7462);function S(e){return a.createElement("svg",(0,C.Z)({width:"20",height:"20","aria-hidden":"true"},e),a.createElement("g",{fill:"#7a7a7a"},a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),a.createElement("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})))}const I={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function N(e){let{onClick:t}=e;return a.createElement("button",{type:"button",title:(0,u.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.Z)("button button--secondary button--outline",I.collapseSidebarButton),onClick:t},a.createElement(S,{className:I.collapseSidebarButtonIcon}))}var T=n(9689),x=n(902);const Z=Symbol("EmptyContext"),B=a.createContext(Z);function y(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),l=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return a.createElement(B.Provider,{value:l},t)}var w=n(6043),L=n(8596),A=n(9960),M=n(2389);function F(e){let{categoryLabel:t,onClick:n}=e;return a.createElement("button",{"aria-label":(0,u.I)({id:"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel",message:"Toggle the collapsible sidebar category '{label}'",description:"The ARIA label to toggle the collapsible sidebar category"},{label:t}),type:"button",className:"clean-btn menu__caret",onClick:n})}function H(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{items:m,label:u,collapsible:b,className:p,href:h}=t,{docs:{sidebar:{autoCollapseCategories:E}}}=(0,k.L)(),f=function(e){const t=(0,M.Z)();return(0,a.useMemo)((()=>e.href?e.href:!t&&e.collapsible?(0,i.Wl)(e):void 0),[e,t])}(t),g=(0,i._F)(t,l),v=(0,L.Mg)(h,l),{collapsed:_,setCollapsed:S}=(0,w.u)({initialState:()=>!!b&&(!g&&t.collapsed)}),{expandedItem:I,setExpandedItem:N}=function(){const e=(0,a.useContext)(B);if(e===Z)throw new x.i6("DocSidebarItemsExpandedStateProvider");return e}(),T=function(e){void 0===e&&(e=!_),N(e?null:s),S(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const l=(0,x.D9)(t);(0,a.useEffect)((()=>{t&&!l&&n&&o(!1)}),[t,l,n,o])}({isActive:g,collapsed:_,updateCollapsed:T}),(0,a.useEffect)((()=>{b&&null!=I&&I!==s&&E&&S(!0)}),[b,I,s,S,E]),a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemCategory,r.k.docs.docSidebarItemCategoryLevel(c),"menu__list-item",{"menu__list-item--collapsed":_},p)},a.createElement("div",{className:(0,o.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v})},a.createElement(A.Z,(0,C.Z)({className:(0,o.Z)("menu__link",{"menu__link--sublist":b,"menu__link--sublist-caret":!h&&b,"menu__link--active":g}),onClick:b?e=>{n?.(t),h?T(!1):(e.preventDefault(),T())}:()=>{n?.(t)},"aria-current":v?"page":void 0,"aria-expanded":b?!_:void 0,href:b?f??"#":f},d),u),h&&b&&a.createElement(F,{categoryLabel:u,onClick:e=>{e.preventDefault(),T()}})),a.createElement(w.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:_},a.createElement(j,{items:m,tabIndex:_?-1:0,onItemClick:n,activePath:l,level:c+1})))}var P=n(3919),W=n(9471);const D={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:l,level:c,index:s,...d}=e;const{href:m,label:u,className:b,autoAddBaseUrl:p}=t,h=(0,i._F)(t,l),E=(0,P.Z)(m);return a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(c),"menu__list-item",b),key:u},a.createElement(A.Z,(0,C.Z)({className:(0,o.Z)("menu__link",!E&&D.menuExternalLink,{"menu__link--active":h}),autoAddBaseUrl:p,"aria-current":h?"page":void 0,to:m},E&&{onClick:n?()=>n(t):void 0},d),u,!E&&a.createElement(W.Z,null)))}const V={menuHtmlItem:"menuHtmlItem_M9Kj"};function z(e){let{item:t,level:n,index:l}=e;const{value:c,defaultStyle:i,className:s}=t;return a.createElement("li",{className:(0,o.Z)(r.k.docs.docSidebarItemLink,r.k.docs.docSidebarItemLinkLevel(n),i&&[V.menuHtmlItem,"menu__list-item"],s),key:l,dangerouslySetInnerHTML:{__html:c}})}function U(e){let{item:t,...n}=e;switch(t.type){case"category":return a.createElement(H,(0,C.Z)({item:t},n));case"html":return a.createElement(z,(0,C.Z)({item:t},n));default:return a.createElement(R,(0,C.Z)({item:t},n))}}function K(e){let{items:t,...n}=e;return a.createElement(y,null,t.map(((e,t)=>a.createElement(U,(0,C.Z)({key:t,item:e,index:t},n)))))}const j=(0,a.memo)(K),q={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function G(e){let{path:t,sidebar:n,className:l}=e;const c=function(){const{isActive:e}=(0,T.nT)(),[t,n]=(0,a.useState)(e);return(0,b.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return a.createElement("nav",{"aria-label":(0,u.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.Z)("menu thin-scrollbar",q.menu,c&&q.menuWithAnnouncementBar,l)},a.createElement("ul",{className:(0,o.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:n,activePath:t,level:1})))}const Y="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",X="sidebarHidden_VK0M",J="sidebarLogo_isFc";function Q(e){let{path:t,sidebar:n,onCollapse:l,isHidden:r}=e;const{navbar:{hideOnScroll:c},docs:{sidebar:{hideable:i}}}=(0,k.L)();return a.createElement("div",{className:(0,o.Z)(Y,c&&O,r&&X)},c&&a.createElement(_.Z,{tabIndex:-1,className:J}),a.createElement(G,{path:t,sidebar:n}),i&&a.createElement(N,{onClick:l}))}const $=a.memo(Q);var ee=n(3102),te=n(3163);const ne=e=>{let{sidebar:t,path:n}=e;const l=(0,te.e)();return a.createElement("ul",{className:(0,o.Z)(r.k.docs.docSidebarMenu,"menu__list")},a.createElement(j,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&l.toggle(),"link"===e.type&&l.toggle()},level:1}))};function ae(e){return a.createElement(ee.Zo,{component:ne,props:e})}const oe=a.memo(ae);function le(e){const t=(0,v.i)(),n="desktop"===t||"ssr"===t,o="mobile"===t;return a.createElement(a.Fragment,null,n&&a.createElement($,e),o&&a.createElement(oe,e))}const re={expandButton:"expandButton_m80_",expandButtonIcon:"expandButtonIcon_BlDH"};function ce(e){let{toggleSidebar:t}=e;return a.createElement("div",{className:re.expandButton,title:(0,u.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,u.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t},a.createElement(S,{className:re.expandButtonIcon}))}const ie={docSidebarContainer:"docSidebarContainer_b6E3",docSidebarContainerHidden:"docSidebarContainerHidden_b3ry",sidebarViewport:"sidebarViewport_Xe31"};function se(e){let{children:t}=e;const n=(0,d.V)();return a.createElement(a.Fragment,{key:n?.name??"noSidebar"},t)}function de(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:l}=e;const{pathname:c}=(0,g.TH)(),[i,s]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{i&&s(!1),!i&&(0,f.n)()&&s(!0),l((e=>!e))}),[l,i]);return a.createElement("aside",{className:(0,o.Z)(r.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&s(!0)}},a.createElement(se,null,a.createElement("div",{className:(0,o.Z)(ie.sidebarViewport,i&&ie.sidebarViewportHidden)},a.createElement(le,{sidebar:t,path:c,onCollapse:d,isHidden:i}),i&&a.createElement(ce,{toggleSidebar:d}))))}const me={docMainContainer:"docMainContainer_gTbr",docMainContainerEnhanced:"docMainContainerEnhanced_Uz_u",docItemWrapperEnhanced:"docItemWrapperEnhanced_czyv"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const l=(0,d.V)();return a.createElement("main",{className:(0,o.Z)(me.docMainContainer,(t||!l)&&me.docMainContainerEnhanced)},a.createElement("div",{className:(0,o.Z)("container padding-top--md padding-bottom--lg",me.docItemWrapper,t&&me.docItemWrapperEnhanced)},n))}const be={docPage:"docPage__5DB",docsWrapper:"docsWrapper_BCFX"};function pe(e){let{children:t}=e;const n=(0,d.V)(),[o,l]=(0,a.useState)(!1);return a.createElement(m.Z,{wrapperClassName:be.docsWrapper},a.createElement(E,null),a.createElement("div",{className:be.docPage},n&&a.createElement(de,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:l}),a.createElement(ue,{hiddenSidebarContainer:o},t)))}var he=n(4972),Ee=n(197);function fe(e){const{versionMetadata:t}=e;return a.createElement(a.Fragment,null,a.createElement(Ee.Z,{version:t.version,tag:(0,c.os)(t.pluginId,t.version)}),a.createElement(l.d,null,t.noIndex&&a.createElement("meta",{name:"robots",content:"noindex, nofollow"})))}function ge(e){const{versionMetadata:t}=e,n=(0,i.hI)(e);if(!n)return a.createElement(he.default,null);const{docElement:c,sidebarName:m,sidebarItems:u}=n;return a.createElement(a.Fragment,null,a.createElement(fe,e),a.createElement(l.FG,{className:(0,o.Z)(r.k.wrapper.docsPages,r.k.page.docsDocPage,e.versionMetadata.className)},a.createElement(s.q,{version:t},a.createElement(d.b,{name:m,items:u},a.createElement(pe,null,c)))))}},4972:(e,t,n)=>{n.r(t),n.d(t,{default:()=>c});var a=n(7294),o=n(5999),l=n(833),r=n(8888);function c(){return a.createElement(a.Fragment,null,a.createElement(l.d,{title:(0,o.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),a.createElement(r.Z,null,a.createElement("main",{className:"container margin-vert--xl"},a.createElement("div",{className:"row"},a.createElement("div",{className:"col col--6 col--offset-3"},a.createElement("h1",{className:"hero__title"},a.createElement(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),a.createElement("p",null,a.createElement(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}},4477:(e,t,n)=>{n.d(t,{E:()=>c,q:()=>r});var a=n(7294),o=n(902);const l=a.createContext(null);function r(e){let{children:t,version:n}=e;return a.createElement(l.Provider,{value:n},t)}function c(){const e=(0,a.useContext)(l);if(null===e)throw new o.i6("DocsVersionProvider");return e}}}]); \ No newline at end of file diff --git a/assets/js/1c14429f.2c119681.js b/assets/js/1c14429f.2c119681.js new file mode 100644 index 000000000..dac36500a --- /dev/null +++ b/assets/js/1c14429f.2c119681.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2702],{5894:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>h});var i=t(5893),o=t(1151),s=t(3872),r=t(3183);const a={template:"post",draft:!1,hide_title:!0,title:"Getting Started",slug:"getting-started",date:new Date("2023-08-31T23:00:00.000Z"),image:"./assets/getting-started.png?202311181211",canonical:"",description:"A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!",category:"Tutorial",tags:["Edge computing","Guide","Getting Started"]},l=void 0,d={id:"Node Operators/getting-started-guide",title:"Getting Started",description:"A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!",source:"@site/guides/Node Operators/getting-started-guide.md",sourceDirName:"Node Operators",slug:"/Node Operators/getting-started",permalink:"/guides/Node Operators/getting-started",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/getting-started-guide.md",tags:[{label:"Edge computing",permalink:"/guides/tags/edge-computing"},{label:"Guide",permalink:"/guides/tags/guide"},{label:"Getting Started",permalink:"/guides/tags/getting-started"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{template:"post",draft:!1,hide_title:!0,title:"Getting Started",slug:"getting-started",date:"2023-08-31T23:00:00.000Z",image:"./assets/getting-started.png?202311181211",canonical:"",description:"A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!",category:"Tutorial",tags:["Edge computing","Guide","Getting Started"]},sidebar:"defaultSidebar",previous:{title:"About guides",permalink:"/guides/"},next:{title:"How to manage log files",permalink:"/guides/Node Operators/how-to-manage-log-files"}},c={image:t(3483).Z},h=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Need a quick Fleek Network TL;DR?",id:"need-a-quick-fleek-network-tldr",level:2},{value:"Why is Fleek Network needed?",id:"why-is-fleek-network-needed",level:2},{value:"How Does Fleek Network Work?",id:"how-does-fleek-network-work",level:2},{value:"Running a Node",id:"running-a-node",level:2},{value:"Clone the source code",id:"clone-the-source-code",level:3},{value:"Dependencies",id:"dependencies",level:3},{value:"Build",id:"build",level:3},{value:"Node Launch",id:"node-launch",level:3},{value:"Health check",id:"health-check",level:3},{value:"Next steps",id:"next-steps",level:2},{value:"Conclusion",id:"conclusion",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Getting started guide",src:t(7860).Z+"",width:"1450",height:"816"})}),"\n","\n","\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"For this guide, we\u2019ll have a simple look into how Fleek Network works in its current development phase and briefly share some of the core concepts like spinning up a node."}),"\n",(0,i.jsx)(n.p,{children:"For those seeking advanced knowledge:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Read our ",(0,i.jsx)(n.a,{href:"/docs/whitepaper",children:"whitepaper"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Check out ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"our open-source code"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["If you find any typos in our documentation, feel free to ",(0,i.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"provide us feedback"})," or contribute by opening a PR in our repository ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/fleek-network-docs/",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"pre-requisites",children:"Pre-requisites"}),"\n",(0,i.jsx)(n.p,{children:"To follow the guide, you will need the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Familiarity with the command-line interface"}),"\n",(0,i.jsx)(n.li,{children:"Git"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"need-a-quick-fleek-network-tldr",children:"Need a quick Fleek Network TL;DR?"}),"\n",(0,i.jsx)(n.p,{children:"Fleek Network is an open-source edge computing platform to accelerate the development and execution of the next generation of web services."}),"\n",(0,i.jsx)(n.p,{children:"The system is built on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators. It relies on blockchain technology at its core, allowing governance and token rewards as incentives for participation in serving the network."}),"\n",(0,i.jsx)(n.p,{children:"Made by an open community that's free to operate nodes or build services without the need for approvals, permissions, or intermediaries. Or simply, consume Fleek Network resources on demand, from anywhere, provided by services running on the edge."}),"\n",(0,i.jsx)(n.p,{children:"Applications, platforms and protocols build and utilize decentralized services on the Fleek Network to optimize performance and reduce dependency on typical centralized cloud providers and corporate infrastructure."}),"\n",(0,i.jsx)(n.p,{children:"Developers can build faster and launch better products by offloading parts of the development stack to the edge to focus on core features for the value proposition of the services being developed."}),"\n",(0,i.jsxs)(n.p,{children:["To get started, install a Network Node in a ",(0,i.jsx)(n.a,{href:"/docs/node/requirements",children:"supported"})," Linux server, such as Debian or Ubuntu (latest) by utilizing our simple ",(0,i.jsx)(n.a,{href:"/docs/node/install#assisted-installer",children:"assisted installer"})," to help onboard as quickly as possible."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"Our network is open to everyone, so you're more than welcome to join us anytime without any restrictions, permission or formalities. We'd be happy to have you as part of our community!"})}),"\n",(0,i.jsx)(n.p,{children:"Once connected to the server, open a terminal window and execute the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"curl https://get.fleek.network | bash\n"})}),"\n",(0,i.jsx)(n.p,{children:"Follow the install assistant recommendations to have the node ready without hassle and as quickly as possible."}),"\n",(0,i.jsx)(n.h2,{id:"why-is-fleek-network-needed",children:"Why is Fleek Network needed?"}),"\n",(0,i.jsx)(n.p,{children:"Web3 products typically rely on centralized cloud infrastructure, which is vulnerable to attacks as computation and data can be easily manipulated to suit business goals. However, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage. The Fleek Network offers a sustainable alternative to traditional centralized architectures, providing a secure, transparent, and accessible decentralized edge computing future for everyone."}),"\n",(0,i.jsx)(n.h2,{id:"how-does-fleek-network-work",children:"How Does Fleek Network Work?"}),"\n",(0,i.jsx)(n.p,{children:"When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated."}),"\n",(0,i.jsx)(n.p,{children:"Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed."}),"\n",(0,i.jsx)(n.p,{children:"The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the Epoch. This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly."}),"\n",(0,i.jsx)(n.h2,{id:"running-a-node",children:"Running a Node"}),"\n",(0,i.jsxs)(n.p,{children:["A Fleek Network node can be built and run on your machine. It\u2019s an ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"open-source project"})," and is open for contributions."]}),"\n",(0,i.jsx)(n.p,{children:"The project is written with Rust, a general-purpose programming language that you need to have installed in advance to be able to follow the current guide."}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["To set up Rust, packages and library dependencies can be tricky. The quickest is to visit the ",(0,i.jsx)(n.a,{href:"https://rustup.rs/",children:"rustup.rs"}),". Alternatively, if you haven't already, the build section has a ",(0,i.jsx)(n.a,{href:"/docs/node/install#manual-installation",children:"manual installation"})," document to help."]})}),"\n",(0,i.jsx)(n.h3,{id:"clone-the-source-code",children:"Clone the source code"}),"\n",(0,i.jsx)(n.p,{children:"We\u2019ll clone the repository locally, build it and interact with the node through the binary or the HTTP JSON-RPC API with a client like cURL, but you can use a GUI (Postman, Insomnia, amongst others) if you prefer."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The ~/fleek-network/lightning or $HOME/fleek-network/lightning directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation."})}),"\n",(0,i.jsxs)(n.p,{children:["Start by cloning the repository located at ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"https://github.com/fleek-network/lightning"})]}),"\n",(0,i.jsx)(r.ZP,{}),"\n",(0,i.jsx)(n.p,{children:"Once the git clone completes, you\u2019ll have the latest version at the time of cloning. You should use git to fetch or pull the latest versions consequently."}),"\n",(0,i.jsx)(n.h3,{id:"dependencies",children:"Dependencies"}),"\n",(0,i.jsx)(n.p,{children:"Install the required dependencies necessary for compiling general software and for our use-case Lightning CLI."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo apt-get install \\\n build-essential \\\n clang \\\n pkg-config \\\n libssl-dev \\\n gcc-multilib \\\n protobuf-compiler\n"})}),"\n",(0,i.jsx)(n.h3,{id:"build",children:"Build"}),"\n",(0,i.jsxs)(n.p,{children:["Start by changing the directory to the project directory where the source code is stored. If you have followed the recommended location that'll be ",(0,i.jsx)(n.code,{children:"~/fleek-network/lightning"}),", as follows:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cd ~/fleek-network/lightning\n"})}),"\n",(0,i.jsx)(n.p,{children:"Run the Rust package manager clean and update commands."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cargo clean\ncargo update\n"})}),"\n",(0,i.jsx)(n.p,{children:"Next, execute the build command to compile the Fleek Network Lightning CLI binary."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cargo +stable build --release\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable."})}),"\n",(0,i.jsxs)(n.p,{children:["Once the Rust compiler completes, the generated binary will be available in the source code project directory. If you stick with the default, that'll look like ",(0,i.jsx)(n.code,{children:"~/fleek-network/lightning/target/debug/lightning-node"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["To avoid having to specify the pathname every time, create a symbolic link to keep it short. Here we'll name the process as the global ",(0,i.jsx)(n.code,{children:"lgtn"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'sudo ln -s "~/fleek-network/lightning/target/debug/lightning-node" /usr/local/bin/lgtn\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Run the CLI with the flag ",(0,i.jsx)(n.code,{children:"version"})," to confirm it's available globally."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn --version\n"})}),"\n",(0,i.jsx)(n.p,{children:"The output should look like:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"Usage: lgtn [OPTIONS] \n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n dev-init-only Initialize the node without starting it\n dev-dump-graph Dump the infusion graph of the node instance\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n"})}),"\n",(0,i.jsx)(n.h3,{id:"node-launch",children:"Node Launch"}),"\n",(0,i.jsxs)(n.p,{children:["After ",(0,i.jsx)(n.a,{href:"#build",children:"building"}),", the node can be launched by running the subcommand ",(0,i.jsx)(n.code,{children:"run"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn run\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"It's highly recommend to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions."})}),"\n",(0,i.jsxs)(n.p,{children:["Learn how to create a new Systemd service in the ",(0,i.jsx)(n.a,{href:"/docs/node/install#manual-installation",children:"manual installation"})," document."]}),"\n",(0,i.jsx)(n.h3,{id:"health-check",children:"Health check"}),"\n",(0,i.jsx)(n.p,{children:"It's important for Node operators to regularly check on the health of their resources to make sure everything is running smoothly. By doing this, they can get helpful feedback and know for sure if their Node is up and running. Some experienced node operators even automate this process using cronjobs and get reports sent to them via email or other custom methods."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'curl -w "\\n" localhost:4230/health\n'})}),"\n",(0,i.jsx)(n.p,{children:"If everything goes well, the response should be:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"OK\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, use the JSON-RPC method ",(0,i.jsx)(n.code,{children:"flk_ping"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'curl -s \\\n -X POST \\\n -H "Content-Type: application/json" \\\n -d \'{\n "jsonrpc": "2.0",\n "method": "flk_ping",\n "params": [],\n "id": 1\n }\' \\\n localhost:4230/rpc/v0\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Which response should return the key ",(0,i.jsx)(n.code,{children:"result"})," with value ",(0,i.jsx)(n.code,{children:"pong"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'{\n "jsonrpc": "2.0",\n "result": "pong",\n "id": 1\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,i.jsx)(n.p,{children:"While you can run the Network Node as described here, it's required to set up the Network Node correctly and securely! It requires some degree of patience, knowledge and time to go through our guides, but we'll provide some guides and references to help you manage your network node server!"}),"\n",(0,i.jsxs)(n.p,{children:["To avoid having to go through all the steps manually, we recommend reading our ",(0,i.jsx)(n.a,{href:"/docs/node/install#assisted-installer",children:"assisted installer"})," document for quick onboarding."]}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"We introduced Fleek Network as an open-source edge computing platform to help us accelerate the development and execution of the next generation of web services."}),"\n",(0,i.jsx)(n.p,{children:"We have learned a bit about the importance of a decentralized edge computing network to reach and fulfill the future of computation and how the Fleek Network protocol works succinctly."}),"\n",(0,i.jsx)(n.p,{children:"Furthermore, we guide you through a step-by-step installation of the network node process, where we pull the source code, build the binary and launch the service."}),"\n",(0,i.jsx)(n.p,{children:"Finally, we do a quick health check to confirm the status of our node."}),"\n",(0,i.jsxs)(n.p,{children:["Discover more about the project by ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"watching/contributing on GitHub"}),", following us on ",(0,i.jsx)(n.a,{href:"https://twitter.com/fleek_net",children:"Twitter"}),", and joining ",(0,i.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"our community Discord"})," for any updates."]}),"\n",(0,i.jsx)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},3183:(e,n,t)=>{t.d(n,{ZP:()=>r});var i=t(5893),o=t(1151);function s(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"You have several ways of doing this:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Clone via HTTPS"}),"\n",(0,i.jsx)(n.li,{children:"Clone via SSH"}),"\n",(0,i.jsx)(n.li,{children:"Download via Github CLI"}),"\n",(0,i.jsxs)(n.li,{children:["Download the ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip",children:"zip package"})," from the repository"]}),"\n"]}),(0,i.jsxs)(n.p,{children:["We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,i.jsx)(n.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh",children:"here"}),"."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git \n"})}),(0,i.jsxs)(n.p,{children:["At time of writing, we are checking the branch name ",(0,i.jsx)(n.code,{children:"testnet-alpha-1"})," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"})})]})}function r(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(s,{...e})}):s(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var i=t(5893);const o=e=>{let{image:n,name:t,title:o,url:s,communityMember:r=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:s,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:s,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:o}),(0,i.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},3483:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/getting-started-e00548e77105d1efbb6c436314fca278.png"},7860:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/getting-started-e00548e77105d1efbb6c436314fca278.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>r});var i=t(7294);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1c14429f.6809339c.js b/assets/js/1c14429f.6809339c.js deleted file mode 100644 index 8711bb5fa..000000000 --- a/assets/js/1c14429f.6809339c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2702],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var o=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),d=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=d(e.components);return o.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=d(n),h=a,m=u["".concat(s,".").concat(h)]||u[h]||p[h]||r;return n?o.createElement(m,i(i({ref:t},c),{},{components:n})):o.createElement(m,i({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var d=2;d{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var o=n(7462),a=(n(7294),n(3905)),r=n(3872),i=n(2915);const l={template:"post",draft:!1,hide_title:!0,title:"Getting Started",slug:"getting-started",date:new Date("2023-08-31T23:00:00.000Z"),image:"./assets/getting-started.png?202311181211",canonical:"",description:"A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!",category:"Tutorial",tags:["Edge computing","Guide","Getting Started"]},s=void 0,d={unversionedId:"Node Operators/getting-started-guide",id:"Node Operators/getting-started-guide",title:"Getting Started",description:"A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!",source:"@site/guides/Node Operators/getting-started-guide.md",sourceDirName:"Node Operators",slug:"/Node Operators/getting-started",permalink:"/guides/Node Operators/getting-started",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/getting-started-guide.md",tags:[{label:"Edge computing",permalink:"/guides/tags/edge-computing"},{label:"Guide",permalink:"/guides/tags/guide"},{label:"Getting Started",permalink:"/guides/tags/getting-started"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{template:"post",draft:!1,hide_title:!0,title:"Getting Started",slug:"getting-started",date:"2023-08-31T23:00:00.000Z",image:"./assets/getting-started.png?202311181211",canonical:"",description:"A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!",category:"Tutorial",tags:["Edge computing","Guide","Getting Started"]},sidebar:"defaultSidebar",previous:{title:"About guides",permalink:"/guides/"},next:{title:"How to manage log files",permalink:"/guides/Node Operators/how-to-manage-log-files"}},c={image:n(7860).Z},u=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Need a quick Fleek Network TL;DR?",id:"need-a-quick-fleek-network-tldr",level:2},{value:"Why is Fleek Network needed?",id:"why-is-fleek-network-needed",level:2},{value:"How Does Fleek Network Work?",id:"how-does-fleek-network-work",level:2},{value:"Running a Node",id:"running-a-node",level:2},{value:"Clone the source code",id:"clone-the-source-code",level:3},{value:"Dependencies",id:"dependencies",level:3},{value:"Build",id:"build",level:3},{value:"Node Launch",id:"node-launch",level:3},{value:"Health check",id:"health-check",level:3},{value:"Next steps",id:"next-steps",level:2},{value:"Conclusion",id:"conclusion",level:2}],p={toc:u},h="wrapper";function m(e){let{components:t,...l}=e;return(0,a.kt)(h,(0,o.Z)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Getting started guide",src:n(7860).Z,width:"1450",height:"816"})),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"For this guide, we\u2019ll have a simple look into how Fleek Network works in its current development phase and briefly share some of the core concepts like spinning up a node."),(0,a.kt)("p",null,"For those seeking advanced knowledge:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Read our ",(0,a.kt)("a",{parentName:"li",href:"/docs/whitepaper"},"whitepaper"),"."),(0,a.kt)("li",{parentName:"ul"},"Check out ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning"},"our open-source code"),".")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"If you find any typos in our documentation, feel free to ",(0,a.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"provide us feedback")," or contribute by opening a PR in our repository ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/fleek-network-docs/"},"here"),".")),(0,a.kt)("h2",{id:"pre-requisites"},"Pre-requisites"),(0,a.kt)("p",null,"To follow the guide, you will need the following:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Familiarity with the command-line interface"),(0,a.kt)("li",{parentName:"ul"},"Git")),(0,a.kt)("h2",{id:"need-a-quick-fleek-network-tldr"},"Need a quick Fleek Network TL;DR?"),(0,a.kt)("p",null,"Fleek Network is an open-source edge computing platform to accelerate the development and execution of the next generation of web services."),(0,a.kt)("p",null,"The system is built on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators. It relies on blockchain technology at its core, allowing governance and token rewards as incentives for participation in serving the network."),(0,a.kt)("p",null,"Made by an open community that's free to operate nodes or build services without the need for approvals, permissions, or intermediaries. Or simply, consume Fleek Network resources on demand, from anywhere, provided by services running on the edge."),(0,a.kt)("p",null,"Applications, platforms and protocols build and utilize decentralized services on the Fleek Network to optimize performance and reduce dependency on typical centralized cloud providers and corporate infrastructure."),(0,a.kt)("p",null,"Developers can build faster and launch better products by offloading parts of the development stack to the edge to focus on core features for the value proposition of the services being developed."),(0,a.kt)("p",null,"To get started, install a Network Node in a ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"supported")," Linux server, such as Debian or Ubuntu (latest) by utilizing our simple ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/install#assisted-installer"},"assisted installer")," to help onboard as quickly as possible."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Our network is open to everyone, so you're more than welcome to join us anytime without any restrictions, permission or formalities. We'd be happy to have you as part of our community!")),(0,a.kt)("p",null,"Once connected to the server, open a terminal window and execute the following command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://get.fleek.network | bash\n")),(0,a.kt)("p",null,"Follow the install assistant recommendations to have the node ready without hassle and as quickly as possible."),(0,a.kt)("h2",{id:"why-is-fleek-network-needed"},"Why is Fleek Network needed?"),(0,a.kt)("p",null,"Web3 products typically rely on centralized cloud infrastructure, which is vulnerable to attacks as computation and data can be easily manipulated to suit business goals. However, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage. The Fleek Network offers a sustainable alternative to traditional centralized architectures, providing a secure, transparent, and accessible decentralized edge computing future for everyone."),(0,a.kt)("h2",{id:"how-does-fleek-network-work"},"How Does Fleek Network Work?"),(0,a.kt)("p",null,"When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated."),(0,a.kt)("p",null,"Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed."),(0,a.kt)("p",null,"The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the Epoch. This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly."),(0,a.kt)("h2",{id:"running-a-node"},"Running a Node"),(0,a.kt)("p",null,"A Fleek Network node can be built and run on your machine. It\u2019s an ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"open-source project")," and is open for contributions."),(0,a.kt)("p",null,"The project is written with Rust, a general-purpose programming language that you need to have installed in advance to be able to follow the current guide."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"To set up Rust, packages and library dependencies can be tricky. The quickest is to visit the ",(0,a.kt)("a",{parentName:"p",href:"https://rustup.rs/"},"rustup.rs"),". Alternatively, if you haven't already, the build section has a ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/install#manual-installation"},"manual installation")," document to help.")),(0,a.kt)("h3",{id:"clone-the-source-code"},"Clone the source code"),(0,a.kt)("p",null,"We\u2019ll clone the repository locally, build it and interact with the node through the binary or the HTTP JSON-RPC API with a client like cURL, but you can use a GUI (Postman, Insomnia, amongst others) if you prefer."),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"The ~/fleek-network/lightning or $HOME/fleek-network/lightning directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation.")),(0,a.kt)("p",null,"Start by cloning the repository located at ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"https://github.com/fleek-network/lightning")),(0,a.kt)(i.ZP,{mdxType:"GitCloneOptions"}),(0,a.kt)("p",null,"Once the git clone completes, you\u2019ll have the latest version at the time of cloning. You should use git to fetch or pull the latest versions consequently."),(0,a.kt)("h3",{id:"dependencies"},"Dependencies"),(0,a.kt)("p",null,"Install the required dependencies necessary for compiling general software and for our use-case Lightning CLI."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install \\\n build-essential \\\n clang \\\n pkg-config \\\n libssl-dev \\\n gcc-multilib \\\n protobuf-compiler\n")),(0,a.kt)("h3",{id:"build"},"Build"),(0,a.kt)("p",null,"Start by changing the directory to the project directory where the source code is stored. If you have followed the recommended location that'll be ",(0,a.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning"),", as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~/fleek-network/lightning\n")),(0,a.kt)("p",null,"Run the Rust package manager clean and update commands."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"cargo clean\ncargo update\n")),(0,a.kt)("p",null,"Next, execute the build command to compile the Fleek Network Lightning CLI binary."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"cargo +stable build --release\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable.")),(0,a.kt)("p",null,"Once the Rust compiler completes, the generated binary will be available in the source code project directory. If you stick with the default, that'll look like ",(0,a.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning/target/debug/lightning-node"),"."),(0,a.kt)("p",null,"To avoid having to specify the pathname every time, create a symbolic link to keep it short. Here we'll name the process as the global ",(0,a.kt)("inlineCode",{parentName:"p"},"lgtn"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'sudo ln -s "~/fleek-network/lightning/target/debug/lightning-node" /usr/local/bin/lgtn\n')),(0,a.kt)("p",null,"Run the CLI with the flag ",(0,a.kt)("inlineCode",{parentName:"p"},"version")," to confirm it's available globally."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn --version\n")),(0,a.kt)("p",null,"The output should look like:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"Usage: lgtn [OPTIONS] \n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n dev-init-only Initialize the node without starting it\n dev-dump-graph Dump the infusion graph of the node instance\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n")),(0,a.kt)("h3",{id:"node-launch"},"Node Launch"),(0,a.kt)("p",null,"After ",(0,a.kt)("a",{parentName:"p",href:"#build"},"building"),", the node can be launched by running the subcommand ",(0,a.kt)("inlineCode",{parentName:"p"},"run"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn run\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"It's highly recommend to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions.")),(0,a.kt)("p",null,"Learn how to create a new Systemd service in the ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/install#manual-installation"},"manual installation")," document."),(0,a.kt)("h3",{id:"health-check"},"Health check"),(0,a.kt)("p",null,"It's important for Node operators to regularly check on the health of their resources to make sure everything is running smoothly. By doing this, they can get helpful feedback and know for sure if their Node is up and running. Some experienced node operators even automate this process using cronjobs and get reports sent to them via email or other custom methods."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'curl -w "\\n" localhost:4230/health\n')),(0,a.kt)("p",null,"If everything goes well, the response should be:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"OK\n")),(0,a.kt)("p",null,"Alternatively, use the JSON-RPC method ",(0,a.kt)("inlineCode",{parentName:"p"},"flk_ping"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'curl -s \\\n -X POST \\\n -H "Content-Type: application/json" \\\n -d \'{\n "jsonrpc": "2.0",\n "method": "flk_ping",\n "params": [],\n "id": 1\n }\' \\\n localhost:4230/rpc/v0\n')),(0,a.kt)("p",null,"Which response should return the key ",(0,a.kt)("inlineCode",{parentName:"p"},"result")," with value ",(0,a.kt)("inlineCode",{parentName:"p"},"pong"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'{\n "jsonrpc": "2.0",\n "result": "pong",\n "id": 1\n}\n')),(0,a.kt)("h2",{id:"next-steps"},"Next steps"),(0,a.kt)("p",null,"While you can run the Network Node as described here, it's required to set up the Network Node correctly and securely! It requires some degree of patience, knowledge and time to go through our guides, but we'll provide some guides and references to help you manage your network node server!"),(0,a.kt)("p",null,"To avoid having to go through all the steps manually, we recommend reading our ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/install#assisted-installer"},"assisted installer")," document for quick onboarding."),(0,a.kt)("h2",{id:"conclusion"},"Conclusion"),(0,a.kt)("p",null,"We introduced Fleek Network as an open-source edge computing platform to help us accelerate the development and execution of the next generation of web services."),(0,a.kt)("p",null,"We have learned a bit about the importance of a decentralized edge computing network to reach and fulfill the future of computation and how the Fleek Network protocol works succinctly."),(0,a.kt)("p",null,"Furthermore, we guide you through a step-by-step installation of the network node process, where we pull the source code, build the binary and launch the service."),(0,a.kt)("p",null,"Finally, we do a quick health check to confirm the status of our node."),(0,a.kt)("p",null,"Discover more about the project by ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"watching/contributing on GitHub"),", following us on ",(0,a.kt)("a",{parentName:"p",href:"https://twitter.com/fleek_net"},"Twitter"),", and joining ",(0,a.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"our community Discord")," for any updates."),(0,a.kt)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}m.isMDXComponent=!0},2915:(e,t,n)=>{n.d(t,{ZP:()=>l});var o=n(7462),a=(n(7294),n(3905));const r={toc:[]},i="wrapper";function l(e){let{components:t,...n}=e;return(0,a.kt)(i,(0,o.Z)({},r,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"You have several ways of doing this:"),(0,a.kt)("ul",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ul"},"Clone via HTTPS"),(0,a.kt)("li",{parentName:"ul"},"Clone via SSH"),(0,a.kt)("li",{parentName:"ul"},"Download via Github CLI"),(0,a.kt)("li",{parentName:"ul"},"Download the ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip"},"zip package")," from the repository")),(0,a.kt)("p",{parentName:"admonition"},"We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,a.kt)("a",{parentName:"p",href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh"},"here"),"."),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git \n")),(0,a.kt)("p",{parentName:"admonition"},"At time of writing, we are checking the branch name ",(0,a.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1")," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"))))}l.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>a});var o=n(7294);const a=e=>{let{image:t,name:n,title:a,url:r,communityMember:i=!1}=e;return o.createElement("section",{className:"author_card"},o.createElement("div",null,o.createElement("span",{className:"avatar"},o.createElement("a",{href:r,target:"_blank",alt:n},o.createElement("img",{src:t,alt:n}))),o.createElement("div",null,o.createElement("span",{className:"name"},o.createElement("a",{href:r,target:"_blank",alt:n},n)),o.createElement("span",{className:"title"},a),o.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",o.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},7860:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/getting-started-e00548e77105d1efbb6c436314fca278.png"}}]); \ No newline at end of file diff --git a/assets/js/1d8a5d15.2b13cbd9.js b/assets/js/1d8a5d15.2b13cbd9.js deleted file mode 100644 index f71b3de88..000000000 --- a/assets/js/1d8a5d15.2b13cbd9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9854],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>c});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},h=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),d=p(n),m=r,c=d["".concat(l,".").concat(m)]||d[m]||u[m]||a;return n?o.createElement(c,i(i({ref:t},h),{},{components:n})):o.createElement(c,i({ref:t},h))}));function c(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:r,i[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>g,frontMatter:()=>l,metadata:()=>h,toc:()=>u});var o=n(7462),r=(n(7294),n(3905)),a=n(3872),i=n(6733),s=n(3242);const l={template:"post",draft:!1,hide_title:!0,title:"Transfering setup ownership",slug:"transfering-setup-ownership",image:"./assets/transfering-setup-ownership.png?202311181223",date:new Date("2023-09-12T23:00:00.000Z"),description:"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup",category:"Tutorial",tags:["transfer","ownership","guide","setup","configuration"]},p=void 0,h={unversionedId:"Node Operators/transfering-setup-ownership",id:"Node Operators/transfering-setup-ownership",title:"Transfering setup ownership",description:"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup",source:"@site/guides/Node Operators/transfering-setup-ownership.md",sourceDirName:"Node Operators",slug:"/Node Operators/transfering-setup-ownership",permalink:"/guides/Node Operators/transfering-setup-ownership",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/transfering-setup-ownership.md",tags:[{label:"transfer",permalink:"/guides/tags/transfer"},{label:"ownership",permalink:"/guides/tags/ownership"},{label:"guide",permalink:"/guides/tags/guide"},{label:"setup",permalink:"/guides/tags/setup"},{label:"configuration",permalink:"/guides/tags/configuration"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{template:"post",draft:!1,hide_title:!0,title:"Transfering setup ownership",slug:"transfering-setup-ownership",image:"./assets/transfering-setup-ownership.png?202311181223",date:"2023-09-12T23:00:00.000Z",description:"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup",category:"Tutorial",tags:["transfer","ownership","guide","setup","configuration"]},sidebar:"defaultSidebar",previous:{title:"Running a node in Docker",permalink:"/guides/Node Operators/running-a-node-in-docker"},next:{title:"Updating Lightning",permalink:"/guides/Node Operators/updating-lightning"}},d={image:n(1e3).Z},u=[{value:"TL;DR",id:"tldr",level:2},{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Ownership of Lightning CLI files",id:"ownership-of-lightning-cli-files",level:2},{value:"Systemd Service",id:"systemd-service",level:2},{value:"Stop the service",id:"stop-the-service",level:2},{value:"Clear the .lightning data",id:"clear-the-lightning-data",level:2},{value:"Create a user",id:"create-a-user",level:2},{value:"Move lightning system and source code directory to user's home",id:"move-lightning-system-and-source-code-directory-to-users-home",level:2},{value:"1) Move the /root/.lightning directory from one user to the other",id:"1-move-the-rootlightning-directory-from-one-user-to-the-other",level:3},{value:"2) Move the /root/fleek-network directory from one user to the other",id:"2-move-the-rootfleek-network-directory-from-one-user-to-the-other",level:3},{value:"3) Confirm move by finding both directories",id:"3-confirm-move-by-finding-both-directories",level:3},{value:"Change ownership of files",id:"change-ownership-of-files",level:2},{value:"The lgtn symbolic link (symlink)",id:"the-lgtn-symbolic-link-symlink",level:2},{value:"Update the Systemd service unit",id:"update-the-systemd-service-unit",level:2},{value:"Update the config.toml with user-preferred file locations",id:"update-the-configtoml-with-user-preferred-file-locations",level:2},{value:"Start the service",id:"start-the-service",level:2},{value:"Conclusion",id:"conclusion",level:2}],m={toc:u},c="wrapper";function g(e){let{components:t,...l}=e;return(0,r.kt)(c,(0,o.Z)({},m,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Transfering setup ownership",src:n(2867).Z,width:"1450",height:"816"})),(0,r.kt)("h2",{id:"tldr"},"TL;DR"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The step-by-step instructions provided in the guide should be simple to follow, but the process is also available as an automated script from our familiar ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/get.fleek.network"},"get.fleek.network")," tool."),(0,r.kt)("p",{parentName:"admonition"},"To use the automated script execute the following command in your server terminal and follow the instructions:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl -sS https://get.fleek.network/transfer_system_user_setup_ownership | bash\n")),(0,r.kt)("p",{parentName:"admonition"},"We try to make the auomated scripts as useful as possible, but it's impossible to fit every single use-case. So, if you find any isses or have feedback to help us improve ",(0,r.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"message us through our Discord"),".")),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"Our Lightning CLI and Node process is run by a user, that has some sort of permissions\u2013some users run it as a super user (root) which is questionable as root privileges are not a necessary good. We'll look into how to create a user to manage and control the Fleek Network Lightning CLI and Systemd unit service. Also, presents the concept of file permissions and ownership which is crucial in preventing private or sensitive data from being exposed to dodgy actors."),(0,r.kt)("p",null,"Let's discuss the topic and open up a few ideas to help us improve the security of our server."),(0,r.kt)("h2",{id:"pre-requisites"},"Pre-requisites"),(0,r.kt)("p",null,"To follow the guide, you will need the following:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Familiarity with the command-line interface"),(0,r.kt)("li",{parentName:"ul"},"Have installed and set up the Lightning CLI and service")),(0,r.kt)("h2",{id:"ownership-of-lightning-cli-files"},"Ownership of Lightning CLI files"),(0,r.kt)("p",null,"The user who installs the Lightning CLI and sets the Service takes an important role that determines the location of the configuration files, the setup, and how the Systemd service is managed or controlled."),(0,r.kt)("p",null,"Our ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install"},"install")," document recommends creating a user and switching to the user to set up the service. You shouldn't want installed applications to run with elevated privileges. Applications are meant to be run with non-administrative privileges. If an application requires higher privileges, the administrator, such as a ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Sudo"},"sudoer")," should be able to elevate it. An application that has full access and control of a system can modify it in harmful ways, e.g. compromise the private keys."),(0,r.kt)("p",null,"For our guide, we'll illustrate the process of migration from a super user (root) to another user (sudo). The knowledge should be easily appliable for any other user-to-user migration. We stick with root user for simplicity and because that's the most common use case."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"A reference document about ",(0,r.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/file-permissions-and-ownership"},"File permissions and ownership")," is available that explains how it works practically, by showcasing how the process can be started, how the node process locates the Keystore, etc.")),(0,r.kt)("h2",{id:"systemd-service"},"Systemd Service"),(0,r.kt)("p",null,"In systemd, a unit refers to any resource that the system knows how to operate on and manage. This is the primary object that the systemd tools know how to deal with. These resources are defined using configuration files called unit files."),(0,r.kt)("p",null,"The recommended installation process features a ",(0,r.kt)("a",{parentName:"p",href:"https://www.freedesktop.org/software/systemd/man/systemd.service.html"},"systemd.service")," which is a resource that the system knows how to operate and manage by an administrator user."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"When using a Systemd service to run a process, it operates comparably to running it directly. The key difference is that Systemd keeps track of all the processes and threads that are spawned. This means that when a service is stopped using systemctl, such as the Fleek Network Lightning Node service, all the child processes that were started by the service are also terminated. Additionally, by utilizing Systemd, a user can run the process in the background and configure it to start automatically on system startup.")),(0,r.kt)("p",null,"If you have followed the installation recommendations, find the systemd service unit in the location ",(0,r.kt)("inlineCode",{parentName:"p"},"/etc/systemd/system/lightning.service")," (we are using Ubuntu Linux as an example to keep it short)."),(0,r.kt)("p",null,"Make sure that you have set up a ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#systemd-service-setup"},"Systemd unit service"),", as recommended during the installation as this guide assumes you have one setup."),(0,r.kt)("h2",{id:"stop-the-service"},"Stop the service"),(0,r.kt)("p",null,"Before we proceed with any changes required for the migration, you'll have to stop the ",(0,r.kt)("inlineCode",{parentName:"p"},"lightning.service"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl stop lightning\n")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"For this guide, we are assuming that you are migrating ownership from ",(0,r.kt)("strong",{parentName:"p"},"root")," to a ",(0,r.kt)("strong",{parentName:"p"},"sudoer")," user. If not, you might be required to elevate privileges as ",(0,r.kt)("strong",{parentName:"p"},"sudo**")," where required. For example, ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo systemctl stop lightning"),".")),(0,r.kt)("h2",{id:"clear-the-lightning-data"},"Clear the .lightning data"),(0,r.kt)("p",null,"Run the following command to clear the ",(0,r.kt)("inlineCode",{parentName:"p"},"/root/.lightning/data"),", as it can be quite large, and we don't need to move it."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo rm -rf /root/.lightning/data\n")),(0,r.kt)("h2",{id:"create-a-user"},"Create a user"),(0,r.kt)(i.ZP,{mdxType:"CreateAUser"}),(0,r.kt)("h2",{id:"move-lightning-system-and-source-code-directory-to-users-home"},"Move lightning system and source code directory to user's home"),(0,r.kt)("p",null,"A user should've been created, added the user to the sudo group, switched to the user, and changed the directory to the user's home."),(0,r.kt)("p",null,"Run the command ",(0,r.kt)("inlineCode",{parentName:"p"},"pwd"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"pwd\n")),(0,r.kt)("p",null,"The output would look like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"/home/\n")),(0,r.kt)("p",null,"Given the username ",(0,r.kt)("strong",{parentName:"p"},"lgtn"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"/home/lgtn\n")),(0,r.kt)("p",null,"You'll then move two directories:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"/root/.lightning")),(0,r.kt)("li",{parentName:"ul"},"The source code under the parent ",(0,r.kt)("inlineCode",{parentName:"li"},"/root/fleek-network"))),(0,r.kt)("h3",{id:"1-move-the-rootlightning-directory-from-one-user-to-the-other"},"1) Move the ",(0,r.kt)("inlineCode",{parentName:"h3"},"/root/.lightning")," directory from one user to the other"),(0,r.kt)("p",null,"For our demo, we have assumed ",(0,r.kt)("strong",{parentName:"p"},"root")," user to ",(0,r.kt)("strong",{parentName:"p"},"sudoer")," user named ",(0,r.kt)("strong",{parentName:"p"},"lgtn"),", thus that'll look like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo mv /root/.lightning /home/lgtn/\n")),(0,r.kt)("h3",{id:"2-move-the-rootfleek-network-directory-from-one-user-to-the-other"},"2) Move the ",(0,r.kt)("inlineCode",{parentName:"h3"},"/root/fleek-network")," directory from one user to the other"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo mv /root/fleek-network /home/lgtn/\n")),(0,r.kt)("h3",{id:"3-confirm-move-by-finding-both-directories"},"3) Confirm move by finding both directories"),(0,r.kt)("p",null,"In the user $HOME directory, you should be able to list the content of the directory and find the ",(0,r.kt)("inlineCode",{parentName:"p"},".lightning")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"fleek-network")," directory."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"ls -la\n")),(0,r.kt)("p",null,"The output should be similar to the following."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"drwxr-x--- 6 lgtn lgtn 4096 Sep 12 13:51 .\ndrwxr-xr-x 3 root root 4096 Sep 11 12:28 ..\ndrwxrwxr-x 5 root root 4096 Sep 11 15:25 .lightning\ndrwxrwxr-x 3 root root 4096 Sep 11 12:28 fleek-network\n")),(0,r.kt)("h2",{id:"change-ownership-of-files"},"Change ownership of files"),(0,r.kt)("p",null,"Once the directories and files are moved, they should have the wrong ownership, which should be set to ",(0,r.kt)("strong",{parentName:"p"},"root:root"),". We'll now have to change the ownership of the directories and files recursively."),(0,r.kt)("p",null,"Change the ownership of ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning")," to the user ",(0,r.kt)("strong",{parentName:"p"},"lgtn")," as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo chown -R lgtn:lgtn .lightning\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Make sure that you use the ",(0,r.kt)("inlineCode",{parentName:"p"},"-R")," flag to have the ownership changes applied to the parent, the child directories and all the files.")),(0,r.kt)("p",null,"Change the ownership of ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/lgtn/fleek-network")," to the user ",(0,r.kt)("strong",{parentName:"p"},"lgtn")," as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo chown -R lgtn:lgtn fleek-network\n")),(0,r.kt)("p",null,"Once completed, if you list the content of the directory the ownership should have changed from ",(0,r.kt)("inlineCode",{parentName:"p"},"root:root")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"lgtn:lgtn"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"ls -la\n")),(0,r.kt)("p",null,"The output should be similar to the following."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"drwxr-x--- 6 lgtn lgtn 4096 Sep 12 13:51 .\ndrwxr-xr-x 3 root root 4096 Sep 11 12:28 ..\ndrwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning\ndrwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Remember that we are using ",(0,r.kt)("strong",{parentName:"p"},"lgtn")," for our demo. If you have opted for a different username, make sure you use the correct username. To find the username you are logged in with run the command:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"whoami\n")),(0,r.kt)("p",{parentName:"admonition"},"For our demo, we'll assume that you understand that ",(0,r.kt)("strong",{parentName:"p"},"lgtn")," is the user we opted in for our demo.")),(0,r.kt)("h2",{id:"the-lgtn-symbolic-link-symlink"},"The lgtn symbolic link (symlink)"),(0,r.kt)("p",null,"We have the symbolic link that links the binary built from the source code, to the alias ",(0,r.kt)("strong",{parentName:"p"},"lgtn")," that's set under the ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/local/bin/lgtn")," pathname."),(0,r.kt)("p",null,"For example, you can find where that is linked to by running:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"ls -la $(which lgtn)\n")),(0,r.kt)("p",null,"On the output below, we can see that the ",(0,r.kt)("inlineCode",{parentName:"p"},"/usr/local/bin/lgtn")," points to ",(0,r.kt)("inlineCode",{parentName:"p"},"/root/fleek-network/lightning/target/release/lightning-node"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"lrwxrwxrwx 1 root root 64 Sep 11 15:48 /usr/local/bin/lgtn -> /root/fleek-network/lightning/target/release/lightning-node\n")),(0,r.kt)("p",null,"The target base path is ",(0,r.kt)("inlineCode",{parentName:"p"},"/root"),", and we know that we've moved the source code directory to the user home ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/lgtn"),". For this reason, we need to create a new symlink with the updated location of the binary file."),(0,r.kt)("p",null,"Unlink the symlink:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo unlink /usr/local/bin/lgtn\n")),(0,r.kt)("p",null,"Create the symlink:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'sudo ln -s "/home/lgtn/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn\n')),(0,r.kt)("p",null,"If successful, you should be able to execute the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn help\n")),(0,r.kt)("p",null,"The output should look similar to:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"Usage: lgtn [OPTIONS] \n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n")),(0,r.kt)("h2",{id:"update-the-systemd-service-unit"},"Update the Systemd service unit"),(0,r.kt)("p",null,"Open the file, its settings should be similar to the following:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home//.lightning/config.toml run\nExecStop=killall -9 lgtn\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n")),(0,r.kt)("p",null,"Since we opted in for the username ",(0,r.kt)("strong",{parentName:"p"},"lgtn")," for our demo, replaced ",(0,r.kt)("inlineCode",{parentName:"p"},"")," with ",(0,r.kt)("inlineCode",{parentName:"p"},"lgtn"),", and it would look like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml run\nExecStop=killall -9 lgtn\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Notice the ",(0,r.kt)("inlineCode",{parentName:"p"},"ExecStart=")," which includes the flag ",(0,r.kt)("inlineCode",{parentName:"p"},"-c")," where the location of the user files is declared. Learn how to ",(0,r.kt)("a",{parentName:"p",href:"#update-the-configtoml-with-user-preferred-file-locations"},"update the config.toml")," to include the user-preferred file paths, e.g. declare the keystore pathname.")),(0,r.kt)("p",null,"Complete the step by reloading the daemon, to apply the newly created changes. You can do this by executing:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,r.kt)("h2",{id:"update-the-configtoml-with-user-preferred-file-locations"},"Update the config.toml with user-preferred file locations"),(0,r.kt)("p",null,"Open the ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/config.toml")," file in your favorite text editor."),(0,r.kt)("p",null,"Replace every instance of ",(0,r.kt)("inlineCode",{parentName:"p"},"~")," (tilde) with the user's home path. We do this to ensure that every time we control the service via systemctl, the configuration file that tells which keystore to use is declared upfront regardless of running it as user or delegating to root with ",(0,r.kt)("strong",{parentName:"p"},"sudo"),". Learn more about ",(0,r.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/file-permissions-and-ownership"},"file permissions and ownership")," by reading the reference document."),(0,r.kt)(s.ZP,{mdxType:"FindAndReplaceConfigWithUserPaths"}),(0,r.kt)("h2",{id:"start-the-service"},"Start the service"),(0,r.kt)("p",null,"At this stage, you should have migrated the essential files to the user home."),(0,r.kt)("p",null,"Ideally, you would now manage the service as the ",(0,r.kt)("inlineCode",{parentName:"p"},"user")," (as described in the ",(0,r.kt)("a",{parentName:"p",href:"/references/Systemd/user-service/"},"user service reference"),"). To keep our guide wider to all users, we'll prefix the commands with ",(0,r.kt)("strong",{parentName:"p"},"sudo"),", which elevates the permissions to ",(0,r.kt)("strong",{parentName:"p"},"root"),". But since we have provided the configuration file the ",(0,r.kt)("inlineCode",{parentName:"p"},"-c")," in our ",(0,r.kt)("a",{parentName:"p",href:"#systemd-service"},"systemd service"),", we'll have the user-preferred configuration options ruling. "),(0,r.kt)("p",null,"Start the service by running the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning.service\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#analyzing-log-messages"},"Log Messages"),".")),(0,r.kt)("p",null,"To learn more, visit the section ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#use-systemctl-to-manage-systemd-service"},"Use Systemctl to manage the Lightning Service")),(0,r.kt)("h2",{id:"conclusion"},"Conclusion"),(0,r.kt)("p",null,"We started by giving a brief introduction to ownership of the Lightning CLI files."),(0,r.kt)("p",null,"Jumped through topics of Systemd service that helps the user manage the service in the Linux environment, which helps keep track of all the processes and threads that are spawned."),(0,r.kt)("p",null,"We've gone through the step-by-step process to migrate the Fleek Network CLI and Systemd service setup from one user to the other. To keep it short, we decided to go with the use-case of where the migration happens between a ",(0,r.kt)("strong",{parentName:"p"},"root")," user and a ",(0,r.kt)("strong",{parentName:"p"},"sudoer"),"."),(0,r.kt)("p",null,"Discover more about the project by ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"watching/contributing on GitHub"),", following us on ",(0,r.kt)("a",{parentName:"p",href:"https://twitter.com/fleek_net"},"Twitter"),", and joining ",(0,r.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"our community Discord")," for any updates."),(0,r.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}g.isMDXComponent=!0},6733:(e,t,n)=>{n.d(t,{ZP:()=>s});var o=n(7462),r=(n(7294),n(3905));const a={toc:[]},i="wrapper";function s(e){let{components:t,...n}=e;return(0,r.kt)(i,(0,o.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"We recommend creating a ",(0,r.kt)("inlineCode",{parentName:"p"},"non-root")," user with administrative privileges. It'll allow us to install any system requirements."),(0,r.kt)("p",null,"You can create a new user and add to the ",(0,r.kt)("strong",{parentName:"p"},"sudo")," group by running:"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For our example, we'll be using the name ",(0,r.kt)("inlineCode",{parentName:"p"},"lgtn")," but you can pick whichever you'd like. If you already have a ",(0,r.kt)("strong",{parentName:"p"},"sudoer")," account, you can skip this step.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo adduser lgtn\n")),(0,r.kt)("p",null,"After completing the ",(0,r.kt)("inlineCode",{parentName:"p"},"adduser")," steps, execute the ",(0,r.kt)("inlineCode",{parentName:"p"},"usermod")," to add the ",(0,r.kt)("inlineCode",{parentName:"p"},"user")," to the ",(0,r.kt)("strong",{parentName:"p"},"sudo")," group, as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo usermod -aG sudo lgtn\n")),(0,r.kt)("p",null,"Switch to the new ",(0,r.kt)("strong",{parentName:"p"},"user")," by using the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"su lgtn\n")),(0,r.kt)("p",null,"Change the directory to the new user's home, as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"cd /home/lgtn\n")))}s.isMDXComponent=!0},3242:(e,t,n)=>{n.d(t,{ZP:()=>s});var o=n(7462),r=(n(7294),n(3905));const a={toc:[]},i="wrapper";function s(e){let{components:t,...n}=e;return(0,r.kt)(i,(0,o.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"In the ",(0,r.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml")," you'll find some and more of the following:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,r.kt)("strong",{parentName:"p"},"configuration.toml"),". We keep it short to make it easier to follow, do not copy and paste.")),(0,r.kt)("p",null,"Find and replace all instances of ~ in the config file ",(0,r.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml"),". "),(0,r.kt)("p",null,"Here's an example of how to do it using ",(0,r.kt)("strong",{parentName:"p"},"sed"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n')),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Replace the ",(0,r.kt)("inlineCode",{parentName:"p"},"")," with your username. For example, if you have followed the recommendation to ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user"},"create a user")," it would look like ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/config.toml")," for the username ",(0,r.kt)("strong",{parentName:"p"},"lgtn"),".")),(0,r.kt)("p",null,"For example, if your username is ",(0,r.kt)("inlineCode",{parentName:"p"},"lgtn")," that'd look like this:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n')),(0,r.kt)("p",null,"Once modified, you can run a ",(0,r.kt)("inlineCode",{parentName:"p"},"cat")," to see the content of the files to confirm it has been updated."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"cat /home/lgtn/.lightning/config.toml\n")),(0,r.kt)("p",null,"For our example where we opted in for the username ",(0,r.kt)("inlineCode",{parentName:"p"},"lgtn")," that would look like:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,r.kt)("admonition",{title:"Warning",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.")))}s.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(7294);const r=e=>{let{image:t,name:n,title:r,url:a,communityMember:i=!1}=e;return o.createElement("section",{className:"author_card"},o.createElement("div",null,o.createElement("span",{className:"avatar"},o.createElement("a",{href:a,target:"_blank",alt:n},o.createElement("img",{src:t,alt:n}))),o.createElement("div",null,o.createElement("span",{className:"name"},o.createElement("a",{href:a,target:"_blank",alt:n},n)),o.createElement("span",{className:"title"},r),o.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",o.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},2867:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/transfering-setup-ownership-e59591d6c2b6023384e94dfa4873964a.png"},1e3:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/transfering-setup-ownership-e59591d6c2b6023384e94dfa4873964a.png"}}]); \ No newline at end of file diff --git a/assets/js/1d8a5d15.d895b1ed.js b/assets/js/1d8a5d15.d895b1ed.js new file mode 100644 index 000000000..fc38665b4 --- /dev/null +++ b/assets/js/1d8a5d15.d895b1ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9854],{884:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>h,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>g});var s=t(5893),i=t(1151),r=t(3872),o=t(8432),l=t(1586);const a={template:"post",draft:!1,hide_title:!0,title:"Transfering setup ownership",slug:"transfering-setup-ownership",image:"./assets/transfering-setup-ownership.png?202311181223",date:new Date("2023-09-12T23:00:00.000Z"),description:"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup",category:"Tutorial",tags:["transfer","ownership","guide","setup","configuration"]},h=void 0,d={id:"Node Operators/transfering-setup-ownership",title:"Transfering setup ownership",description:"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup",source:"@site/guides/Node Operators/transfering-setup-ownership.md",sourceDirName:"Node Operators",slug:"/Node Operators/transfering-setup-ownership",permalink:"/guides/Node Operators/transfering-setup-ownership",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/transfering-setup-ownership.md",tags:[{label:"transfer",permalink:"/guides/tags/transfer"},{label:"ownership",permalink:"/guides/tags/ownership"},{label:"guide",permalink:"/guides/tags/guide"},{label:"setup",permalink:"/guides/tags/setup"},{label:"configuration",permalink:"/guides/tags/configuration"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{template:"post",draft:!1,hide_title:!0,title:"Transfering setup ownership",slug:"transfering-setup-ownership",image:"./assets/transfering-setup-ownership.png?202311181223",date:"2023-09-12T23:00:00.000Z",description:"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup",category:"Tutorial",tags:["transfer","ownership","guide","setup","configuration"]},sidebar:"defaultSidebar",previous:{title:"Running a node in Docker",permalink:"/guides/Node Operators/running-a-node-in-docker"},next:{title:"Updating Lightning",permalink:"/guides/Node Operators/updating-lightning"}},c={image:t(9548).Z},g=[{value:"TL;DR",id:"tldr",level:2},{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Ownership of Lightning CLI files",id:"ownership-of-lightning-cli-files",level:2},{value:"Systemd Service",id:"systemd-service",level:2},{value:"Stop the service",id:"stop-the-service",level:2},{value:"Clear the .lightning data",id:"clear-the-lightning-data",level:2},{value:"Create a user",id:"create-a-user",level:2},{value:"Move lightning system and source code directory to user's home",id:"move-lightning-system-and-source-code-directory-to-users-home",level:2},{value:"1) Move the /root/.lightning directory from one user to the other",id:"1-move-the-rootlightning-directory-from-one-user-to-the-other",level:3},{value:"2) Move the /root/fleek-network directory from one user to the other",id:"2-move-the-rootfleek-network-directory-from-one-user-to-the-other",level:3},{value:"3) Confirm move by finding both directories",id:"3-confirm-move-by-finding-both-directories",level:3},{value:"Change ownership of files",id:"change-ownership-of-files",level:2},{value:"The lgtn symbolic link (symlink)",id:"the-lgtn-symbolic-link-symlink",level:2},{value:"Update the Systemd service unit",id:"update-the-systemd-service-unit",level:2},{value:"Update the config.toml with user-preferred file locations",id:"update-the-configtoml-with-user-preferred-file-locations",level:2},{value:"Start the service",id:"start-the-service",level:2},{value:"Conclusion",id:"conclusion",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Transfering setup ownership",src:t(2867).Z+"",width:"1450",height:"816"})}),"\n","\n","\n",(0,s.jsx)(n.h2,{id:"tldr",children:"TL;DR"}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsxs)(n.p,{children:["The step-by-step instructions provided in the guide should be simple to follow, but the process is also available as an automated script from our familiar ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/get.fleek.network",children:"get.fleek.network"})," tool."]}),(0,s.jsx)(n.p,{children:"To use the automated script execute the following command in your server terminal and follow the instructions:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"curl -sS https://get.fleek.network/transfer_system_user_setup_ownership | bash\n"})}),(0,s.jsxs)(n.p,{children:["We try to make the auomated scripts as useful as possible, but it's impossible to fit every single use-case. So, if you find any isses or have feedback to help us improve ",(0,s.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"message us through our Discord"}),"."]})]}),"\n",(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"Our Lightning CLI and Node process is run by a user, that has some sort of permissions\u2013some users run it as a super user (root) which is questionable as root privileges are not a necessary good. We'll look into how to create a user to manage and control the Fleek Network Lightning CLI and Systemd unit service. Also, presents the concept of file permissions and ownership which is crucial in preventing private or sensitive data from being exposed to dodgy actors."}),"\n",(0,s.jsx)(n.p,{children:"Let's discuss the topic and open up a few ideas to help us improve the security of our server."}),"\n",(0,s.jsx)(n.h2,{id:"pre-requisites",children:"Pre-requisites"}),"\n",(0,s.jsx)(n.p,{children:"To follow the guide, you will need the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Familiarity with the command-line interface"}),"\n",(0,s.jsx)(n.li,{children:"Have installed and set up the Lightning CLI and service"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"ownership-of-lightning-cli-files",children:"Ownership of Lightning CLI files"}),"\n",(0,s.jsx)(n.p,{children:"The user who installs the Lightning CLI and sets the Service takes an important role that determines the location of the configuration files, the setup, and how the Systemd service is managed or controlled."}),"\n",(0,s.jsxs)(n.p,{children:["Our ",(0,s.jsx)(n.a,{href:"/docs/node/install",children:"install"})," document recommends creating a user and switching to the user to set up the service. You shouldn't want installed applications to run with elevated privileges. Applications are meant to be run with non-administrative privileges. If an application requires higher privileges, the administrator, such as a ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Sudo",children:"sudoer"})," should be able to elevate it. An application that has full access and control of a system can modify it in harmful ways, e.g. compromise the private keys."]}),"\n",(0,s.jsx)(n.p,{children:"For our guide, we'll illustrate the process of migration from a super user (root) to another user (sudo). The knowledge should be easily appliable for any other user-to-user migration. We stick with root user for simplicity and because that's the most common use case."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["A reference document about ",(0,s.jsx)(n.a,{href:"/references/Lightning%20CLI/file-permissions-and-ownership",children:"File permissions and ownership"})," is available that explains how it works practically, by showcasing how the process can be started, how the node process locates the Keystore, etc."]})}),"\n",(0,s.jsx)(n.h2,{id:"systemd-service",children:"Systemd Service"}),"\n",(0,s.jsx)(n.p,{children:"In systemd, a unit refers to any resource that the system knows how to operate on and manage. This is the primary object that the systemd tools know how to deal with. These resources are defined using configuration files called unit files."}),"\n",(0,s.jsxs)(n.p,{children:["The recommended installation process features a ",(0,s.jsx)(n.a,{href:"https://www.freedesktop.org/software/systemd/man/systemd.service.html",children:"systemd.service"})," which is a resource that the system knows how to operate and manage by an administrator user."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"When using a Systemd service to run a process, it operates comparably to running it directly. The key difference is that Systemd keeps track of all the processes and threads that are spawned. This means that when a service is stopped using systemctl, such as the Fleek Network Lightning Node service, all the child processes that were started by the service are also terminated. Additionally, by utilizing Systemd, a user can run the process in the background and configure it to start automatically on system startup."})}),"\n",(0,s.jsxs)(n.p,{children:["If you have followed the installation recommendations, find the systemd service unit in the location ",(0,s.jsx)(n.code,{children:"/etc/systemd/system/lightning.service"})," (we are using Ubuntu Linux as an example to keep it short)."]}),"\n",(0,s.jsxs)(n.p,{children:["Make sure that you have set up a ",(0,s.jsx)(n.a,{href:"/docs/node/install#systemd-service-setup",children:"Systemd unit service"}),", as recommended during the installation as this guide assumes you have one setup."]}),"\n",(0,s.jsx)(n.h2,{id:"stop-the-service",children:"Stop the service"}),"\n",(0,s.jsxs)(n.p,{children:["Before we proceed with any changes required for the migration, you'll have to stop the ",(0,s.jsx)(n.code,{children:"lightning.service"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"systemctl stop lightning\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["For this guide, we are assuming that you are migrating ownership from ",(0,s.jsx)(n.strong,{children:"root"})," to a ",(0,s.jsx)(n.strong,{children:"sudoer"})," user. If not, you might be required to elevate privileges as ",(0,s.jsx)(n.strong,{children:"sudo"}),"** where required. For example, ",(0,s.jsx)(n.code,{children:"sudo systemctl stop lightning"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"clear-the-lightning-data",children:"Clear the .lightning data"}),"\n",(0,s.jsxs)(n.p,{children:["Run the following command to clear the ",(0,s.jsx)(n.code,{children:"/root/.lightning/data"}),", as it can be quite large, and we don't need to move it."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo rm -rf /root/.lightning/data\n"})}),"\n",(0,s.jsx)(n.h2,{id:"create-a-user",children:"Create a user"}),"\n",(0,s.jsx)(o.ZP,{}),"\n",(0,s.jsx)(n.h2,{id:"move-lightning-system-and-source-code-directory-to-users-home",children:"Move lightning system and source code directory to user's home"}),"\n",(0,s.jsx)(n.p,{children:"A user should've been created, added the user to the sudo group, switched to the user, and changed the directory to the user's home."}),"\n",(0,s.jsxs)(n.p,{children:["Run the command ",(0,s.jsx)(n.code,{children:"pwd"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"pwd\n"})}),"\n",(0,s.jsx)(n.p,{children:"The output would look like:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"/home/\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Given the username ",(0,s.jsx)(n.strong,{children:"lgtn"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"/home/lgtn\n"})}),"\n",(0,s.jsx)(n.p,{children:"You'll then move two directories:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"/root/.lightning"})]}),"\n",(0,s.jsxs)(n.li,{children:["The source code under the parent ",(0,s.jsx)(n.code,{children:"/root/fleek-network"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"1-move-the-rootlightning-directory-from-one-user-to-the-other",children:["1) Move the ",(0,s.jsx)(n.code,{children:"/root/.lightning"})," directory from one user to the other"]}),"\n",(0,s.jsxs)(n.p,{children:["For our demo, we have assumed ",(0,s.jsx)(n.strong,{children:"root"})," user to ",(0,s.jsx)(n.strong,{children:"sudoer"})," user named ",(0,s.jsx)(n.strong,{children:"lgtn"}),", thus that'll look like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo mv /root/.lightning /home/lgtn/\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"2-move-the-rootfleek-network-directory-from-one-user-to-the-other",children:["2) Move the ",(0,s.jsx)(n.code,{children:"/root/fleek-network"})," directory from one user to the other"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo mv /root/fleek-network /home/lgtn/\n"})}),"\n",(0,s.jsx)(n.h3,{id:"3-confirm-move-by-finding-both-directories",children:"3) Confirm move by finding both directories"}),"\n",(0,s.jsxs)(n.p,{children:["In the user $HOME directory, you should be able to list the content of the directory and find the ",(0,s.jsx)(n.code,{children:".lightning"})," and ",(0,s.jsx)(n.code,{children:"fleek-network"})," directory."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"ls -la\n"})}),"\n",(0,s.jsx)(n.p,{children:"The output should be similar to the following."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"drwxr-x--- 6 lgtn lgtn 4096 Sep 12 13:51 .\ndrwxr-xr-x 3 root root 4096 Sep 11 12:28 ..\ndrwxrwxr-x 5 root root 4096 Sep 11 15:25 .lightning\ndrwxrwxr-x 3 root root 4096 Sep 11 12:28 fleek-network\n"})}),"\n",(0,s.jsx)(n.h2,{id:"change-ownership-of-files",children:"Change ownership of files"}),"\n",(0,s.jsxs)(n.p,{children:["Once the directories and files are moved, they should have the wrong ownership, which should be set to ",(0,s.jsxs)(n.strong,{children:["root",":root"]}),". We'll now have to change the ownership of the directories and files recursively."]}),"\n",(0,s.jsxs)(n.p,{children:["Change the ownership of ",(0,s.jsx)(n.code,{children:"/home/lgtn/.lightning"})," to the user ",(0,s.jsx)(n.strong,{children:"lgtn"})," as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo chown -R lgtn:lgtn .lightning\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Make sure that you use the ",(0,s.jsx)(n.code,{children:"-R"})," flag to have the ownership changes applied to the parent, the child directories and all the files."]})}),"\n",(0,s.jsxs)(n.p,{children:["Change the ownership of ",(0,s.jsx)(n.code,{children:"/home/lgtn/fleek-network"})," to the user ",(0,s.jsx)(n.strong,{children:"lgtn"})," as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo chown -R lgtn:lgtn fleek-network\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Once completed, if you list the content of the directory the ownership should have changed from ",(0,s.jsx)(n.code,{children:"root:root"})," to ",(0,s.jsx)(n.code,{children:"lgtn:lgtn"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"ls -la\n"})}),"\n",(0,s.jsx)(n.p,{children:"The output should be similar to the following."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"drwxr-x--- 6 lgtn lgtn 4096 Sep 12 13:51 .\ndrwxr-xr-x 3 root root 4096 Sep 11 12:28 ..\ndrwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning\ndrwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network\n"})}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsxs)(n.p,{children:["Remember that we are using ",(0,s.jsx)(n.strong,{children:"lgtn"})," for our demo. If you have opted for a different username, make sure you use the correct username. To find the username you are logged in with run the command:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"whoami\n"})}),(0,s.jsxs)(n.p,{children:["For our demo, we'll assume that you understand that ",(0,s.jsx)(n.strong,{children:"lgtn"})," is the user we opted in for our demo."]})]}),"\n",(0,s.jsx)(n.h2,{id:"the-lgtn-symbolic-link-symlink",children:"The lgtn symbolic link (symlink)"}),"\n",(0,s.jsxs)(n.p,{children:["We have the symbolic link that links the binary built from the source code, to the alias ",(0,s.jsx)(n.strong,{children:"lgtn"})," that's set under the ",(0,s.jsx)(n.code,{children:"/usr/local/bin/lgtn"})," pathname."]}),"\n",(0,s.jsx)(n.p,{children:"For example, you can find where that is linked to by running:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"ls -la $(which lgtn)\n"})}),"\n",(0,s.jsxs)(n.p,{children:["On the output below, we can see that the ",(0,s.jsx)(n.code,{children:"/usr/local/bin/lgtn"})," points to ",(0,s.jsx)(n.code,{children:"/root/fleek-network/lightning/target/release/lightning-node"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"lrwxrwxrwx 1 root root 64 Sep 11 15:48 /usr/local/bin/lgtn -> /root/fleek-network/lightning/target/release/lightning-node\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The target base path is ",(0,s.jsx)(n.code,{children:"/root"}),", and we know that we've moved the source code directory to the user home ",(0,s.jsx)(n.code,{children:"/home/lgtn"}),". For this reason, we need to create a new symlink with the updated location of the binary file."]}),"\n",(0,s.jsx)(n.p,{children:"Unlink the symlink:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo unlink /usr/local/bin/lgtn\n"})}),"\n",(0,s.jsx)(n.p,{children:"Create the symlink:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sudo ln -s "/home/lgtn/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn\n'})}),"\n",(0,s.jsx)(n.p,{children:"If successful, you should be able to execute the command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"lgtn help\n"})}),"\n",(0,s.jsx)(n.p,{children:"The output should look similar to:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"Usage: lgtn [OPTIONS] \n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n"})}),"\n",(0,s.jsx)(n.h2,{id:"update-the-systemd-service-unit",children:"Update the Systemd service unit"}),"\n",(0,s.jsx)(n.p,{children:"Open the file, its settings should be similar to the following:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home//.lightning/config.toml run\nExecStop=killall -9 lgtn\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Since we opted in for the username ",(0,s.jsx)(n.strong,{children:"lgtn"})," for our demo, replaced ",(0,s.jsx)(n.code,{children:""})," with ",(0,s.jsx)(n.code,{children:"lgtn"}),", and it would look like:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml run\nExecStop=killall -9 lgtn\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Notice the ",(0,s.jsx)(n.code,{children:"ExecStart="})," which includes the flag ",(0,s.jsx)(n.code,{children:"-c"})," where the location of the user files is declared. Learn how to ",(0,s.jsx)(n.a,{href:"#update-the-configtoml-with-user-preferred-file-locations",children:"update the config.toml"})," to include the user-preferred file paths, e.g. declare the keystore pathname."]})}),"\n",(0,s.jsx)(n.p,{children:"Complete the step by reloading the daemon, to apply the newly created changes. You can do this by executing:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,s.jsx)(n.h2,{id:"update-the-configtoml-with-user-preferred-file-locations",children:"Update the config.toml with user-preferred file locations"}),"\n",(0,s.jsxs)(n.p,{children:["Open the ",(0,s.jsx)(n.code,{children:"/home/lgtn/.lightning/config.toml"})," file in your favorite text editor."]}),"\n",(0,s.jsxs)(n.p,{children:["Replace every instance of ",(0,s.jsx)(n.code,{children:"~"})," (tilde) with the user's home path. We do this to ensure that every time we control the service via systemctl, the configuration file that tells which keystore to use is declared upfront regardless of running it as user or delegating to root with ",(0,s.jsx)(n.strong,{children:"sudo"}),". Learn more about ",(0,s.jsx)(n.a,{href:"/references/Lightning%20CLI/file-permissions-and-ownership",children:"file permissions and ownership"})," by reading the reference document."]}),"\n",(0,s.jsx)(l.ZP,{}),"\n",(0,s.jsx)(n.h2,{id:"start-the-service",children:"Start the service"}),"\n",(0,s.jsx)(n.p,{children:"At this stage, you should have migrated the essential files to the user home."}),"\n",(0,s.jsxs)(n.p,{children:["Ideally, you would now manage the service as the ",(0,s.jsx)(n.code,{children:"user"})," (as described in the ",(0,s.jsx)(n.a,{href:"/references/Systemd/user-service/",children:"user service reference"}),"). To keep our guide wider to all users, we'll prefix the commands with ",(0,s.jsx)(n.strong,{children:"sudo"}),", which elevates the permissions to ",(0,s.jsx)(n.strong,{children:"root"}),". But since we have provided the configuration file the ",(0,s.jsx)(n.code,{children:"-c"})," in our ",(0,s.jsx)(n.a,{href:"#systemd-service",children:"systemd service"}),", we'll have the user-preferred configuration options ruling."]}),"\n",(0,s.jsx)(n.p,{children:"Start the service by running the command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl start lightning.service\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section ",(0,s.jsx)(n.a,{href:"/docs/node/install#analyzing-log-messages",children:"Log Messages"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["To learn more, visit the section ",(0,s.jsx)(n.a,{href:"/docs/node/install#use-systemctl-to-manage-systemd-service",children:"Use Systemctl to manage the Lightning Service"})]}),"\n",(0,s.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,s.jsx)(n.p,{children:"We started by giving a brief introduction to ownership of the Lightning CLI files."}),"\n",(0,s.jsx)(n.p,{children:"Jumped through topics of Systemd service that helps the user manage the service in the Linux environment, which helps keep track of all the processes and threads that are spawned."}),"\n",(0,s.jsxs)(n.p,{children:["We've gone through the step-by-step process to migrate the Fleek Network CLI and Systemd service setup from one user to the other. To keep it short, we decided to go with the use-case of where the migration happens between a ",(0,s.jsx)(n.strong,{children:"root"})," user and a ",(0,s.jsx)(n.strong,{children:"sudoer"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Discover more about the project by ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"watching/contributing on GitHub"}),", following us on ",(0,s.jsx)(n.a,{href:"https://twitter.com/fleek_net",children:"Twitter"}),", and joining ",(0,s.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"our community Discord"})," for any updates."]}),"\n",(0,s.jsx)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},8432:(e,n,t)=>{t.d(n,{ZP:()=>o});var s=t(5893),i=t(1151);function r(e){const n={admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["We recommend creating a ",(0,s.jsx)(n.code,{children:"non-root"})," user with administrative privileges. It'll allow us to install any system requirements."]}),"\n",(0,s.jsxs)(n.p,{children:["You can create a new user and add to the ",(0,s.jsx)(n.strong,{children:"sudo"})," group by running:"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["For our example, we'll be using the name ",(0,s.jsx)(n.code,{children:"lgtn"})," but you can pick whichever you'd like. If you already have a ",(0,s.jsx)(n.strong,{children:"sudoer"})," account, you can skip this step."]})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo adduser lgtn\n"})}),"\n",(0,s.jsxs)(n.p,{children:["After completing the ",(0,s.jsx)(n.code,{children:"adduser"})," steps, execute the ",(0,s.jsx)(n.code,{children:"usermod"})," to add the ",(0,s.jsx)(n.code,{children:"user"})," to the ",(0,s.jsx)(n.strong,{children:"sudo"})," group, as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo usermod -aG sudo lgtn\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Switch to the new ",(0,s.jsx)(n.strong,{children:"user"})," by using the command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"su lgtn\n"})}),"\n",(0,s.jsx)(n.p,{children:"Change the directory to the new user's home, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cd /home/lgtn\n"})})]})}function o(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},1586:(e,n,t)=>{t.d(n,{ZP:()=>o});var s=t(5893),i=t(1151);function r(e){const n={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"/home//.lightning/config.toml"})," you'll find some and more of the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,s.jsx)(n.strong,{children:"configuration.toml"}),". We keep it short to make it easier to follow, do not copy and paste."]})}),"\n",(0,s.jsxs)(n.p,{children:["Find and replace all instances of ~ in the config file ",(0,s.jsx)(n.code,{children:"/home//.lightning/config.toml"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Here's an example of how to do it using ",(0,s.jsx)(n.strong,{children:"sed"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Replace the ",(0,s.jsx)(n.code,{children:""})," with your username. For example, if you have followed the recommendation to ",(0,s.jsx)(n.a,{href:"/docs/node/install#create-a-user",children:"create a user"})," it would look like ",(0,s.jsx)(n.code,{children:"/home/lgtn/.lightning/config.toml"})," for the username ",(0,s.jsx)(n.strong,{children:"lgtn"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["For example, if your username is ",(0,s.jsx)(n.code,{children:"lgtn"})," that'd look like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Once modified, you can run a ",(0,s.jsx)(n.code,{children:"cat"})," to see the content of the files to confirm it has been updated."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cat /home/lgtn/.lightning/config.toml\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For our example where we opted in for the username ",(0,s.jsx)(n.code,{children:"lgtn"})," that would look like:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Warning",type:"caution",children:(0,s.jsx)(n.p,{children:"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here."})})]})}function o(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>i});t(7294);var s=t(5893);const i=e=>{let{image:n,name:t,title:i,url:r,communityMember:o=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:r,target:"_blank",alt:t,children:(0,s.jsx)("img",{src:n,alt:t})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:r,target:"_blank",alt:t,children:t})}),(0,s.jsx)("span",{className:"title",children:i}),(0,s.jsxs)("span",{className:"discord",children:[o?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},9548:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/transfering-setup-ownership-e59591d6c2b6023384e94dfa4873964a.png"},2867:(e,n,t)=>{t.d(n,{Z:()=>s});const s=t.p+"assets/images/transfering-setup-ownership-e59591d6c2b6023384e94dfa4873964a.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var s=t(7294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21f2cabf.6cb7a47f.js b/assets/js/21f2cabf.c9ad8d38.js similarity index 96% rename from assets/js/21f2cabf.6cb7a47f.js rename to assets/js/21f2cabf.c9ad8d38.js index c2ccf9a61..bcab46adb 100644 --- a/assets/js/21f2cabf.6cb7a47f.js +++ b/assets/js/21f2cabf.c9ad8d38.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4537],{724:e=>{e.exports=JSON.parse('{"label":"backup","permalink":"/references/tags/backup","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4537],{724:e=>{e.exports=JSON.parse('{"label":"backup","permalink":"/references/tags/backup","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/26b85cb6.98313bc5.js b/assets/js/26b85cb6.98313bc5.js new file mode 100644 index 000000000..c1ff87596 --- /dev/null +++ b/assets/js/26b85cb6.98313bc5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7055],{1586:(e,n,t)=>{t.d(n,{ZP:()=>i});var o=t(5893),r=t(1151);function s(e){const n={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["In the ",(0,o.jsx)(n.code,{children:"/home//.lightning/config.toml"})," you'll find some and more of the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,o.jsx)(n.strong,{children:"configuration.toml"}),". We keep it short to make it easier to follow, do not copy and paste."]})}),"\n",(0,o.jsxs)(n.p,{children:["Find and replace all instances of ~ in the config file ",(0,o.jsx)(n.code,{children:"/home//.lightning/config.toml"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["Here's an example of how to do it using ",(0,o.jsx)(n.strong,{children:"sed"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n'})}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["Replace the ",(0,o.jsx)(n.code,{children:""})," with your username. For example, if you have followed the recommendation to ",(0,o.jsx)(n.a,{href:"/docs/node/install#create-a-user",children:"create a user"})," it would look like ",(0,o.jsx)(n.code,{children:"/home/lgtn/.lightning/config.toml"})," for the username ",(0,o.jsx)(n.strong,{children:"lgtn"}),"."]})}),"\n",(0,o.jsxs)(n.p,{children:["For example, if your username is ",(0,o.jsx)(n.code,{children:"lgtn"})," that'd look like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Once modified, you can run a ",(0,o.jsx)(n.code,{children:"cat"})," to see the content of the files to confirm it has been updated."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sh",children:"cat /home/lgtn/.lightning/config.toml\n"})}),"\n",(0,o.jsxs)(n.p,{children:["For our example where we opted in for the username ",(0,o.jsx)(n.code,{children:"lgtn"})," that would look like:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,o.jsx)(n.admonition,{title:"Warning",type:"caution",children:(0,o.jsx)(n.p,{children:"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here."})})]})}function i(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(s,{...e})}):s(e)}},5979:(e,n,t)=>{t.d(n,{ZP:()=>i});var o=t(5893),r=t(1151);function s(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["You can restore the keystore (Public Keys) by copying the directory to the ",(0,o.jsx)(n.code,{children:"~/.lightning"})," directory."]}),"\n",(0,o.jsx)(n.p,{children:"Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["The keystore and files are located under the hypothetical location ",(0,o.jsx)(n.code,{children:"/my-keystore-backup"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["The files in the ",(0,o.jsx)(n.code,{children:"/my-keystore-backup"})," are the following:"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"/my-keystore-backup\n\u251c\u2500\u2500 consensus.pem\n\u2514\u2500\u2500 node.pem\n\n1 directory, 2 files\n"})}),"\n",(0,o.jsx)(n.p,{children:"Considering the above for our example, you would have to run the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"mv /my-keystore-backup /home//.lightning/keystore\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["Remember to replace the ",(0,o.jsx)(n.code,{children:""})," with the correct username for the setup. For example, if you have installed the Fleek Network with the username ",(0,o.jsx)(n.code,{children:"lgtn"})," that would be ",(0,o.jsx)(n.code,{children:"/home/lgtn/.lightning/keystore"}),"."]})}),"\n",(0,o.jsxs)(n.p,{children:["Once moved, remember to start the service, you can learn how to manage the service by reading the section ",(0,o.jsx)(n.a,{href:"/docs/node/systemd-service",children:"Systemd Service"}),"."]})]})}function i(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(s,{...e})}):s(e)}},6172:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>h,default:()=>u,frontMatter:()=>a,metadata:()=>c,toc:()=>g});var o=t(5893),r=t(1151),s=t(3872),i=t(1586),l=t(5979);const a={title:"Restore the keystore",slug:"restore-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},h=void 0,c={id:"Lightning CLI/restore-keystore",title:"Restore the keystore",description:"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.",source:"@site/references/Lightning CLI/restore-keystore.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/restore-the-keystore",permalink:"/references/Lightning CLI/restore-the-keystore",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/restore-keystore.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"keystore",permalink:"/references/tags/keystore"},{label:"backup",permalink:"/references/tags/backup"},{label:"restore",permalink:"/references/tags/restore"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Restore the keystore",slug:"restore-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},sidebar:"defaultSidebar",previous:{title:"Permission denied (os error 13)",permalink:"/references/Lightning CLI/permission-denied-os-error-13"},next:{title:"Uninstall Lightning Node",permalink:"/references/Lightning CLI/uninstall-lightning-node"}},d={},g=[{value:"Switch user",id:"switch-user",level:2},{value:"Change directory to user home",id:"change-directory-to-user-home",level:2},{value:"Clear the config.toml",id:"clear-the-configtoml",level:2},{value:"Create a new config.toml",id:"create-a-new-configtoml",level:2},{value:"Update the config.toml with user home path",id:"update-the-configtoml-with-user-home-path",level:2},{value:"Restoring the keystore",id:"restoring-the-keystore",level:2}];function p(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsx)(n.p,{children:"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only."})}),"\n",(0,o.jsx)(n.h2,{id:"switch-user",children:"Switch user"}),"\n",(0,o.jsxs)(n.p,{children:["Switch to the correct username you have used to install and set up the Fleek Network Lightning. For example, let's say that the username is ",(0,o.jsx)(n.code,{children:"lgtn"}),". The command you'd have to run would be:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"su lgtn\n"})}),"\n",(0,o.jsx)(n.h2,{id:"change-directory-to-user-home",children:"Change directory to user home"}),"\n",(0,o.jsxs)(n.p,{children:["Change directory to the user you have used to install and set up the Fleek Network Lightning. For example, if you have used the username ",(0,o.jsx)(n.code,{children:"lgtn"})," the command would be:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"cd $HOME\n"})}),"\n",(0,o.jsx)(n.p,{children:"In other words:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"cd /home/lgtn\n"})}),"\n",(0,o.jsx)(n.h2,{id:"clear-the-configtoml",children:"Clear the config.toml"}),"\n",(0,o.jsxs)(n.p,{children:["You should can delete, backup or move the ",(0,o.jsx)(n.code,{children:"config.toml"})," file in order to reset it."]}),"\n",(0,o.jsx)(n.p,{children:"It might be necessary to, if your configuration, e.g. is corrupted, or you want to reset it for any other reason."}),"\n",(0,o.jsx)(n.p,{children:"To move or backup, run:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"mv ~/.lightning/config.toml ~/.lightning/config.toml.backup\n"})}),"\n",(0,o.jsx)(n.p,{children:"If you don't have a use-case for the backup, delete the file. To delete, run the command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"rm ~/.lightning/config.toml\n"})}),"\n",(0,o.jsx)(n.admonition,{title:"warning",type:"caution",children:(0,o.jsxs)(n.p,{children:["You should have switched to the correct username. If you haven't done it, when stating ",(0,o.jsx)(n.code,{children:"~"})," that will refer to the current username home, which can be anything other than the correct username! Make sure you have switched to the correct username used during the installation and set up of Fleek Network Lightning to avoid confusion and issues."]})}),"\n",(0,o.jsx)(n.h2,{id:"create-a-new-configtoml",children:"Create a new config.toml"}),"\n",(0,o.jsx)(n.p,{children:"A new configuration file can be created by running the following command:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"lgtn print-config --default > ~/.lightning/config.toml\n"})}),"\n",(0,o.jsx)(n.h2,{id:"update-the-configtoml-with-user-home-path",children:"Update the config.toml with user home path"}),"\n",(0,o.jsx)(i.ZP,{}),"\n",(0,o.jsx)(n.h2,{id:"restoring-the-keystore",children:"Restoring the keystore"}),"\n",(0,o.jsx)(l.ZP,{}),"\n",(0,o.jsxs)(n.p,{children:["For a more in depth or step-by-step instructions read the guide ",(0,o.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"managing the keystore"}),"."]}),"\n",(0,o.jsx)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>r});t(7294);var o=t(5893);const r=e=>{let{image:n,name:t,title:r,url:s,communityMember:i=!1}=e;return(0,o.jsx)("section",{className:"author_card",children:(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"avatar",children:(0,o.jsx)("a",{href:s,target:"_blank",alt:t,children:(0,o.jsx)("img",{src:n,alt:t})})}),(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"name",children:(0,o.jsx)("a",{href:s,target:"_blank",alt:t,children:t})}),(0,o.jsx)("span",{className:"title",children:r}),(0,o.jsxs)("span",{className:"discord",children:[i?"Join our community on":"Got questions? Find us on"," ",(0,o.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>i});var o=t(7294);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/26b85cb6.b913bd37.js b/assets/js/26b85cb6.b913bd37.js deleted file mode 100644 index c4c0c0f09..000000000 --- a/assets/js/26b85cb6.b913bd37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7055],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),h=p(n),m=o,d=h["".concat(s,".").concat(m)]||h[m]||u[m]||a;return n?r.createElement(d,i(i({ref:t},c),{},{components:n})):r.createElement(d,i({ref:t},c))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[h]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{n.d(t,{ZP:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={toc:[]},i="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(i,(0,r.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"In the ",(0,o.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml")," you'll find some and more of the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,o.kt)("strong",{parentName:"p"},"configuration.toml"),". We keep it short to make it easier to follow, do not copy and paste.")),(0,o.kt)("p",null,"Find and replace all instances of ~ in the config file ",(0,o.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml"),". "),(0,o.kt)("p",null,"Here's an example of how to do it using ",(0,o.kt)("strong",{parentName:"p"},"sed"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n')),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Replace the ",(0,o.kt)("inlineCode",{parentName:"p"},"")," with your username. For example, if you have followed the recommendation to ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user"},"create a user")," it would look like ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/config.toml")," for the username ",(0,o.kt)("strong",{parentName:"p"},"lgtn"),".")),(0,o.kt)("p",null,"For example, if your username is ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," that'd look like this:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n')),(0,o.kt)("p",null,"Once modified, you can run a ",(0,o.kt)("inlineCode",{parentName:"p"},"cat")," to see the content of the files to confirm it has been updated."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cat /home/lgtn/.lightning/config.toml\n")),(0,o.kt)("p",null,"For our example where we opted in for the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," that would look like:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("admonition",{title:"Warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.")))}l.isMDXComponent=!0},8275:(e,t,n)=>{n.d(t,{ZP:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={toc:[]},i="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(i,(0,r.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"You can restore the keystore (Public Keys) by copying the directory to the ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning")," directory."),(0,o.kt)("p",null,"Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:"),(0,o.kt)("p",null,"1) The keystore and files are located under the hypothetical location ",(0,o.kt)("inlineCode",{parentName:"p"},"/my-keystore-backup")),(0,o.kt)("p",null,"2) The files in the ",(0,o.kt)("inlineCode",{parentName:"p"},"/my-keystore-backup")," are the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/my-keystore-backup\n\u251c\u2500\u2500 consensus.pem\n\u2514\u2500\u2500 node.pem\n\n1 directory, 2 files\n")),(0,o.kt)("p",null,"Considering the above for our example, you would have to run the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"mv /my-keystore-backup /home//.lightning/keystore\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Remember to replace the ",(0,o.kt)("inlineCode",{parentName:"p"},"")," with the correct username for the setup. For example, if you have installed the Fleek Network with the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," that would be ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/keystore"),".")),(0,o.kt)("p",null,"Once moved, remember to start the service, you can learn how to manage the service by reading the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"Systemd Service"),"."))}l.isMDXComponent=!0},8850:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>p,default:()=>g,frontMatter:()=>s,metadata:()=>c,toc:()=>u});var r=n(7462),o=(n(7294),n(3905)),a=n(3872),i=n(3242),l=n(8275);const s={title:"Restore the keystore",slug:"restore-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},p=void 0,c={unversionedId:"Lightning CLI/restore-keystore",id:"Lightning CLI/restore-keystore",title:"Restore the keystore",description:"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.",source:"@site/references/Lightning CLI/restore-keystore.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/restore-the-keystore",permalink:"/references/Lightning CLI/restore-the-keystore",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/restore-keystore.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"keystore",permalink:"/references/tags/keystore"},{label:"backup",permalink:"/references/tags/backup"},{label:"restore",permalink:"/references/tags/restore"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Restore the keystore",slug:"restore-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},sidebar:"defaultSidebar",previous:{title:"Permission denied (os error 13)",permalink:"/references/Lightning CLI/permission-denied-os-error-13"},next:{title:"Uninstall Lightning Node",permalink:"/references/Lightning CLI/uninstall-lightning-node"}},h={},u=[{value:"Switch user",id:"switch-user",level:2},{value:"Change directory to user home",id:"change-directory-to-user-home",level:2},{value:"Clear the config.toml",id:"clear-the-configtoml",level:2},{value:"Create a new config.toml",id:"create-a-new-configtoml",level:2},{value:"Update the config.toml with user home path",id:"update-the-configtoml-with-user-home-path",level:2},{value:"Restoring the keystore",id:"restoring-the-keystore",level:2}],m={toc:u},d="wrapper";function g(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.")),(0,o.kt)("h2",{id:"switch-user"},"Switch user"),(0,o.kt)("p",null,"Switch to the correct username you have used to install and set up the Fleek Network Lightning. For example, let's say that the username is ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn"),". The command you'd have to run would be:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"su lgtn\n")),(0,o.kt)("h2",{id:"change-directory-to-user-home"},"Change directory to user home"),(0,o.kt)("p",null,"Change directory to the user you have used to install and set up the Fleek Network Lightning. For example, if you have used the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," the command would be:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"cd $HOME\n")),(0,o.kt)("p",null,"In other words:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"cd /home/lgtn\n")),(0,o.kt)("h2",{id:"clear-the-configtoml"},"Clear the config.toml"),(0,o.kt)("p",null,"You should can delete, backup or move the ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")," file in order to reset it. "),(0,o.kt)("p",null,"It might be necessary to, if your configuration, e.g. is corrupted, or you want to reset it for any other reason."),(0,o.kt)("p",null,"To move or backup, run:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"mv ~/.lightning/config.toml ~/.lightning/config.toml.backup\n")),(0,o.kt)("p",null,"If you don't have a use-case for the backup, delete the file. To delete, run the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"rm ~/.lightning/config.toml\n")),(0,o.kt)("admonition",{title:"warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"You should have switched to the correct username. If you haven't done it, when stating ",(0,o.kt)("inlineCode",{parentName:"p"},"~")," that will refer to the current username home, which can be anything other than the correct username! Make sure you have switched to the correct username used during the installation and set up of Fleek Network Lightning to avoid confusion and issues.")),(0,o.kt)("h2",{id:"create-a-new-configtoml"},"Create a new config.toml"),(0,o.kt)("p",null,"A new configuration file can be created by running the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"lgtn print-config --default > ~/.lightning/config.toml\n")),(0,o.kt)("h2",{id:"update-the-configtoml-with-user-home-path"},"Update the config.toml with user home path"),(0,o.kt)(i.ZP,{mdxType:"FindAndReplaceConfigWithUserPaths"}),(0,o.kt)("h2",{id:"restoring-the-keystore"},"Restoring the keystore"),(0,o.kt)(l.ZP,{mdxType:"RestoreKeystore"}),(0,o.kt)("p",null,"For a more in depth or step-by-step instructions read the guide ",(0,o.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"managing the keystore"),"."),(0,o.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}g.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294);const o=e=>{let{image:t,name:n,title:o,url:a,communityMember:i=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:a,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:a,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},o),r.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/2730e145.3bb3b825.js b/assets/js/2730e145.3bb3b825.js new file mode 100644 index 000000000..617c3209d --- /dev/null +++ b/assets/js/2730e145.3bb3b825.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7147],{5450:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>o,metadata:()=>d,toc:()=>l});var r=i(5893),s=i(1151),t=i(3872);const o={title:"Permission denied (os error 13)",slug:"permission-denied-os-error-13",hide_title:!0,tags:["permissions"]},a=void 0,d={id:"Lightning CLI/permission-denied-os-error-13",title:"Permission denied (os error 13)",description:"Ownership and file permissions",source:"@site/references/Lightning CLI/permission-denied-os-error-13.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/permission-denied-os-error-13",permalink:"/references/Lightning CLI/permission-denied-os-error-13",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/permission-denied-os-error-13.md",tags:[{label:"permissions",permalink:"/references/tags/permissions"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Permission denied (os error 13)",slug:"permission-denied-os-error-13",hide_title:!0,tags:["permissions"]},sidebar:"defaultSidebar",previous:{title:"Node secret key does not exist",permalink:"/references/Lightning CLI/node-secret-key-does-not-exist"},next:{title:"Restore the keystore",permalink:"/references/Lightning CLI/restore-the-keystore"}},c={},l=[{value:"Ownership and file permissions",id:"ownership-and-file-permissions",level:2},{value:"Override the TMPDIR",id:"override-the-tmpdir",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"ownership-and-file-permissions",children:"Ownership and file permissions"}),"\n",(0,r.jsxs)(n.p,{children:["When running the Lightning CLI, the user who's in control can delegate to ",(0,r.jsx)(n.strong,{children:"root"})," via ",(0,r.jsx)(n.strong,{children:"sudo"}),". Depending on how the Fleek Networking Lightning CLI was installed, this might cause some confusion, which is better explained by reading the reference ",(0,r.jsx)(n.a,{href:"/references/Lightning%20CLI/keys-not-found",children:"Keys not found"}),", which illustrates a situation where a user gets an error message about the wrong location of a system path (keystore)."]}),"\n",(0,r.jsxs)(n.p,{children:["Some reasons why the ",(0,r.jsx)(n.code,{children:"Permission denied (os error 13)"})," might occur are related to:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The Fleek Network Lightning CLI process trying to write to a ",(0,r.jsx)(n.code,{children:".lightning"})," stored in a non permitted location"]}),"\n",(0,r.jsxs)(n.li,{children:["The Fleek Network Lightning CLI process trying to write to ",(0,r.jsx)(n.code,{children:"/tmp"})]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["The most common issue can be fixed by reading the section ",(0,r.jsx)(n.a,{href:"#override-the-tmpdir",children:"Override the TMPDIR"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"override-the-tmpdir",children:"Override the TMPDIR"}),"\n",(0,r.jsx)(n.p,{children:"The Fleek Network Lightning process requires writing to a temporary directory. As the process requires permissions, this might fail as demonstrated by some of the output logs we have below."}),"\n",(0,r.jsx)(n.p,{children:"a) A permission denied error message"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"Permission denied (os error 13)\n"})}),"\n",(0,r.jsx)(n.p,{children:"b) Rust panic error message which includes a permission denied"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\n"})}),"\n",(0,r.jsx)(n.p,{children:"c) A trace showing the path where this has failed"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:'[00007fcbe168e764] openat(AT_FDCWD, "/tmp/lightning.log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = -1 EACCES (Permission denied)\n[00007fcbe168ea6f] write(2, "thread \'", 8thread \') = 8\n[00007fcbe168ea6f] write(2, "main", 4main) = 4\n[00007fcbe168ea6f] write(2, "\' panicked at \'", 15\' panicked at \') = 15\n[00007fcbe168ea6f] write(2, "called `Result::unwrap()` on an "..., 114called `Result::unwrap()` on an `Err` value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }) = 114\n[00007fcbe168ea6f] write(2, "\', ", 3\', ) = 3\n'})}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"/tmp"})," directory should have wide permissions for all applications, but to mitigate any permission issues the user can override the system environment ",(0,r.jsx)(n.code,{children:"TMPDIR"}),". For example, the ",(0,r.jsx)(n.code,{children:"installer"})," and ",(0,r.jsx)(n.code,{children:"update"})," scripts override ",(0,r.jsx)(n.code,{children:"TMPDIR"})," environment variable to ",(0,r.jsx)(n.code,{children:"/var/tmp"})," setting it in the service unit ",(0,r.jsx)(n.code,{children:"Environment="}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["The Lightning CLI process is aware of the environment variable TMPDIR, which the operators can override as discussed in the reference for ",(0,r.jsx)(n.a,{href:"/references/Lightning%20CLI/update-cli-from-source-code/#update-the-systemd-service-unit",children:"Update the System service unit"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["In short, it requires you to include a ",(0,r.jsx)(n.code,{children:"Environment="})," value of ",(0,r.jsx)(n.code,{children:"TMPDIR=/var/tmp"})," as follows:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"[Service]\n...\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"attention",type:"caution",children:(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"/etc/systemd/system/lightning.service"})," service unit file presented here is a shorter version for simplicity. Do not replace your service unit file with the shorter content version presented here."]})}),"\n",(0,r.jsx)(t.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function m(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},3872:(e,n,i)=>{i.d(n,{Z:()=>s});i(7294);var r=i(5893);const s=e=>{let{image:n,name:i,title:s,url:t,communityMember:o=!1}=e;return(0,r.jsx)("section",{className:"author_card",children:(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"avatar",children:(0,r.jsx)("a",{href:t,target:"_blank",alt:i,children:(0,r.jsx)("img",{src:n,alt:i})})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"name",children:(0,r.jsx)("a",{href:t,target:"_blank",alt:i,children:i})}),(0,r.jsx)("span",{className:"title",children:s}),(0,r.jsxs)("span",{className:"discord",children:[o?"Join our community on":"Got questions? Find us on"," ",(0,r.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>o});var r=i(7294);const s={},t=r.createContext(s);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2730e145.70545291.js b/assets/js/2730e145.70545291.js deleted file mode 100644 index 2d1e648a2..000000000 --- a/assets/js/2730e145.70545291.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7147],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>h});var r=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var l=r.createContext({}),d=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},p=function(e){var n=d(e.components);return r.createElement(l.Provider,{value:n},e.children)},c="mdxType",m={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},u=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),c=d(t),u=i,h=c["".concat(l,".").concat(u)]||c[u]||m[u]||a;return t?r.createElement(h,o(o({ref:n},p),{},{components:t})):r.createElement(h,o({ref:n},p))}));function h(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var a=t.length,o=new Array(a);o[0]=u;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s[c]="string"==typeof e?e:i,o[1]=s;for(var d=2;d{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var r=t(7462),i=(t(7294),t(3905)),a=t(3872);const o={title:"Permission denied (os error 13)",slug:"permission-denied-os-error-13",hide_title:!0,tags:["permissions"]},s=void 0,l={unversionedId:"Lightning CLI/permission-denied-os-error-13",id:"Lightning CLI/permission-denied-os-error-13",title:"Permission denied (os error 13)",description:"Ownership and file permissions",source:"@site/references/Lightning CLI/permission-denied-os-error-13.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/permission-denied-os-error-13",permalink:"/references/Lightning CLI/permission-denied-os-error-13",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/permission-denied-os-error-13.md",tags:[{label:"permissions",permalink:"/references/tags/permissions"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Permission denied (os error 13)",slug:"permission-denied-os-error-13",hide_title:!0,tags:["permissions"]},sidebar:"defaultSidebar",previous:{title:"Node secret key does not exist",permalink:"/references/Lightning CLI/node-secret-key-does-not-exist"},next:{title:"Restore the keystore",permalink:"/references/Lightning CLI/restore-the-keystore"}},d={},p=[{value:"Ownership and file permissions",id:"ownership-and-file-permissions",level:2},{value:"Override the TMPDIR",id:"override-the-tmpdir",level:2}],c={toc:p},m="wrapper";function u(e){let{components:n,...t}=e;return(0,i.kt)(m,(0,r.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"ownership-and-file-permissions"},"Ownership and file permissions"),(0,i.kt)("p",null,"When running the Lightning CLI, the user who's in control can delegate to ",(0,i.kt)("strong",{parentName:"p"},"root")," via ",(0,i.kt)("strong",{parentName:"p"},"sudo"),". Depending on how the Fleek Networking Lightning CLI was installed, this might cause some confusion, which is better explained by reading the reference ",(0,i.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/keys-not-found"},"Keys not found"),", which illustrates a situation where a user gets an error message about the wrong location of a system path (keystore)."),(0,i.kt)("p",null,"Some reasons why the ",(0,i.kt)("inlineCode",{parentName:"p"},"Permission denied (os error 13)")," might occur are related to:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The Fleek Network Lightning CLI process trying to write to a ",(0,i.kt)("inlineCode",{parentName:"li"},".lightning")," stored in a non permitted location"),(0,i.kt)("li",{parentName:"ul"},"The Fleek Network Lightning CLI process trying to write to ",(0,i.kt)("inlineCode",{parentName:"li"},"/tmp"))),(0,i.kt)("p",null,"The most common issue can be fixed by reading the section ",(0,i.kt)("a",{parentName:"p",href:"#override-the-tmpdir"},"Override the TMPDIR"),"."),(0,i.kt)("h2",{id:"override-the-tmpdir"},"Override the TMPDIR"),(0,i.kt)("p",null,"The Fleek Network Lightning process requires writing to a temporary directory. As the process requires permissions, this might fail as demonstrated by some of the output logs we have below."),(0,i.kt)("p",null,"a) A permission denied error message"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"Permission denied (os error 13)\n")),(0,i.kt)("p",null,"b) Rust panic error message which includes a permission denied"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\nthread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: \"Permission denied\" }', core/node/src/cli.rs:181:18\nnote: run with RUST_BACKTRACE=1 environment variable to display a backtrace\n")),(0,i.kt)("p",null,"c) A trace showing the path where this has failed"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'[00007fcbe168e764] openat(AT_FDCWD, "/tmp/lightning.log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = -1 EACCES (Permission denied)\n[00007fcbe168ea6f] write(2, "thread \'", 8thread \') = 8\n[00007fcbe168ea6f] write(2, "main", 4main) = 4\n[00007fcbe168ea6f] write(2, "\' panicked at \'", 15\' panicked at \') = 15\n[00007fcbe168ea6f] write(2, "called `Result::unwrap()` on an "..., 114called `Result::unwrap()` on an `Err` value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }) = 114\n[00007fcbe168ea6f] write(2, "\', ", 3\', ) = 3\n')),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("inlineCode",{parentName:"p"},"/tmp")," directory should have wide permissions for all applications, but to mitigate any permission issues the user can override the system environment ",(0,i.kt)("inlineCode",{parentName:"p"},"TMPDIR"),". For example, the ",(0,i.kt)("inlineCode",{parentName:"p"},"installer")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"update")," scripts override ",(0,i.kt)("inlineCode",{parentName:"p"},"TMPDIR")," environment variable to ",(0,i.kt)("inlineCode",{parentName:"p"},"/var/tmp")," setting it in the service unit ",(0,i.kt)("inlineCode",{parentName:"p"},"Environment="),".")),(0,i.kt)("p",null,"The Lightning CLI process is aware of the environment variable TMPDIR, which the operators can override as discussed in the reference for ",(0,i.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/update-cli-from-source-code/#update-the-systemd-service-unit"},"Update the System service unit"),"."),(0,i.kt)("p",null,"In short, it requires you to include a ",(0,i.kt)("inlineCode",{parentName:"p"},"Environment=")," value of ",(0,i.kt)("inlineCode",{parentName:"p"},"TMPDIR=/var/tmp")," as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"[Service]\n...\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n")),(0,i.kt)("admonition",{title:"attention",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/systemd/system/lightning.service")," service unit file presented here is a shorter version for simplicity. Do not replace your service unit file with the shorter content version presented here.")),(0,i.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}u.isMDXComponent=!0},3872:(e,n,t)=>{t.d(n,{Z:()=>i});var r=t(7294);const i=e=>{let{image:n,name:t,title:i,url:a,communityMember:o=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:a,target:"_blank",alt:t},r.createElement("img",{src:n,alt:t}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:a,target:"_blank",alt:t},t)),r.createElement("span",{className:"title"},i),r.createElement("span",{className:"discord"},o?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/27528755.a604f963.js b/assets/js/27528755.432f62b4.js similarity index 89% rename from assets/js/27528755.a604f963.js rename to assets/js/27528755.432f62b4.js index ae1026fd4..5358501f6 100644 --- a/assets/js/27528755.a604f963.js +++ b/assets/js/27528755.432f62b4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6926],{2578:n=>{n.exports=JSON.parse('{"label":"Uninstall","permalink":"/references/tags/uninstall","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6926],{2578:n=>{n.exports=JSON.parse('{"label":"Uninstall","permalink":"/references/tags/uninstall","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/29b62a39.6607397c.js b/assets/js/29b62a39.6607397c.js new file mode 100644 index 000000000..aae20ad6e --- /dev/null +++ b/assets/js/29b62a39.6607397c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1498],{181:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>u});var n=s(5893),i=s(1151);const o=s.p+"assets/images/banner-guides-cd76f6e8aac3594bb5d072a564e0e277.png",a={title:"About guides",hide_title:!0,sidebar_position:1,tags:["Guides","Help","Fleek Network"]},r=void 0,d={id:"index",title:"About guides",description:"The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.",source:"@site/guides/index.md",sourceDirName:".",slug:"/",permalink:"/guides/",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/index.md",tags:[{label:"Guides",permalink:"/guides/tags/guides"},{label:"Help",permalink:"/guides/tags/help"},{label:"Fleek Network",permalink:"/guides/tags/fleek-network"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",sidebarPosition:1,frontMatter:{title:"About guides",hide_title:!0,sidebar_position:1,tags:["Guides","Help","Fleek Network"]},sidebar:"defaultSidebar",next:{title:"Getting Started",permalink:"/guides/Node Operators/getting-started"}},c={},u=[];function l(e){const t={a:"a",p:"p",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("img",{className:"banner",src:o}),"\n",(0,n.jsx)(t.p,{children:"The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes."}),"\n",(0,n.jsxs)(t.p,{children:["It differs from the ",(0,n.jsx)(t.a,{href:"/references",children:"references"})," documentation which serves as a quick direct breakdown of commands and processes without much explanation, as the name implies."]}),"\n",(0,n.jsx)(t.p,{children:"To start, find guides by consulting the available categories to locate the content on the sidebar. Our guides are also available as a result when using the search feature located at the very top of the documentation site."})]})}function p(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>r,a:()=>a});var n=s(7294);const i={},o=n.createContext(i);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/29b62a39.d491548c.js b/assets/js/29b62a39.d491548c.js deleted file mode 100644 index bd4097b61..000000000 --- a/assets/js/29b62a39.d491548c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1498],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),d=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},l=function(e){var t=d(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=d(r),f=o,m=u["".concat(c,".").concat(f)]||u[f]||p[f]||a;return r?n.createElement(m,i(i({ref:t},l),{},{components:r})):n.createElement(m,i({ref:t},l))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var d=2;d{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>f,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a=r.p+"assets/images/banner-guides-cd76f6e8aac3594bb5d072a564e0e277.png",i={title:"About guides",hide_title:!0,sidebar_position:1,tags:["Guides","Help","Fleek Network"]},s=void 0,c={unversionedId:"index",id:"index",title:"About guides",description:"The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.",source:"@site/guides/index.md",sourceDirName:".",slug:"/",permalink:"/guides/",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/index.md",tags:[{label:"Guides",permalink:"/guides/tags/guides"},{label:"Help",permalink:"/guides/tags/help"},{label:"Fleek Network",permalink:"/guides/tags/fleek-network"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",sidebarPosition:1,frontMatter:{title:"About guides",hide_title:!0,sidebar_position:1,tags:["Guides","Help","Fleek Network"]},sidebar:"defaultSidebar",next:{title:"Getting Started",permalink:"/guides/Node Operators/getting-started"}},d={},l=[],u={toc:l},p="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("img",{className:"banner",src:a}),(0,o.kt)("p",null,"The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes."),(0,o.kt)("p",null,"It differs from the ",(0,o.kt)("a",{parentName:"p",href:"/references"},"references")," documentation which serves as a quick direct breakdown of commands and processes without much explanation, as the name implies."),(0,o.kt)("p",null,"To start, find guides by consulting the available categories to locate the content on the sidebar. Our guides are also available as a result when using the search feature located at the very top of the documentation site."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/29b83576.1c09dc14.js b/assets/js/29b83576.1c09dc14.js deleted file mode 100644 index b4a6977bf..000000000 --- a/assets/js/29b83576.1c09dc14.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1510],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),d=a,g=u["".concat(s,".").concat(d)]||u[d]||h[d]||o;return n?r.createElement(g,i(i({ref:t},c),{},{components:n})):r.createElement(g,i({ref:t},c))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(7462),a=(n(7294),n(3905)),o=n(3872);const i={title:"Backing up the keystore",slug:"backing-up-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},l=void 0,s={unversionedId:"Lightning CLI/keystore-backup",id:"Lightning CLI/keystore-backup",title:"Backing up the keystore",description:"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.",source:"@site/references/Lightning CLI/keystore-backup.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/backing-up-the-keystore",permalink:"/references/Lightning CLI/backing-up-the-keystore",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/keystore-backup.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"keystore",permalink:"/references/tags/keystore"},{label:"backup",permalink:"/references/tags/backup"},{label:"restore",permalink:"/references/tags/restore"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Backing up the keystore",slug:"backing-up-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},sidebar:"defaultSidebar",previous:{title:"Keys not found",permalink:"/references/Lightning CLI/keys-not-found"},next:{title:"Node secret key does not exist",permalink:"/references/Lightning CLI/node-secret-key-does-not-exist"}},p={},c=[{value:"Keystore pathname",id:"keystore-pathname",level:2},{value:"Configuration file settings",id:"configuration-file-settings",level:2},{value:"Loading the configuration file on runtime",id:"loading-the-configuration-file-on-runtime",level:2},{value:"Low security backup",id:"low-security-backup",level:2},{value:"Higher security",id:"higher-security",level:2}],u={toc:c},h="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(h,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.")),(0,a.kt)("h2",{id:"keystore-pathname"},"Keystore pathname"),(0,a.kt)("p",null,"The default location for the keystore is in the user home. The $HOME or ",(0,a.kt)("inlineCode",{parentName:"p"},"~")," refers to the user home, as such consider the logged-in username."),(0,a.kt)("p",null,"To Check the user you are logged in with:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"whoami\n")),(0,a.kt)("p",null,"The default location for the keystore is:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"$HOME/.lightning/keystore\n")),(0,a.kt)("h2",{id:"configuration-file-settings"},"Configuration file settings"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"config.toml")," should have some and more of the following properties and values that are used to locate crucial files, such as the consensus and node keys of the keystore."),(0,a.kt)("p",null,"Here's an incomplete example of how the ",(0,a.kt)("inlineCode",{parentName:"p"},"config.toml")," looks like:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'[BLANK]\n...\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n...\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n...\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n...\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n...\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n...\n')),(0,a.kt)("p",null,"If you've followed the installation recommendations, it's very likely that you'll have the username path defined at the base of the pathnames declared in the properties, such as the following except instead of ",(0,a.kt)("inlineCode",{parentName:"p"},"")," you'll have your username:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'[signer]\nconsensus_key_path = "/home//.lightning/keystore/consensus.pem"\nnode_key_path = "/home//.lightning/keystore/node.pem"\n')),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"config.toml")," if loaded on Lightning node process runtime, will pick the desired paths declared in the file."),(0,a.kt)("h2",{id:"loading-the-configuration-file-on-runtime"},"Loading the configuration file on runtime"),(0,a.kt)("p",null,"Use the configuration flag ",(0,a.kt)("inlineCode",{parentName:"p"},"-c")," to pass the configuration ",(0,a.kt)("inlineCode",{parentName:"p"},"config.toml")," path:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn -c /home//.lightning/config.toml run\n")),(0,a.kt)("p",null,"Replace the ",(0,a.kt)("inlineCode",{parentName:"p"},"")," with the correct username, where the config is located."),(0,a.kt)("p",null,"Executing the subcommand ",(0,a.kt)("inlineCode",{parentName:"p"},"run")," without the configuration flag ",(0,a.kt)("inlineCode",{parentName:"p"},"-c"),", doesn't mean that it'll locate the desired ",(0,a.kt)("inlineCode",{parentName:"p"},"config.toml"),", as it'll default to ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/config.toml"),", e.g. if you were logged in with ",(0,a.kt)("strong",{parentName:"p"},"root"),", that'd be ",(0,a.kt)("inlineCode",{parentName:"p"},"/root/.lightning/config.toml"),"."),(0,a.kt)("h2",{id:"low-security-backup"},"Low security backup"),(0,a.kt)("p",null,"To zip and encrypt the ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore")," directory run:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"# It'll prompt for password (remember)\nzip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore\n")),(0,a.kt)("p",null,"To unzip and decrypt the ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore.zip.enc"),", you'd run:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"# It'll prompt for password (recall)\nunzip keystore.zip.enc -d $HOME/.lightning/keystore\n")),(0,a.kt)("h2",{id:"higher-security"},"Higher security"),(0,a.kt)("p",null,"Create a ",(0,a.kt)("inlineCode",{parentName:"p"},"tarbar")," by executing:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'tar -cf "keystore.tar" $HOME/.lightning/keystore\n')),(0,a.kt)("p",null,"The encryption command is:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar\n")),(0,a.kt)("p",null,"To decrypt the ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore.tar.asc")," file, enter:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc\n")),(0,a.kt)("p",null,"Create a temporary directory to extract the tar archive with the original full pathname."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"mkdir $HOME/tar_keystore_extract\n")),(0,a.kt)("p",null,"Now, run the command to extract to the target directory, as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"tar -xf keystore.tar -C $HOME/tar_keystore_extract\n")),(0,a.kt)("p",null,"Locate the extracted files in ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/tar_keystore_extract"),", which should look like ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/tar_keystore/home//.lightning/keystore")),(0,a.kt)("p",null,"For a more in depth or step-by-step instructions read the guide ",(0,a.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"managing the keystore"),"."),(0,a.kt)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}d.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(7294);const a=e=>{let{image:t,name:n,title:a,url:o,communityMember:i=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:o,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:o,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},a),r.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/29b83576.d78afd48.js b/assets/js/29b83576.d78afd48.js new file mode 100644 index 000000000..ff6f8d392 --- /dev/null +++ b/assets/js/29b83576.d78afd48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1510],{7003:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>g,frontMatter:()=>o,metadata:()=>l,toc:()=>h});var r=t(5893),s=t(1151),i=t(3872);const o={title:"Backing up the keystore",slug:"backing-up-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},a=void 0,l={id:"Lightning CLI/keystore-backup",title:"Backing up the keystore",description:"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.",source:"@site/references/Lightning CLI/keystore-backup.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/backing-up-the-keystore",permalink:"/references/Lightning CLI/backing-up-the-keystore",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/keystore-backup.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"keystore",permalink:"/references/tags/keystore"},{label:"backup",permalink:"/references/tags/backup"},{label:"restore",permalink:"/references/tags/restore"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Backing up the keystore",slug:"backing-up-the-keystore",hide_title:!0,tags:["references","help","keystore","backup","restore"]},sidebar:"defaultSidebar",previous:{title:"Keys not found",permalink:"/references/Lightning CLI/keys-not-found"},next:{title:"Node secret key does not exist",permalink:"/references/Lightning CLI/node-secret-key-does-not-exist"}},c={},h=[{value:"Keystore pathname",id:"keystore-pathname",level:2},{value:"Configuration file settings",id:"configuration-file-settings",level:2},{value:"Loading the configuration file on runtime",id:"loading-the-configuration-file-on-runtime",level:2},{value:"Low security backup",id:"low-security-backup",level:2},{value:"Higher security",id:"higher-security",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{type:"caution",children:(0,r.jsx)(n.p,{children:"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only."})}),"\n",(0,r.jsx)(n.h2,{id:"keystore-pathname",children:"Keystore pathname"}),"\n",(0,r.jsxs)(n.p,{children:["The default location for the keystore is in the user home. The $HOME or ",(0,r.jsx)(n.code,{children:"~"})," refers to the user home, as such consider the logged-in username."]}),"\n",(0,r.jsx)(n.p,{children:"To Check the user you are logged in with:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"whoami\n"})}),"\n",(0,r.jsx)(n.p,{children:"The default location for the keystore is:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"$HOME/.lightning/keystore\n"})}),"\n",(0,r.jsx)(n.h2,{id:"configuration-file-settings",children:"Configuration file settings"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"config.toml"})," should have some and more of the following properties and values that are used to locate crucial files, such as the consensus and node keys of the keystore."]}),"\n",(0,r.jsxs)(n.p,{children:["Here's an incomplete example of how the ",(0,r.jsx)(n.code,{children:"config.toml"})," looks like:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:'[BLANK]\n...\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n...\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n...\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n...\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n...\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n...\n'})}),"\n",(0,r.jsxs)(n.p,{children:["If you've followed the installation recommendations, it's very likely that you'll have the username path defined at the base of the pathnames declared in the properties, such as the following except instead of ",(0,r.jsx)(n.code,{children:""})," you'll have your username:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:'[signer]\nconsensus_key_path = "/home//.lightning/keystore/consensus.pem"\nnode_key_path = "/home//.lightning/keystore/node.pem"\n'})}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"config.toml"})," if loaded on Lightning node process runtime, will pick the desired paths declared in the file."]}),"\n",(0,r.jsx)(n.h2,{id:"loading-the-configuration-file-on-runtime",children:"Loading the configuration file on runtime"}),"\n",(0,r.jsxs)(n.p,{children:["Use the configuration flag ",(0,r.jsx)(n.code,{children:"-c"})," to pass the configuration ",(0,r.jsx)(n.code,{children:"config.toml"})," path:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"lgtn -c /home//.lightning/config.toml run\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Replace the ",(0,r.jsx)(n.code,{children:""})," with the correct username, where the config is located."]}),"\n",(0,r.jsxs)(n.p,{children:["Executing the subcommand ",(0,r.jsx)(n.code,{children:"run"})," without the configuration flag ",(0,r.jsx)(n.code,{children:"-c"}),", doesn't mean that it'll locate the desired ",(0,r.jsx)(n.code,{children:"config.toml"}),", as it'll default to ",(0,r.jsx)(n.code,{children:"$HOME/.lightning/config.toml"}),", e.g. if you were logged in with ",(0,r.jsx)(n.strong,{children:"root"}),", that'd be ",(0,r.jsx)(n.code,{children:"/root/.lightning/config.toml"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"low-security-backup",children:"Low security backup"}),"\n",(0,r.jsxs)(n.p,{children:["To zip and encrypt the ",(0,r.jsx)(n.code,{children:"$HOME/.lightning/keystore"})," directory run:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"# It'll prompt for password (remember)\nzip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore\n"})}),"\n",(0,r.jsxs)(n.p,{children:["To unzip and decrypt the ",(0,r.jsx)(n.code,{children:"keystore.zip.enc"}),", you'd run:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"# It'll prompt for password (recall)\nunzip keystore.zip.enc -d $HOME/.lightning/keystore\n"})}),"\n",(0,r.jsx)(n.h2,{id:"higher-security",children:"Higher security"}),"\n",(0,r.jsxs)(n.p,{children:["Create a ",(0,r.jsx)(n.code,{children:"tarbar"})," by executing:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:'tar -cf "keystore.tar" $HOME/.lightning/keystore\n'})}),"\n",(0,r.jsx)(n.p,{children:"The encryption command is:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar\n"})}),"\n",(0,r.jsxs)(n.p,{children:["To decrypt the ",(0,r.jsx)(n.code,{children:"keystore.tar.asc"})," file, enter:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc\n"})}),"\n",(0,r.jsx)(n.p,{children:"Create a temporary directory to extract the tar archive with the original full pathname."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"mkdir $HOME/tar_keystore_extract\n"})}),"\n",(0,r.jsx)(n.p,{children:"Now, run the command to extract to the target directory, as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"tar -xf keystore.tar -C $HOME/tar_keystore_extract\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Locate the extracted files in ",(0,r.jsx)(n.code,{children:"$HOME/tar_keystore_extract"}),", which should look like ",(0,r.jsx)(n.code,{children:"$HOME/tar_keystore/home//.lightning/keystore"})]}),"\n",(0,r.jsxs)(n.p,{children:["For a more in depth or step-by-step instructions read the guide ",(0,r.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"managing the keystore"}),"."]}),"\n",(0,r.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function g(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>s});t(7294);var r=t(5893);const s=e=>{let{image:n,name:t,title:s,url:i,communityMember:o=!1}=e;return(0,r.jsx)("section",{className:"author_card",children:(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"avatar",children:(0,r.jsx)("a",{href:i,target:"_blank",alt:t,children:(0,r.jsx)("img",{src:n,alt:t})})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"name",children:(0,r.jsx)("a",{href:i,target:"_blank",alt:t,children:t})}),(0,r.jsx)("span",{className:"title",children:s}),(0,r.jsxs)("span",{className:"discord",children:[o?"Join our community on":"Got questions? Find us on"," ",(0,r.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var r=t(7294);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a6b0b88.dfc48d4a.js b/assets/js/2a6b0b88.01c63236.js similarity index 94% rename from assets/js/2a6b0b88.dfc48d4a.js rename to assets/js/2a6b0b88.01c63236.js index 0c52b4e77..2dc33c793 100644 --- a/assets/js/2a6b0b88.dfc48d4a.js +++ b/assets/js/2a6b0b88.01c63236.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6446],{8424:e=>{e.exports=JSON.parse('{"label":"commands","permalink":"/references/tags/commands","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","permalink":"/references/Lightning CLI/frequently-used-commands-for-native-setup"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6446],{8424:e=>{e.exports=JSON.parse('{"label":"commands","permalink":"/references/tags/commands","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","permalink":"/references/Lightning CLI/frequently-used-commands-for-native-setup"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/2adfdcac.a382b418.js b/assets/js/2adfdcac.3c37a29a.js similarity index 91% rename from assets/js/2adfdcac.a382b418.js rename to assets/js/2adfdcac.3c37a29a.js index d70d0dbe1..33dd60cba 100644 --- a/assets/js/2adfdcac.a382b418.js +++ b/assets/js/2adfdcac.3c37a29a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3189],{4723:e=>{e.exports=JSON.parse('{"label":"token","permalink":"/docs/tags/token","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3189],{4723:e=>{e.exports=JSON.parse('{"label":"token","permalink":"/docs/tags/token","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/2baa5a9a.4b0721ba.js b/assets/js/2baa5a9a.f25a88f1.js similarity index 94% rename from assets/js/2baa5a9a.4b0721ba.js rename to assets/js/2baa5a9a.f25a88f1.js index 9fec7f113..8109e83b9 100644 --- a/assets/js/2baa5a9a.4b0721ba.js +++ b/assets/js/2baa5a9a.f25a88f1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9021],{8704:e=>{e.exports=JSON.parse('{"label":"configuration","permalink":"/guides/tags/configuration","allTagsPath":"/guides/tags","count":2,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"},{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9021],{8704:e=>{e.exports=JSON.parse('{"label":"configuration","permalink":"/guides/tags/configuration","allTagsPath":"/guides/tags","count":2,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"},{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/2ddc9f52.80c52109.js b/assets/js/2ddc9f52.1d8c6c02.js similarity index 91% rename from assets/js/2ddc9f52.80c52109.js rename to assets/js/2ddc9f52.1d8c6c02.js index e26baaa03..a5129d5de 100644 --- a/assets/js/2ddc9f52.80c52109.js +++ b/assets/js/2ddc9f52.1d8c6c02.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7400],{5048:e=>{e.exports=JSON.parse('{"label":"build","permalink":"/references/tags/build","allTagsPath":"/references/tags","count":1,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7400],{5048:e=>{e.exports=JSON.parse('{"label":"build","permalink":"/references/tags/build","allTagsPath":"/references/tags","count":1,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/2e0a4d25.00fdda3c.js b/assets/js/2e0a4d25.b54bdd52.js similarity index 95% rename from assets/js/2e0a4d25.00fdda3c.js rename to assets/js/2e0a4d25.b54bdd52.js index ea910a863..e28f1cae6 100644 --- a/assets/js/2e0a4d25.00fdda3c.js +++ b/assets/js/2e0a4d25.b54bdd52.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8132],{9073:e=>{e.exports=JSON.parse('{"label":"systemctl","permalink":"/references/tags/systemctl","allTagsPath":"/references/tags","count":3,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8132],{9073:e=>{e.exports=JSON.parse('{"label":"systemctl","permalink":"/references/tags/systemctl","allTagsPath":"/references/tags","count":3,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3290fbc2.83ee952a.js b/assets/js/3290fbc2.83ee952a.js deleted file mode 100644 index 8507414fe..000000000 --- a/assets/js/3290fbc2.83ee952a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2235],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var a=n.createContext({}),p=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(a.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,c=e.originalType,a=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),s=p(r),d=o,y=s["".concat(a,".").concat(d)]||s[d]||f[d]||c;return r?n.createElement(y,l(l({ref:t},u),{},{components:r})):n.createElement(y,l({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var c=r.length,l=new Array(c);l[0]=d;var i={};for(var a in t)hasOwnProperty.call(t,a)&&(i[a]=t[a]);i.originalType=e,i[s]="string"==typeof e?e:o,l[1]=i;for(var p=2;p{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>f,frontMatter:()=>c,metadata:()=>i,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const c={title:"Client",slug:"client",hide_title:!0,tags:["client"]},l=void 0,i={unversionedId:"develop/client",id:"develop/client",title:"Client",description:"",source:"@site/docs/develop/client.md",sourceDirName:"develop",slug:"/develop/client",permalink:"/docs/develop/client",draft:!1,tags:[{label:"client",permalink:"/docs/tags/client"}],version:"current",frontMatter:{title:"Client",slug:"client",hide_title:!0,tags:["client"]}},a={},p=[],u={toc:p},s="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3290fbc2.dd92ec9c.js b/assets/js/3290fbc2.dd92ec9c.js new file mode 100644 index 000000000..f3429eafe --- /dev/null +++ b/assets/js/3290fbc2.dd92ec9c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2235],{6924:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>a});var o=n(5893),c=n(1151);const i={title:"Client",slug:"client",hide_title:!0,tags:["client"]},l=void 0,s={id:"develop/client",title:"Client",description:"",source:"@site/docs/develop/client.md",sourceDirName:"develop",slug:"/develop/client",permalink:"/docs/develop/client",draft:!1,unlisted:!1,tags:[{label:"client",permalink:"/docs/tags/client"}],version:"current",frontMatter:{title:"Client",slug:"client",hide_title:!0,tags:["client"]}},r={},a=[];function u(e){return(0,o.jsx)(o.Fragment,{})}function d(e={}){const{wrapper:t}={...(0,c.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u()}},1151:(e,t,n)=>{n.d(t,{Z:()=>s,a:()=>l});var o=n(7294);const c={},i=o.createContext(c);function l(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:l(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/35230925.29f648b5.js b/assets/js/35230925.29f648b5.js deleted file mode 100644 index eab1142f7..000000000 --- a/assets/js/35230925.29f648b5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5602],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},c="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=p(r),f=o,m=c["".concat(s,".").concat(f)]||c[f]||u[f]||a;return r?n.createElement(m,i(i({ref:t},d),{},{components:r})):n.createElement(m,i({ref:t},d))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:o,i[1]=l;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const a={draft:!1,title:"Developers",sidebarCollapsible:!1,date:new Date("2023-01-10T09:00:00.000Z"),description:"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","Fleek Network"]},i=void 0,l={unversionedId:"learn/developers",id:"learn/developers",title:"Developers",description:"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.",source:"@site/docs/learn/developers.md",sourceDirName:"learn",slug:"/learn/developers",permalink:"/docs/learn/developers",draft:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Learn",permalink:"/docs/tags/learn"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"}],version:"current",frontMatter:{draft:!1,title:"Developers",sidebarCollapsible:!1,date:"2023-01-10T09:00:00.000Z",description:"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","Fleek Network"]},sidebar:"docs",previous:{title:"Services",permalink:"/docs/learn/services"},next:{title:"Overview",permalink:"/docs/node/overview"}},s={},p=[{value:"Developer in Fleek Network - Current State",id:"developer-in-fleek-network---current-state",level:2},{value:"How can you Start Getting Involved Today?",id:"how-can-you-start-getting-involved-today",level:2}],d={toc:p},c="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(c,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"This documentation is currently placeholder as the team prepares for an early testnet release around the month of August, where full documentation for node runners and services will release.")),(0,o.kt)("h2",{id:"developer-in-fleek-network---current-state"},"Developer in Fleek Network - Current State"),(0,o.kt)("p",null,"As a developer, you will be able to build or use services running on Fleek Network's decentralized edge infrastructure."),(0,o.kt)("p",null,"This will be possible ",(0,o.kt)("strong",{parentName:"p"},"after our initial Testnet rollouts in August, and after we publish our Service Development Kit (SDK) for service development"),". Currently, we are finalizing the core developments of the protocol and setting the foundations for the testnet release."),(0,o.kt)("h2",{id:"how-can-you-start-getting-involved-today"},"How can you Start Getting Involved Today?"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Get familiar with the project ",(0,o.kt)("a",{parentName:"li",href:"https://whitepaper.fleek.network"},"with our Whitepaper"),"."),(0,o.kt)("li",{parentName:"ol"},"Review our open-source ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/"},"codebase on Github"),"."),(0,o.kt)("li",{parentName:"ol"},"Learn about ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn/services"},"services in Fleek Network.")),(0,o.kt)("li",{parentName:"ol"},"Want to run a node? Join our community ",(0,o.kt)("a",{parentName:"li",href:"https://discord.gg/fleekxyz"},"in Discord to get updates when possible"),"."),(0,o.kt)("li",{parentName:"ol"},"Or sign up to the newsletter on ",(0,o.kt)("a",{parentName:"li",href:"https://fleek.network/"},"our website")," for updates.")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/35230925.dcdddd7b.js b/assets/js/35230925.dcdddd7b.js new file mode 100644 index 000000000..b771d5e51 --- /dev/null +++ b/assets/js/35230925.dcdddd7b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5602],{8139:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var r=n(5893),o=n(1151);const i={draft:!1,title:"Developers",sidebarCollapsible:!1,date:new Date("2023-01-10T09:00:00.000Z"),description:"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","Fleek Network"]},s=void 0,a={id:"learn/developers",title:"Developers",description:"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.",source:"@site/docs/learn/developers.md",sourceDirName:"learn",slug:"/learn/developers",permalink:"/docs/learn/developers",draft:!1,unlisted:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Learn",permalink:"/docs/tags/learn"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"}],version:"current",frontMatter:{draft:!1,title:"Developers",sidebarCollapsible:!1,date:"2023-01-10T09:00:00.000Z",description:"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","Fleek Network"]},sidebar:"docs",previous:{title:"Services",permalink:"/docs/learn/services"},next:{title:"Overview",permalink:"/docs/node/overview"}},l={},d=[{value:"Developer in Fleek Network - Current State",id:"developer-in-fleek-network---current-state",level:2},{value:"How can you Start Getting Involved Today?",id:"how-can-you-start-getting-involved-today",level:2}];function c(e){const t={a:"a",admonition:"admonition",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.admonition,{type:"info",children:(0,r.jsx)(t.p,{children:"This documentation is currently placeholder as the team prepares for an early testnet release around the month of August, where full documentation for node runners and services will release."})}),"\n",(0,r.jsx)(t.h2,{id:"developer-in-fleek-network---current-state",children:"Developer in Fleek Network - Current State"}),"\n",(0,r.jsx)(t.p,{children:"As a developer, you will be able to build or use services running on Fleek Network's decentralized edge infrastructure."}),"\n",(0,r.jsxs)(t.p,{children:["This will be possible ",(0,r.jsx)(t.strong,{children:"after our initial Testnet rollouts in August, and after we publish our Service Development Kit (SDK) for service development"}),". Currently, we are finalizing the core developments of the protocol and setting the foundations for the testnet release."]}),"\n",(0,r.jsx)(t.h2,{id:"how-can-you-start-getting-involved-today",children:"How can you Start Getting Involved Today?"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Get familiar with the project ",(0,r.jsx)(t.a,{href:"https://whitepaper.fleek.network",children:"with our Whitepaper"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Review our open-source ",(0,r.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/",children:"codebase on Github"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Learn about ",(0,r.jsx)(t.a,{href:"/docs/learn/services",children:"services in Fleek Network."})]}),"\n",(0,r.jsxs)(t.li,{children:["Want to run a node? Join our community ",(0,r.jsx)(t.a,{href:"https://discord.gg/fleekxyz",children:"in Discord to get updates when possible"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Or sign up to the newsletter on ",(0,r.jsx)(t.a,{href:"https://fleek.network/",children:"our website"})," for updates."]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>s});var r=n(7294);const o={},i=r.createContext(o);function s(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/35a7e2bf.e661e27e.js b/assets/js/35a7e2bf.71209370.js similarity index 71% rename from assets/js/35a7e2bf.e661e27e.js rename to assets/js/35a7e2bf.71209370.js index 624347a4c..a0b0e888a 100644 --- a/assets/js/35a7e2bf.e661e27e.js +++ b/assets/js/35a7e2bf.71209370.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4508],{8581:o=>{o.exports=JSON.parse('{"label":"contribute","permalink":"/docs/tags/contribute","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"},{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4508],{8581:t=>{t.exports=JSON.parse('{"label":"contribute","permalink":"/docs/tags/contribute","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"},{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3720c009.30b055b5.js b/assets/js/3720c009.30b055b5.js new file mode 100644 index 000000000..3ddc58fa8 --- /dev/null +++ b/assets/js/3720c009.30b055b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3751],{727:(t,e,a)=>{a.r(e),a.d(e,{default:()=>h});a(7294);var s=a(4334),r=a(833),l=a(5281),n=a(5155),c=a(6090),i=a(197),o=a(2503),g=a(5893);function u(t){let{title:e}=t;return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(r.d,{title:e}),(0,g.jsx)(i.Z,{tag:"doc_tags_list"})]})}function d(t){let{tags:e,title:a}=t;return(0,g.jsx)(r.FG,{className:(0,s.Z)(l.k.page.docsTagsListPage),children:(0,g.jsx)("div",{className:"container margin-vert--lg",children:(0,g.jsx)("div",{className:"row",children:(0,g.jsxs)("main",{className:"col col--8 col--offset-2",children:[(0,g.jsx)(o.Z,{as:"h1",children:a}),(0,g.jsx)(c.Z,{tags:e})]})})})})}function h(t){const e=(0,n.M)();return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(u,{...t,title:e}),(0,g.jsx)(d,{...t,title:e})]})}},3008:(t,e,a)=>{a.d(e,{Z:()=>c});a(7294);var s=a(4334),r=a(9960);const l={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var n=a(5893);function c(t){let{permalink:e,label:a,count:c}=t;return(0,n.jsxs)(r.Z,{href:e,className:(0,s.Z)(l.tag,c?l.tagWithCount:l.tagRegular),children:[a,c&&(0,n.jsx)("span",{children:c})]})}},6090:(t,e,a)=>{a.d(e,{Z:()=>o});a(7294);var s=a(5155),r=a(3008),l=a(2503);const n={tag:"tag_Nnez"};var c=a(5893);function i(t){let{letterEntry:e}=t;return(0,c.jsxs)("article",{children:[(0,c.jsx)(l.Z,{as:"h2",id:e.letter,children:e.letter}),(0,c.jsx)("ul",{className:"padding--none",children:e.tags.map((t=>(0,c.jsx)("li",{className:n.tag,children:(0,c.jsx)(r.Z,{...t})},t.permalink)))}),(0,c.jsx)("hr",{})]})}function o(t){let{tags:e}=t;const a=(0,s.P)(e);return(0,c.jsx)("section",{className:"margin-vert--lg",children:a.map((t=>(0,c.jsx)(i,{letterEntry:t},t.letter)))})}},5155:(t,e,a)=>{a.d(e,{M:()=>r,P:()=>l});var s=a(5999);const r=()=>(0,s.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function l(t){const e={};return Object.values(t).forEach((t=>{const a=function(t){return t[0].toUpperCase()}(t.label);e[a]??=[],e[a].push(t)})),Object.entries(e).sort(((t,e)=>{let[a]=t,[s]=e;return a.localeCompare(s)})).map((t=>{let[e,a]=t;return{letter:e,tags:a.sort(((t,e)=>t.label.localeCompare(e.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/3720c009.a4574b8c.js b/assets/js/3720c009.a4574b8c.js deleted file mode 100644 index 00e603543..000000000 --- a/assets/js/3720c009.a4574b8c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3751],{727:(e,t,a)=>{a.r(t),a.d(t,{default:()=>u});var l=a(7294),n=a(6010),r=a(5155),c=a(833),s=a(5281),m=a(8888),o=a(6090),g=a(197);function u(e){let{tags:t}=e;const a=(0,r.M)();return l.createElement(c.FG,{className:(0,n.Z)(s.k.wrapper.docsPages,s.k.page.docsTagsListPage)},l.createElement(c.d,{title:a}),l.createElement(g.Z,{tag:"doc_tags_list"}),l.createElement(m.Z,null,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement("main",{className:"col col--8 col--offset-2"},l.createElement("h1",null,a),l.createElement(o.Z,{tags:t}))))))}},3008:(e,t,a)=>{a.d(t,{Z:()=>s});var l=a(7294),n=a(6010),r=a(9960);const c={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function s(e){let{permalink:t,label:a,count:s}=e;return l.createElement(r.Z,{href:t,className:(0,n.Z)(c.tag,s?c.tagWithCount:c.tagRegular)},a,s&&l.createElement("span",null,s))}},6090:(e,t,a)=>{a.d(t,{Z:()=>m});var l=a(7294),n=a(5155),r=a(3008);const c={tag:"tag_Nnez"};function s(e){let{letterEntry:t}=e;return l.createElement("article",null,l.createElement("h2",null,t.letter),l.createElement("ul",{className:"padding--none"},t.tags.map((e=>l.createElement("li",{key:e.permalink,className:c.tag},l.createElement(r.Z,e))))),l.createElement("hr",null))}function m(e){let{tags:t}=e;const a=(0,n.P)(t);return l.createElement("section",{className:"margin-vert--lg"},a.map((e=>l.createElement(s,{key:e.letter,letterEntry:e}))))}},5155:(e,t,a)=>{a.d(t,{M:()=>n,P:()=>r});var l=a(5999);const n=()=>(0,l.I)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort(((e,t)=>{let[a]=e,[l]=t;return a.localeCompare(l)})).map((e=>{let[t,a]=e;return{letter:t,tags:a.sort(((e,t)=>e.label.localeCompare(t.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/39574d2e.a089ce5c.js b/assets/js/39574d2e.d1d6cecf.js similarity index 94% rename from assets/js/39574d2e.a089ce5c.js rename to assets/js/39574d2e.d1d6cecf.js index 837bb1749..3767cf19b 100644 --- a/assets/js/39574d2e.a089ce5c.js +++ b/assets/js/39574d2e.d1d6cecf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8747],{8270:e=>{e.exports=JSON.parse('{"label":"decentralization","permalink":"/docs/tags/decentralization","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8747],{8270:e=>{e.exports=JSON.parse('{"label":"decentralization","permalink":"/docs/tags/decentralization","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/399f21a8.90418f6a.js b/assets/js/399f21a8.420d866d.js similarity index 85% rename from assets/js/399f21a8.90418f6a.js rename to assets/js/399f21a8.420d866d.js index e5231d2f6..60786fab2 100644 --- a/assets/js/399f21a8.90418f6a.js +++ b/assets/js/399f21a8.420d866d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2214],{2281:e=>{e.exports=JSON.parse('{"label":"rpc","permalink":"/docs/tags/rpc","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2214],{2281:e=>{e.exports=JSON.parse('{"label":"rpc","permalink":"/docs/tags/rpc","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/39e94577.fb5615ec.js b/assets/js/39e94577.85f019bf.js similarity index 85% rename from assets/js/39e94577.fb5615ec.js rename to assets/js/39e94577.85f019bf.js index 1e9b3d48f..7f68d0a65 100644 --- a/assets/js/39e94577.fb5615ec.js +++ b/assets/js/39e94577.85f019bf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1563],{3199:e=>{e.exports=JSON.parse('{"label":"build","permalink":"/docs/tags/build","allTagsPath":"/docs/tags","count":2,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"node/index","title":"Overview","description":"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network\'s growth.","permalink":"/docs/node/overview"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1563],{3199:e=>{e.exports=JSON.parse('{"label":"build","permalink":"/docs/tags/build","allTagsPath":"/docs/tags","count":2,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"node/index","title":"Overview","description":"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network\'s growth.","permalink":"/docs/node/overview"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3a6297ac.b4ac4739.js b/assets/js/3a6297ac.348b248b.js similarity index 87% rename from assets/js/3a6297ac.b4ac4739.js rename to assets/js/3a6297ac.348b248b.js index 4fdf25e7b..2ab32ff7d 100644 --- a/assets/js/3a6297ac.b4ac4739.js +++ b/assets/js/3a6297ac.348b248b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[11],{2511:e=>{e.exports=JSON.parse('{"label":"sdk","permalink":"/docs/tags/sdk","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[11],{2511:e=>{e.exports=JSON.parse('{"label":"sdk","permalink":"/docs/tags/sdk","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3b168dbd.cd5b76ca.js b/assets/js/3b168dbd.d8580674.js similarity index 83% rename from assets/js/3b168dbd.cd5b76ca.js rename to assets/js/3b168dbd.d8580674.js index 5c6541f3d..ab674031f 100644 --- a/assets/js/3b168dbd.cd5b76ca.js +++ b/assets/js/3b168dbd.d8580674.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[469],{2832:t=>{t.exports=JSON.parse('{"label":"Edge computing","permalink":"/guides/tags/edge-computing","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","permalink":"/guides/Node Operators/getting-started"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[469],{2832:t=>{t.exports=JSON.parse('{"label":"Edge computing","permalink":"/guides/tags/edge-computing","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","permalink":"/guides/Node Operators/getting-started"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3f0cec70.f407843f.js b/assets/js/3f0cec70.f7c10106.js similarity index 83% rename from assets/js/3f0cec70.f407843f.js rename to assets/js/3f0cec70.f7c10106.js index 2c9d979a2..c63cf07c7 100644 --- a/assets/js/3f0cec70.f407843f.js +++ b/assets/js/3f0cec70.f7c10106.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9336],{4776:e=>{e.exports=JSON.parse('{"label":"Help","permalink":"/guides/tags/help","allTagsPath":"/guides/tags","count":1,"items":[{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","permalink":"/guides/"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9336],{4776:e=>{e.exports=JSON.parse('{"label":"Help","permalink":"/guides/tags/help","allTagsPath":"/guides/tags","count":1,"items":[{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","permalink":"/guides/"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/3f90f51b.2d2941a9.js b/assets/js/3f90f51b.2d2941a9.js deleted file mode 100644 index 1985a5556..000000000 --- a/assets/js/3f90f51b.2d2941a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6669],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=a.createContext({}),l=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=l(e.components);return a.createElement(c.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,c=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=l(n),h=i,m=p["".concat(c,".").concat(h)]||p[h]||u[h]||r;return n?a.createElement(m,o(o({ref:t},d),{},{components:n})):a.createElement(m,o({ref:t},d))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=h;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[p]="string"==typeof e?e:i,o[1]=s;for(var l=2;l{n.d(t,{Z:()=>i});var a=n(7294);const i=e=>{let{image:t,name:n,title:i,url:r,communityMember:o=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:r,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:r,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},i),a.createElement("span",{className:"discord"},o?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},3726:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var a=n(7462),i=(n(7294),n(3905)),r=n(3872);const o={draft:!1,title:"Services",hide_title:!0,sidebarCollapsible:!1,date:new Date("2023-01-10T09:00:00.000Z"),description:"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","services","develop","sdk","toolkit"]},s=void 0,c={unversionedId:"learn/services",id:"learn/services",title:"Services",description:"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.",source:"@site/docs/learn/services.md",sourceDirName:"learn",slug:"/learn/services",permalink:"/docs/learn/services",draft:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Learn",permalink:"/docs/tags/learn"},{label:"services",permalink:"/docs/tags/services"},{label:"develop",permalink:"/docs/tags/develop"},{label:"sdk",permalink:"/docs/tags/sdk"},{label:"toolkit",permalink:"/docs/tags/toolkit"}],version:"current",frontMatter:{draft:!1,title:"Services",hide_title:!0,sidebarCollapsible:!1,date:"2023-01-10T09:00:00.000Z",description:"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","services","develop","sdk","toolkit"]},sidebar:"docs",previous:{title:"Token and economics",permalink:"/docs/learn/token-and-economics"},next:{title:"Developers",permalink:"/docs/learn/developers"}},l={},d=[{value:"Overview",id:"overview",level:2},{value:"Service Development Toolkit (SDK)",id:"service-development-toolkit-sdk",level:2},{value:"Handshake",id:"handshake",level:2},{value:"Service geographic distribution",id:"service-geographic-distribution",level:2},{value:"Resources as commodities",id:"resources-as-commodities",level:2},{value:"Use-cases",id:"use-cases",level:2},{value:"Traditional Services",id:"traditional-services",level:3},{value:"Edge Functions",id:"edge-functions",level:4},{value:"SSR/ISR",id:"ssrisr",level:4},{value:"Hosting",id:"hosting",level:4},{value:"CDN",id:"cdn",level:4},{value:"Container Orchestration",id:"container-orchestration",level:4},{value:"CRDT Databases",id:"crdt-databases",level:4},{value:"Web3 Services",id:"web3-services",level:3},{value:"Blockchain Snapshots",id:"blockchain-snapshots",level:4},{value:"Decentralized IPFS Pinning",id:"decentralized-ipfs-pinning",level:4},{value:"VM's (EVM, zkVM's, etc.)",id:"vms-evm-zkvms-etc",level:4},{value:"Ephemeral Rollups",id:"ephemeral-rollups",level:4},{value:"Proof Generation",id:"proof-generation",level:4},{value:"Alternative Sequencers",id:"alternative-sequencers",level:4}],p={toc:d},u="wrapper";function h(e){let{components:t,...n}=e;return(0,i.kt)(u,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"overview"},"Overview"),(0,i.kt)("p",null,"A Fleek Network Service is a modular application that runs on nodes and allows users to perform well-defined functions or some specific tasks. Services are scalable and performant due to edge computation and networking features provided by the core principles of the network."),(0,i.kt)("p",null,"As a permissionless system, services are built by developers who are free to build and deploy them to run on the decentralized edge platform. Applications can be of any kind but are generally described as web services. These are cryptographically secure and run within a fair economically incentivized model. The services are hosted in user-managed resources and are highly available to customers and end-users in exchange for rewards."),(0,i.kt)("p",null,"A Service Development Toolkit (SDK) facilitates access to core APIs and resources for developers. Services run in a sandboxed environment (unable to access the host's processes, hardware and kernel directly) and are restricted to specific features such as cryptography, networking and storage. The service implementation source code is fully managed by the author(s), owner(s) and development team(s)."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"At an early stage, core services are statically linked to the node's binary process (Lightning). In the future, the Fleek Network protocol aims to load services dynamically.")),(0,i.kt)("h2",{id:"service-development-toolkit-sdk"},"Service Development Toolkit (SDK)"),(0,i.kt)("p",null,"The Service Development Toolkit (SDK) abstracts the core protocol features, including the communication with the middleware which is done through an Inter-Process Communication (IPC) system. Any system-level programming language, such as C/C++, Go or Rust can establish a communication channel with the middleware. By using the toolkit, a Service builder accelerates the development process e.g. effectively enables nodes to generate Delivery Acknowledgements (SNARKs) that prove work completion which is used to determine rewards, along with other cryptographic commitments."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"As discussed in ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn/the-network"},"The Network")," section, ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn/the-network#delivery-acknowledgements-snarks"},"Delivery Acknowledgements")," include metadata about the commodities consumed by a node while executing or running a service. It also contains cryptographically secured metadata that are tamper-proof and used to determine the reward attributed to a node.")),(0,i.kt)("p",null,"A commitment ensures clients receive the correct work output that is being requested, such as content, a computed response, etc. In addition to preventing malicious services from coercing a node into making false commitments. Likewise, the commitments generated by a node determine the bandwidth and computation served, amongst other commodities."),(0,i.kt)("h2",{id:"handshake"},"Handshake"),(0,i.kt)("p",null,"The Handshake component is the entry point to external communications with a node. It enables clients to establish an encrypted communication session with the node and interact with services over a secure transport layer (TLS+TCP or QUIC). On establishing a client and node connection, public keys are exchanged and a lane is negotiated for the session. A Handshake is required for a client to access and interact with a service."),(0,i.kt)("h2",{id:"service-geographic-distribution"},"Service geographic distribution"),(0,i.kt)("p",null,"The network takes care of infrastructure coverage, scalability, and incentivizing edge nodes to run services. It employs a range of algorithms to assign edge nodes in each geographic region to handle the work for each service, guaranteeing the most efficient route. Additionally, when a service experiences a surge in demand and scales up, any unused services are automatically downscaled. By dynamically allocating resources, it eliminates unnecessary resource usage and allows efficient garbage collection. All of this is achieved while maintaining optimal levels of trust, security, infrastructure coverage, and performance guarantees."),(0,i.kt)("h2",{id:"resources-as-commodities"},"Resources as commodities"),(0,i.kt)("p",null,"The hardware resources used by a service are packaged and measured as commodities. Includes things like bandwidth and CPU, along with their respective commodities such as GB(s) and CPU cycles. ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn/the-network#delivery-acknowledgements-snarks"},"Delivery Acknowledgements")," detail the commodities used by a node during service execution. The data is used to reward the node based on the current pricing of those commodities set by the network governance."),(0,i.kt)("h2",{id:"use-cases"},"Use-cases"),(0,i.kt)("p",null,"Building on Fleek Network's Decentralized Edge Infrastructure unlocks various opportunities and advantages for Service builders, that empower them to implement most of the following concepts."),(0,i.kt)("h3",{id:"traditional-services"},"Traditional Services"),(0,i.kt)("h4",{id:"edge-functions"},"Edge Functions"),(0,i.kt)("p",null,"Edge computing comes in many flavors, and Fleek Network can support many serverless or edge computing functions. For example, low-cost computation for JavaScript functions, Lambda, runtimes or Cloudflare Workers-like computing. Can also perform deterministic computation, consensus-based computation, ZK-computation, and EVM computation. The network is non-opinionated and enables developers to refine their computing service in great detail."),(0,i.kt)("h4",{id:"ssrisr"},"SSR/ISR"),(0,i.kt)("p",null,"One applied edge compute use-case that can be built is Server-side Rendering (SSR) or Incremental Static Regeneration Service (ISR) on top of a container/serverless engine. Given the granularity of content verification within the core's hashing, streaming of particular pieces of data can be optimized and parallelized across multiple nodes. Such as chunking pages of static sites and regenerating only where needed."),(0,i.kt)("h4",{id:"hosting"},"Hosting"),(0,i.kt)("p",null,"Web3 apps are generally composed of a backend and a frontend stack. The backends are considerably decentralized but often have the client-side facing interface hosted into a central cloud provider. Given the desirability of content delivery acceleration services for a snappy user experience, that end customers demand. The Fleek Network takes a big step forward on this topic, as services can leverage the block store and content addressability (IPFS) for an application host provider."),(0,i.kt)("p",null,"As we have today with user stories like S3 or Netlify, a service can use Fleek Network as a storage layer for static sites. Similarly, a CDN or SSR can complement static site hosting by accelerating and dynamically computing user needs. In consequence, the reward mechanism would distribute rewards fairly to every actor in the computation and fulfillment of paying customers for these requests, e.g. service builder, node operator, etc."),(0,i.kt)("h4",{id:"cdn"},"CDN"),(0,i.kt)("p",null,"A decentralized CDN is a big missing piece in the Web3 infra stack. Every protocol, middleware, service, and app can benefit from content acceleration. Today most projects use popular CDNs in front of their stacks for optimization and performance improvement e.g. availability and latency. A decentralized CDN built on Fleek Network can gain great notoriety in the blockchain and Web3 development communities, due to its benefits and principles, without sacrificing performance and cost of integration."),(0,i.kt)("p",null,"The dCDN service can cache content based on the user request and popularity, and put it in the speediest location based on the network reputation system, computation and routing response timings. Conceptually similar to a traditional CDN, but abstracting the geo-location that is usually specified by user-selected zones."),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"While the network does not possess a specific concept of geography, it gains an implicit understanding of geographical proximity through the data it collects on latency and hop counts between nodes, which is a part of the reputation system.")),(0,i.kt)("p",null,"Learn more about how Fleek Network behaves by reading the ",(0,i.kt)("a",{parentName:"p",href:"/docs/whitepaper"},"whitepaper"),"."),(0,i.kt)("h4",{id:"container-orchestration"},"Container Orchestration"),(0,i.kt)("p",null,"A decentralized orchestration service built on a content-addressable edge network can bring benefits in performance and delivery. A service could utilize the native content-addressing and Blake3 hashing and verified data streaming to partition large container image files and serve them at scale in a multi-region environment."),(0,i.kt)("p",null,"Fleek Network can act as a p2p CDN, serving container chunks in a parallelized, verified, and performant way\u2013without sacrificing decentralization. Similar to concepts that can be found in Docker image hosting, Docker Swarm clustering, etc."),(0,i.kt)("h4",{id:"crdt-databases"},"CRDT Databases"),(0,i.kt)("p",null,"Database services in a decentralized edge platform with a content addressable core can benefit from the network's data deduplication and integrity characteristics."),(0,i.kt)("p",null,"Particularly a CRDT database service could be built to converge data from multiple edge locations replicas. Given all data is content-addressed, unique content hashes allow for easy differentiation and verification as the data is replicated."),(0,i.kt)("h3",{id:"web3-services"},"Web3 Services"),(0,i.kt)("h4",{id:"blockchain-snapshots"},"Blockchain Snapshots"),(0,i.kt)("p",null,"Interchain synchronization of a full-node history is CPU-intensive. Can take hours, days or weeks depending on blockchain technology. On Fleek Network's core, the internal blockchain is based on content addressability which stores snapshots of the state HEAD. It utilizes decentralized content acceleration for node entire-state synchronization for higher speed."),(0,i.kt)("p",null,"A service can be built that does a similar process for any chain. By automating snapshot storage timely and in-synchronization to the chain HEAD. It can deliver an entire state to a node rapidly."),(0,i.kt)("h4",{id:"decentralized-ipfs-pinning"},"Decentralized IPFS Pinning"),(0,i.kt)("p",null,"All content on the Fleek Network is content addressed and referred to by the CID, which mapping of the CID to the origin is stored in perpetuity. Coupled with the built-in file system interlinked to decentralized storage protocols such as Arweave and Filecoin, an IPFS pinning service can be built. A pinning service for IPFS that provides the user experience we are accustomed to, but using decentralized infrastructure, which today's IPFS pinning services fail to offer."),(0,i.kt)("p",null,"Worth mentioning that an IPFS pinning service as such, would be cheaper and provide better availability, performance and security guarantees. For example, as the network stores the CID-to-origin mapping in perpetuity, even if an IPFS file is lost it can be easily retrieved if there's at least one origin."),(0,i.kt)("h4",{id:"vms-evm-zkvms-etc"},"VM's (EVM, zkVM's, etc.)"),(0,i.kt)("p",null,"A service that deploys a virtual machine, such as many zk-VMs, or the EVM can be built and deployed to Fleek Network. It can provide compute in the zk-VM and provide the zk-SNARK from the node, proving the correctness of the response. In addition, the network routing can ensure that the zk-VM computation is happening in the closest proximity to the client based on latency and other network factors."),(0,i.kt)("h4",{id:"ephemeral-rollups"},"Ephemeral Rollups"),(0,i.kt)("p",null,"The Fleek Network can be utilized as a short-term service platform for a variety of applications or side-chaining that compute state and roll it up to a smart contract. An NFT minting or game event that occurs during a short period, can roll up state to a smart contract after the event time elapses."),(0,i.kt)("p",null,"To help users mitigate gas costs and feeds while providing instant finality throughout an event. Consequently, roll-ups would run on a decentralized network, that is fault-resistant and highly performant."),(0,i.kt)("h4",{id:"proof-generation"},"Proof Generation"),(0,i.kt)("p",null,"As a result of the rise of Zero-Knowledge proofs (SNARKs, STARKs) for performance and cost-efficient proof generation, there are benefits for computing them closer to end-users and in a decentralized manner which Fleek Network Edge Network entails."),(0,i.kt)("p",null,"For example, a hypothetical ",(0,i.kt)("a",{parentName:"p",href:"https://eprint.iacr.org/2016/260.pdf"},"Groth16")," service can read parameters from configuration files in a file system and generate a proof based on public user custom parameters."),(0,i.kt)("h4",{id:"alternative-sequencers"},"Alternative Sequencers"),(0,i.kt)("p",null,"As encountered by most sequencers that post transactions to Layer-1 settlement contracts (which are mostly done over centralized processes), Layer-2 networks bypass these by posting them manually.\nThis causes long finalization times and a reduction in block speeds on Layer-1, which is contrary to what users are familiar with and find ordinary on Layer-2."),(0,i.kt)("p",null,"In Fleek Network, a service builder can offer an alternative to a Layer-2 sequencer, that is decentralized and more reliable by batching and posting to Layer-1 settlement contracts. With equivalent Layer-2 settlement times."),(0,i.kt)("p",null,"An additional benefit can be enabling end-user gasless transaction submissions by disregarding a Layer-2 gas token to submit transactions to Layer-1."),(0,i.kt)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3f90f51b.c63e3c64.js b/assets/js/3f90f51b.c63e3c64.js new file mode 100644 index 000000000..41173dd09 --- /dev/null +++ b/assets/js/3f90f51b.c63e3c64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6669],{1054:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var i=t(5893),a=t(1151),r=t(3872);const s={draft:!1,title:"Services",hide_title:!0,sidebarCollapsible:!1,date:new Date("2023-01-10T09:00:00.000Z"),description:"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","services","develop","sdk","toolkit"]},o=void 0,c={id:"learn/services",title:"Services",description:"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.",source:"@site/docs/learn/services.md",sourceDirName:"learn",slug:"/learn/services",permalink:"/docs/learn/services",draft:!1,unlisted:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Learn",permalink:"/docs/tags/learn"},{label:"services",permalink:"/docs/tags/services"},{label:"develop",permalink:"/docs/tags/develop"},{label:"sdk",permalink:"/docs/tags/sdk"},{label:"toolkit",permalink:"/docs/tags/toolkit"}],version:"current",frontMatter:{draft:!1,title:"Services",hide_title:!0,sidebarCollapsible:!1,date:"2023-01-10T09:00:00.000Z",description:"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.",category:"Documentation",keywords:["services","documentation","getting started"],tags:["Edge Platform","CDN","Guide","Learn","services","develop","sdk","toolkit"]},sidebar:"docs",previous:{title:"Token and economics",permalink:"/docs/learn/token-and-economics"},next:{title:"Developers",permalink:"/docs/learn/developers"}},l={},d=[{value:"Overview",id:"overview",level:2},{value:"Service Development Toolkit (SDK)",id:"service-development-toolkit-sdk",level:2},{value:"Handshake",id:"handshake",level:2},{value:"Service geographic distribution",id:"service-geographic-distribution",level:2},{value:"Resources as commodities",id:"resources-as-commodities",level:2},{value:"Use-cases",id:"use-cases",level:2},{value:"Traditional Services",id:"traditional-services",level:3},{value:"Edge Functions",id:"edge-functions",level:4},{value:"SSR/ISR",id:"ssrisr",level:4},{value:"Hosting",id:"hosting",level:4},{value:"CDN",id:"cdn",level:4},{value:"Container Orchestration",id:"container-orchestration",level:4},{value:"CRDT Databases",id:"crdt-databases",level:4},{value:"Web3 Services",id:"web3-services",level:3},{value:"Blockchain Snapshots",id:"blockchain-snapshots",level:4},{value:"Decentralized IPFS Pinning",id:"decentralized-ipfs-pinning",level:4},{value:"VM's (EVM, zkVM's, etc.)",id:"vms-evm-zkvms-etc",level:4},{value:"Ephemeral Rollups",id:"ephemeral-rollups",level:4},{value:"Proof Generation",id:"proof-generation",level:4},{value:"Alternative Sequencers",id:"alternative-sequencers",level:4}];function h(e){const n={a:"a",admonition:"admonition",h2:"h2",h3:"h3",h4:"h4",p:"p",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsx)(n.p,{children:"A Fleek Network Service is a modular application that runs on nodes and allows users to perform well-defined functions or some specific tasks. Services are scalable and performant due to edge computation and networking features provided by the core principles of the network."}),"\n",(0,i.jsx)(n.p,{children:"As a permissionless system, services are built by developers who are free to build and deploy them to run on the decentralized edge platform. Applications can be of any kind but are generally described as web services. These are cryptographically secure and run within a fair economically incentivized model. The services are hosted in user-managed resources and are highly available to customers and end-users in exchange for rewards."}),"\n",(0,i.jsx)(n.p,{children:"A Service Development Toolkit (SDK) facilitates access to core APIs and resources for developers. Services run in a sandboxed environment (unable to access the host's processes, hardware and kernel directly) and are restricted to specific features such as cryptography, networking and storage. The service implementation source code is fully managed by the author(s), owner(s) and development team(s)."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"At an early stage, core services are statically linked to the node's binary process (Lightning). In the future, the Fleek Network protocol aims to load services dynamically."})}),"\n",(0,i.jsx)(n.h2,{id:"service-development-toolkit-sdk",children:"Service Development Toolkit (SDK)"}),"\n",(0,i.jsx)(n.p,{children:"The Service Development Toolkit (SDK) abstracts the core protocol features, including the communication with the middleware which is done through an Inter-Process Communication (IPC) system. Any system-level programming language, such as C/C++, Go or Rust can establish a communication channel with the middleware. By using the toolkit, a Service builder accelerates the development process e.g. effectively enables nodes to generate Delivery Acknowledgements (SNARKs) that prove work completion which is used to determine rewards, along with other cryptographic commitments."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["As discussed in ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network",children:"The Network"})," section, ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network#delivery-acknowledgements-snarks",children:"Delivery Acknowledgements"})," include metadata about the commodities consumed by a node while executing or running a service. It also contains cryptographically secured metadata that are tamper-proof and used to determine the reward attributed to a node."]})}),"\n",(0,i.jsx)(n.p,{children:"A commitment ensures clients receive the correct work output that is being requested, such as content, a computed response, etc. In addition to preventing malicious services from coercing a node into making false commitments. Likewise, the commitments generated by a node determine the bandwidth and computation served, amongst other commodities."}),"\n",(0,i.jsx)(n.h2,{id:"handshake",children:"Handshake"}),"\n",(0,i.jsx)(n.p,{children:"The Handshake component is the entry point to external communications with a node. It enables clients to establish an encrypted communication session with the node and interact with services over a secure transport layer (TLS+TCP or QUIC). On establishing a client and node connection, public keys are exchanged and a lane is negotiated for the session. A Handshake is required for a client to access and interact with a service."}),"\n",(0,i.jsx)(n.h2,{id:"service-geographic-distribution",children:"Service geographic distribution"}),"\n",(0,i.jsx)(n.p,{children:"The network takes care of infrastructure coverage, scalability, and incentivizing edge nodes to run services. It employs a range of algorithms to assign edge nodes in each geographic region to handle the work for each service, guaranteeing the most efficient route. Additionally, when a service experiences a surge in demand and scales up, any unused services are automatically downscaled. By dynamically allocating resources, it eliminates unnecessary resource usage and allows efficient garbage collection. All of this is achieved while maintaining optimal levels of trust, security, infrastructure coverage, and performance guarantees."}),"\n",(0,i.jsx)(n.h2,{id:"resources-as-commodities",children:"Resources as commodities"}),"\n",(0,i.jsxs)(n.p,{children:["The hardware resources used by a service are packaged and measured as commodities. Includes things like bandwidth and CPU, along with their respective commodities such as GB(s) and CPU cycles. ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network#delivery-acknowledgements-snarks",children:"Delivery Acknowledgements"})," detail the commodities used by a node during service execution. The data is used to reward the node based on the current pricing of those commodities set by the network governance."]}),"\n",(0,i.jsx)(n.h2,{id:"use-cases",children:"Use-cases"}),"\n",(0,i.jsx)(n.p,{children:"Building on Fleek Network's Decentralized Edge Infrastructure unlocks various opportunities and advantages for Service builders, that empower them to implement most of the following concepts."}),"\n",(0,i.jsx)(n.h3,{id:"traditional-services",children:"Traditional Services"}),"\n",(0,i.jsx)(n.h4,{id:"edge-functions",children:"Edge Functions"}),"\n",(0,i.jsx)(n.p,{children:"Edge computing comes in many flavors, and Fleek Network can support many serverless or edge computing functions. For example, low-cost computation for JavaScript functions, Lambda, runtimes or Cloudflare Workers-like computing. Can also perform deterministic computation, consensus-based computation, ZK-computation, and EVM computation. The network is non-opinionated and enables developers to refine their computing service in great detail."}),"\n",(0,i.jsx)(n.h4,{id:"ssrisr",children:"SSR/ISR"}),"\n",(0,i.jsx)(n.p,{children:"One applied edge compute use-case that can be built is Server-side Rendering (SSR) or Incremental Static Regeneration Service (ISR) on top of a container/serverless engine. Given the granularity of content verification within the core's hashing, streaming of particular pieces of data can be optimized and parallelized across multiple nodes. Such as chunking pages of static sites and regenerating only where needed."}),"\n",(0,i.jsx)(n.h4,{id:"hosting",children:"Hosting"}),"\n",(0,i.jsx)(n.p,{children:"Web3 apps are generally composed of a backend and a frontend stack. The backends are considerably decentralized but often have the client-side facing interface hosted into a central cloud provider. Given the desirability of content delivery acceleration services for a snappy user experience, that end customers demand. The Fleek Network takes a big step forward on this topic, as services can leverage the block store and content addressability (IPFS) for an application host provider."}),"\n",(0,i.jsx)(n.p,{children:"As we have today with user stories like S3 or Netlify, a service can use Fleek Network as a storage layer for static sites. Similarly, a CDN or SSR can complement static site hosting by accelerating and dynamically computing user needs. In consequence, the reward mechanism would distribute rewards fairly to every actor in the computation and fulfillment of paying customers for these requests, e.g. service builder, node operator, etc."}),"\n",(0,i.jsx)(n.h4,{id:"cdn",children:"CDN"}),"\n",(0,i.jsx)(n.p,{children:"A decentralized CDN is a big missing piece in the Web3 infra stack. Every protocol, middleware, service, and app can benefit from content acceleration. Today most projects use popular CDNs in front of their stacks for optimization and performance improvement e.g. availability and latency. A decentralized CDN built on Fleek Network can gain great notoriety in the blockchain and Web3 development communities, due to its benefits and principles, without sacrificing performance and cost of integration."}),"\n",(0,i.jsx)(n.p,{children:"The dCDN service can cache content based on the user request and popularity, and put it in the speediest location based on the network reputation system, computation and routing response timings. Conceptually similar to a traditional CDN, but abstracting the geo-location that is usually specified by user-selected zones."}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"While the network does not possess a specific concept of geography, it gains an implicit understanding of geographical proximity through the data it collects on latency and hop counts between nodes, which is a part of the reputation system."})}),"\n",(0,i.jsxs)(n.p,{children:["Learn more about how Fleek Network behaves by reading the ",(0,i.jsx)(n.a,{href:"/docs/whitepaper",children:"whitepaper"}),"."]}),"\n",(0,i.jsx)(n.h4,{id:"container-orchestration",children:"Container Orchestration"}),"\n",(0,i.jsx)(n.p,{children:"A decentralized orchestration service built on a content-addressable edge network can bring benefits in performance and delivery. A service could utilize the native content-addressing and Blake3 hashing and verified data streaming to partition large container image files and serve them at scale in a multi-region environment."}),"\n",(0,i.jsx)(n.p,{children:"Fleek Network can act as a p2p CDN, serving container chunks in a parallelized, verified, and performant way\u2013without sacrificing decentralization. Similar to concepts that can be found in Docker image hosting, Docker Swarm clustering, etc."}),"\n",(0,i.jsx)(n.h4,{id:"crdt-databases",children:"CRDT Databases"}),"\n",(0,i.jsx)(n.p,{children:"Database services in a decentralized edge platform with a content addressable core can benefit from the network's data deduplication and integrity characteristics."}),"\n",(0,i.jsx)(n.p,{children:"Particularly a CRDT database service could be built to converge data from multiple edge locations replicas. Given all data is content-addressed, unique content hashes allow for easy differentiation and verification as the data is replicated."}),"\n",(0,i.jsx)(n.h3,{id:"web3-services",children:"Web3 Services"}),"\n",(0,i.jsx)(n.h4,{id:"blockchain-snapshots",children:"Blockchain Snapshots"}),"\n",(0,i.jsx)(n.p,{children:"Interchain synchronization of a full-node history is CPU-intensive. Can take hours, days or weeks depending on blockchain technology. On Fleek Network's core, the internal blockchain is based on content addressability which stores snapshots of the state HEAD. It utilizes decentralized content acceleration for node entire-state synchronization for higher speed."}),"\n",(0,i.jsx)(n.p,{children:"A service can be built that does a similar process for any chain. By automating snapshot storage timely and in-synchronization to the chain HEAD. It can deliver an entire state to a node rapidly."}),"\n",(0,i.jsx)(n.h4,{id:"decentralized-ipfs-pinning",children:"Decentralized IPFS Pinning"}),"\n",(0,i.jsx)(n.p,{children:"All content on the Fleek Network is content addressed and referred to by the CID, which mapping of the CID to the origin is stored in perpetuity. Coupled with the built-in file system interlinked to decentralized storage protocols such as Arweave and Filecoin, an IPFS pinning service can be built. A pinning service for IPFS that provides the user experience we are accustomed to, but using decentralized infrastructure, which today's IPFS pinning services fail to offer."}),"\n",(0,i.jsx)(n.p,{children:"Worth mentioning that an IPFS pinning service as such, would be cheaper and provide better availability, performance and security guarantees. For example, as the network stores the CID-to-origin mapping in perpetuity, even if an IPFS file is lost it can be easily retrieved if there's at least one origin."}),"\n",(0,i.jsx)(n.h4,{id:"vms-evm-zkvms-etc",children:"VM's (EVM, zkVM's, etc.)"}),"\n",(0,i.jsx)(n.p,{children:"A service that deploys a virtual machine, such as many zk-VMs, or the EVM can be built and deployed to Fleek Network. It can provide compute in the zk-VM and provide the zk-SNARK from the node, proving the correctness of the response. In addition, the network routing can ensure that the zk-VM computation is happening in the closest proximity to the client based on latency and other network factors."}),"\n",(0,i.jsx)(n.h4,{id:"ephemeral-rollups",children:"Ephemeral Rollups"}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network can be utilized as a short-term service platform for a variety of applications or side-chaining that compute state and roll it up to a smart contract. An NFT minting or game event that occurs during a short period, can roll up state to a smart contract after the event time elapses."}),"\n",(0,i.jsx)(n.p,{children:"To help users mitigate gas costs and feeds while providing instant finality throughout an event. Consequently, roll-ups would run on a decentralized network, that is fault-resistant and highly performant."}),"\n",(0,i.jsx)(n.h4,{id:"proof-generation",children:"Proof Generation"}),"\n",(0,i.jsx)(n.p,{children:"As a result of the rise of Zero-Knowledge proofs (SNARKs, STARKs) for performance and cost-efficient proof generation, there are benefits for computing them closer to end-users and in a decentralized manner which Fleek Network Edge Network entails."}),"\n",(0,i.jsxs)(n.p,{children:["For example, a hypothetical ",(0,i.jsx)(n.a,{href:"https://eprint.iacr.org/2016/260.pdf",children:"Groth16"})," service can read parameters from configuration files in a file system and generate a proof based on public user custom parameters."]}),"\n",(0,i.jsx)(n.h4,{id:"alternative-sequencers",children:"Alternative Sequencers"}),"\n",(0,i.jsx)(n.p,{children:"As encountered by most sequencers that post transactions to Layer-1 settlement contracts (which are mostly done over centralized processes), Layer-2 networks bypass these by posting them manually.\nThis causes long finalization times and a reduction in block speeds on Layer-1, which is contrary to what users are familiar with and find ordinary on Layer-2."}),"\n",(0,i.jsx)(n.p,{children:"In Fleek Network, a service builder can offer an alternative to a Layer-2 sequencer, that is decentralized and more reliable by batching and posting to Layer-1 settlement contracts. With equivalent Layer-2 settlement times."}),"\n",(0,i.jsx)(n.p,{children:"An additional benefit can be enabling end-user gasless transaction submissions by disregarding a Layer-2 gas token to submit transactions to Layer-1."}),"\n",(0,i.jsx)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>a});t(7294);var i=t(5893);const a=e=>{let{image:n,name:t,title:a,url:r,communityMember:s=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:r,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:r,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:a}),(0,i.jsxs)("span",{className:"discord",children:[s?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var i=t(7294);const a={},r=i.createContext(a);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4035650f.c73efbe4.js b/assets/js/4035650f.9316e754.js similarity index 83% rename from assets/js/4035650f.c73efbe4.js rename to assets/js/4035650f.9316e754.js index b10280b30..4356293a3 100644 --- a/assets/js/4035650f.c73efbe4.js +++ b/assets/js/4035650f.9316e754.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2260],{9438:e=>{e.exports=JSON.parse('{"label":"engineering","permalink":"/blog/tags/engineering","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2260],{9438:e=>{e.exports=JSON.parse('{"label":"engineering","permalink":"/blog/tags/engineering","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/40aeb86f.376587f0.js b/assets/js/40aeb86f.376587f0.js deleted file mode 100644 index 2c8624ddf..000000000 --- a/assets/js/40aeb86f.376587f0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4402],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),h=p(n),d=o,m=h["".concat(s,".").concat(d)]||h[d]||u[d]||r;return n?a.createElement(m,l(l({ref:t},c),{},{components:n})):a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[h]="string"==typeof e?e:o,l[1]=i;for(var p=2;p{n.d(t,{ZP:()=>i});var a=n(7462),o=(n(7294),n(3905));const r={toc:[]},l="wrapper";function i(e){let{components:t,...n}=e;return(0,o.kt)(l,(0,a.Z)({},r,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"In the ",(0,o.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml")," you'll find some and more of the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,o.kt)("strong",{parentName:"p"},"configuration.toml"),". We keep it short to make it easier to follow, do not copy and paste.")),(0,o.kt)("p",null,"Find and replace all instances of ~ in the config file ",(0,o.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml"),". "),(0,o.kt)("p",null,"Here's an example of how to do it using ",(0,o.kt)("strong",{parentName:"p"},"sed"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n')),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Replace the ",(0,o.kt)("inlineCode",{parentName:"p"},"")," with your username. For example, if you have followed the recommendation to ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user"},"create a user")," it would look like ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/config.toml")," for the username ",(0,o.kt)("strong",{parentName:"p"},"lgtn"),".")),(0,o.kt)("p",null,"For example, if your username is ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," that'd look like this:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n')),(0,o.kt)("p",null,"Once modified, you can run a ",(0,o.kt)("inlineCode",{parentName:"p"},"cat")," to see the content of the files to confirm it has been updated."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cat /home/lgtn/.lightning/config.toml\n")),(0,o.kt)("p",null,"For our example where we opted in for the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," that would look like:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("admonition",{title:"Warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.")))}i.isMDXComponent=!0},3813:(e,t,n)=>{n.d(t,{ZP:()=>i});var a=n(7462),o=(n(7294),n(3905));const r={toc:[]},l="wrapper";function i(e){let{components:t,...n}=e;return(0,o.kt)(l,(0,a.Z)({},r,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The flag ",(0,o.kt)("inlineCode",{parentName:"p"},"-c")," in the ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning.service")," ",(0,o.kt)("strong",{parentName:"p"},"ExecStart"),", is to provide the toml configuration file path e.g. defaults to ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning/config.toml"),". This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a ",(0,o.kt)("strong",{parentName:"p"},"user")," or ",(0,o.kt)("strong",{parentName:"p"},"sudoer"),". For example, a ",(0,o.kt)("strong",{parentName:"p"},"sudoer")," would have the ",(0,o.kt)("strong",{parentName:"p"},"configuration")," set to ",(0,o.kt)("inlineCode",{parentName:"p"},"/root/.lightning/config.toml")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/username/.lightning/config.toml")," depending on using ",(0,o.kt)("strong",{parentName:"p"},"sudo")," which might cause some confusion to some users.")))}i.isMDXComponent=!0},2300:(e,t,n)=>{n.d(t,{ZP:()=>i});var a=n(7462),o=(n(7294),n(3905));const r={toc:[]},l="wrapper";function i(e){let{components:t,...n}=e;return(0,o.kt)(l,(0,a.Z)({},r,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"You should be following the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user-1"},"create a user")," recommendation. For our example, we have the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn"),"."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"If you have chosen a different username, replace ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," by the correct username you have selected.")),(0,o.kt)("p",null,"In the ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")," you'll find some and more of the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("p",null,"Find and replace all instances of ",(0,o.kt)("inlineCode",{parentName:"p"},"~")," in the config file ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/config.toml"),". Here's an example using ",(0,o.kt)("inlineCode",{parentName:"p"},"sed"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n')),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")," example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here.")),(0,o.kt)("p",null,"Once changed, all the instances of ",(0,o.kt)("inlineCode",{parentName:"p"},"~/")," should be replaced by your user path e.g. ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/"),". For our example, the output would look like the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "/home/lgtn/.lightning/data/app_db"\n\n[consensus]\nstore_path = "/home/lgtn/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "/home/lgtn/.lightning/blockstore"\n\n[resolver]\nstore_path = "/home/lgtn/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n')))}i.isMDXComponent=!0},1054:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>k,frontMatter:()=>p,metadata:()=>h,toc:()=>d});var a=n(7462),o=(n(7294),n(3905)),r=n(3872),l=n(2300),i=n(3813),s=n(3242);const p={title:"Update CLI from source code",slug:"update-cli-from-source-code",hide_title:!0,tags:["references","help","update","upgrade","fix"]},c=void 0,h={unversionedId:"Lightning CLI/update-cli-from-source-code",id:"Lightning CLI/update-cli-from-source-code",title:"Update CLI from source code",description:"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:",source:"@site/references/Lightning CLI/update-cli-from-source-code.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/update-cli-from-source-code",permalink:"/references/Lightning CLI/update-cli-from-source-code",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/update-cli-from-source-code.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"update",permalink:"/references/tags/update"},{label:"upgrade",permalink:"/references/tags/upgrade"},{label:"fix",permalink:"/references/tags/fix"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Update CLI from source code",slug:"update-cli-from-source-code",hide_title:!0,tags:["references","help","update","upgrade","fix"]},sidebar:"defaultSidebar",previous:{title:"Uninstall Lightning Node",permalink:"/references/Lightning CLI/uninstall-lightning-node"},next:{title:"Service keeps running after shutdown",permalink:"/references/Systemd/service-keeps-running-after-shutdown"}},u={},d=[{value:"Switch to the installation user",id:"switch-to-the-installation-user",level:2},{value:"Change directory to the source code",id:"change-directory-to-the-source-code",level:2},{value:"Checkout to branch",id:"checkout-to-branch",level:2},{value:"Pull the latest changes",id:"pull-the-latest-changes",level:2},{value:"Build binary from the source",id:"build-binary-from-the-source",level:2},{value:"Update the symlink",id:"update-the-symlink",level:2},{value:"Set user path in config.toml",id:"set-user-path-in-configtoml",level:2},{value:"Update the systemd service unit",id:"update-the-systemd-service-unit",level:2},{value:"Clear the data",id:"clear-the-data",level:2},{value:"Update the config.toml",id:"update-the-configtoml",level:2},{value:"Update the config.toml with user home path",id:"update-the-configtoml-with-user-home-path",level:2},{value:"Restart the service",id:"restart-the-service",level:2},{value:"Health checkup",id:"health-checkup",level:2}],m={toc:d},g="wrapper";function k(e){let{components:t,...n}=e;return(0,o.kt)(g,(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"curl -sS https://get.fleek.network/update | bash\n"))),(0,o.kt)("h2",{id:"switch-to-the-installation-user"},"Switch to the installation user"),(0,o.kt)("p",null,"Switch to the username you've used throughout the installation process."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"su \n")),(0,o.kt)("p",null,"For example, if you used the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," it'll look like the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"su lgtn\n")),(0,o.kt)("h2",{id:"change-directory-to-the-source-code"},"Change directory to the source code"),(0,o.kt)("p",null,"If you have installed it via the recommended process or instructions, then the default location where the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"source code")," is stored is ",(0,o.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~/fleek-network/lightning\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Notice that we use ",(0,o.kt)("inlineCode",{parentName:"p"},"~"),", which refers to ",(0,o.kt)("inlineCode",{parentName:"p"},"$HOME"),". You must use the username used for the installation process. For example, on ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"Ubuntu")," if you use the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn"),", the pathname for ",(0,o.kt)("inlineCode",{parentName:"p"},"$HOME")," is ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn"),".")),(0,o.kt)("h2",{id:"checkout-to-branch"},"Checkout to branch"),(0,o.kt)("p",null,"Make sure that you are checked in to the correct branch. For the current testnet phase that'd be ",(0,o.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1"),". If you use any other branch name, your node will not function correctly. Use the branch name ",(0,o.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout testnet-alpha-1\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"We try to update our documentation promptly but sometimes are a bit behind on any changes we might make in real-time. If you find any typos, such as the wrong branch name, help us by letting us know! Find us in Fleek Network section of our ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"Discord"),".")),(0,o.kt)("h2",{id:"pull-the-latest-changes"},"Pull the latest changes"),(0,o.kt)("p",null,"Before make sure that you stash or clear any changes you may have in the working directory, as otherwise, ",(0,o.kt)("inlineCode",{parentName:"p"},"git")," will let you know about local changes\u2013if you'd like to learn more about it read the ",(0,o.kt)("a",{parentName:"p",href:"https://git-scm.com/docs/git-stash"},"git stash document"),"."),(0,o.kt)("p",null,"A quick way to clean is to ",(0,o.kt)("inlineCode",{parentName:"p"},"stash")," the changes, for example:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git stash \n")),(0,o.kt)("p",null,"To pull the latest changes use the ",(0,o.kt)("inlineCode",{parentName:"p"},"git pull")," command, as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git pull origin testnet-alpha-1\n")),(0,o.kt)("p",null,"Alternatively, to have to stash and pull, you can reset the repository to the origin."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git fetch origin testnet-alpha-1\ngit reset --hard origin/testnet-alpha-1\ngit clean -f\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"We are using the branch named ",(0,o.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1"),", which is specific to the early testnet launch. Change to the correct branch name according to needs. For example, in the future the mainnet version will go on branch name ",(0,o.kt)("inlineCode",{parentName:"p"},"main"),".")),(0,o.kt)("h2",{id:"build-binary-from-the-source"},"Build binary from the source"),(0,o.kt)("p",null,"To build the binary from the source code, we execute the cargo build command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cargo +stable build --release\n")),(0,o.kt)("h2",{id:"update-the-symlink"},"Update the symlink"),(0,o.kt)("p",null,"Start by removing the existing one:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sudo rm -f "/usr/local/bin/lgtn"\n')),(0,o.kt)("p",null,"Create a new symlink that links the new build binary to ",(0,o.kt)("inlineCode",{parentName:"p"},"/usr/local/bin/lgtn"),", as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo ln -s ~/fleek-network/lightning/target/release/lightning-node /usr/local/bin/lgtn\n")),(0,o.kt)("h2",{id:"set-user-path-in-configtoml"},"Set user path in config.toml"),(0,o.kt)(l.ZP,{mdxType:"SetUserPathInConfigToml"}),(0,o.kt)("h2",{id:"update-the-systemd-service-unit"},"Update the systemd service unit"),(0,o.kt)("p",null,"Open and edit the ",(0,o.kt)("inlineCode",{parentName:"p"},"/etc/systemd/system/lightning.service")," file."),(0,o.kt)("p",null,"1) Replace ",(0,o.kt)("inlineCode",{parentName:"p"},"")," with the username. For example, in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user"},"documentation")," we use the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn"),"."),(0,o.kt)("p",null,"2) Make sure that the ",(0,o.kt)("inlineCode",{parentName:"p"},"ExecStart")," is set correctly"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home//.lightning/config.toml -vv run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n")),(0,o.kt)(i.ZP,{mdxType:"NoteExecStartFlagCConfigPath"}),(0,o.kt)("p",null,"When complete make sure the file is saved. Followed by a systemctl daemon reload:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,o.kt)("h2",{id:"clear-the-data"},"Clear the data"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"rm -rf ~/.lightning/data\n")),(0,o.kt)("p",null,"Depending on how you control the system, this might need ",(0,o.kt)("strong",{parentName:"p"},"sudo"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo rm -rf ~/.lightning/data\n")),(0,o.kt)("h2",{id:"update-the-configtoml"},"Update the ",(0,o.kt)("inlineCode",{parentName:"h2"},"config.toml")),(0,o.kt)("p",null,"Remove the ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning/config.toml"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"rm ~/.lightning/config.toml\n")),(0,o.kt)("p",null,"Create a new ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn print-config --default > ~/.lightning/config.toml\n")),(0,o.kt)("h2",{id:"update-the-configtoml-with-user-home-path"},"Update the ",(0,o.kt)("inlineCode",{parentName:"h2"},"config.toml")," with user home path"),(0,o.kt)(s.ZP,{mdxType:"FindAndReplaceConfigWithUserPaths"}),(0,o.kt)("h2",{id:"restart-the-service"},"Restart the service"),(0,o.kt)("p",null,"Once the cargo build process is completed, you have to restart the service. We're assuming you are using non-root user as ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user"},"recommended"),", you won't use ",(0,o.kt)("strong",{parentName:"p"},"sudo")," to start the service. The command will look as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl restart lightning\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"If you have installed the Fleek Network lightning manually, the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#systemd-service-setup"},"installation instructions")," recommended setting up a systemd service for the Fleek Network process. If you haven't, you're advised to check the instructions provided.")),(0,o.kt)("h2",{id:"health-checkup"},"Health checkup"),(0,o.kt)("p",null,"Do a quick health check by running:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'curl -w "\\p" localhost:4230/health\n')),(0,o.kt)("p",null,"If successful, you should get the response ",(0,o.kt)("inlineCode",{parentName:"p"},"running and staked"),", as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"running and staked\n")),(0,o.kt)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}k.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(7294);const o=e=>{let{image:t,name:n,title:o,url:r,communityMember:l=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:r,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:r,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},o),a.createElement("span",{className:"discord"},l?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/40aeb86f.bd8448f6.js b/assets/js/40aeb86f.bd8448f6.js new file mode 100644 index 000000000..e00deb9b1 --- /dev/null +++ b/assets/js/40aeb86f.bd8448f6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4402],{1586:(e,n,t)=>{t.d(n,{ZP:()=>r});var s=t(5893),o=t(1151);function i(e){const n={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"/home//.lightning/config.toml"})," you'll find some and more of the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,s.jsx)(n.strong,{children:"configuration.toml"}),". We keep it short to make it easier to follow, do not copy and paste."]})}),"\n",(0,s.jsxs)(n.p,{children:["Find and replace all instances of ~ in the config file ",(0,s.jsx)(n.code,{children:"/home//.lightning/config.toml"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Here's an example of how to do it using ",(0,s.jsx)(n.strong,{children:"sed"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Replace the ",(0,s.jsx)(n.code,{children:""})," with your username. For example, if you have followed the recommendation to ",(0,s.jsx)(n.a,{href:"/docs/node/install#create-a-user",children:"create a user"})," it would look like ",(0,s.jsx)(n.code,{children:"/home/lgtn/.lightning/config.toml"})," for the username ",(0,s.jsx)(n.strong,{children:"lgtn"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["For example, if your username is ",(0,s.jsx)(n.code,{children:"lgtn"})," that'd look like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Once modified, you can run a ",(0,s.jsx)(n.code,{children:"cat"})," to see the content of the files to confirm it has been updated."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cat /home/lgtn/.lightning/config.toml\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For our example where we opted in for the username ",(0,s.jsx)(n.code,{children:"lgtn"})," that would look like:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Warning",type:"caution",children:(0,s.jsx)(n.p,{children:"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here."})})]})}function r(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},1761:(e,n,t)=>{t.d(n,{ZP:()=>r});var s=t(5893),o=t(1151);function i(e){const n={admonition:"admonition",code:"code",p:"p",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["The flag ",(0,s.jsx)(n.code,{children:"-c"})," in the ",(0,s.jsx)(n.code,{children:"lightning.service"})," ",(0,s.jsx)(n.strong,{children:"ExecStart"}),", is to provide the toml configuration file path e.g. defaults to ",(0,s.jsx)(n.code,{children:"~/.lightning/config.toml"}),". This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a ",(0,s.jsx)(n.strong,{children:"user"})," or ",(0,s.jsx)(n.strong,{children:"sudoer"}),". For example, a ",(0,s.jsx)(n.strong,{children:"sudoer"})," would have the ",(0,s.jsx)(n.strong,{children:"configuration"})," set to ",(0,s.jsx)(n.code,{children:"/root/.lightning/config.toml"})," or ",(0,s.jsx)(n.code,{children:"/home/username/.lightning/config.toml"})," depending on using ",(0,s.jsx)(n.strong,{children:"sudo"})," which might cause some confusion to some users."]})})}function r(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},4405:(e,n,t)=>{t.d(n,{ZP:()=>r});var s=t(5893),o=t(1151);function i(e){const n={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["You should be following the ",(0,s.jsx)(n.a,{href:"/docs/node/install#create-a-user-1",children:"create a user"})," recommendation. For our example, we have the username ",(0,s.jsx)(n.code,{children:"lgtn"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["If you have chosen a different username, replace ",(0,s.jsx)(n.code,{children:"lgtn"})," by the correct username you have selected."]})}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"config.toml"})," you'll find some and more of the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Find and replace all instances of ",(0,s.jsx)(n.code,{children:"~"})," in the config file ",(0,s.jsx)(n.code,{children:"/home/lgtn/.lightning/config.toml"}),". Here's an example using ",(0,s.jsx)(n.code,{children:"sed"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"config.toml"})," example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here."]})}),"\n",(0,s.jsxs)(n.p,{children:["Once changed, all the instances of ",(0,s.jsx)(n.code,{children:"~/"})," should be replaced by your user path e.g. ",(0,s.jsx)(n.code,{children:"/home/lgtn/"}),". For our example, the output would look like the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "/home/lgtn/.lightning/data/app_db"\n\n[consensus]\nstore_path = "/home/lgtn/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "/home/lgtn/.lightning/blockstore"\n\n[resolver]\nstore_path = "/home/lgtn/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n'})})]})}function r(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},2382:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>g,contentTitle:()=>h,default:()=>m,frontMatter:()=>c,metadata:()=>d,toc:()=>u});var s=t(5893),o=t(1151),i=t(3872),r=t(4405),l=t(1761),a=t(1586);const c={title:"Update CLI from source code",slug:"update-cli-from-source-code",hide_title:!0,tags:["references","help","update","upgrade","fix"]},h=void 0,d={id:"Lightning CLI/update-cli-from-source-code",title:"Update CLI from source code",description:"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:",source:"@site/references/Lightning CLI/update-cli-from-source-code.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/update-cli-from-source-code",permalink:"/references/Lightning CLI/update-cli-from-source-code",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/update-cli-from-source-code.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"update",permalink:"/references/tags/update"},{label:"upgrade",permalink:"/references/tags/upgrade"},{label:"fix",permalink:"/references/tags/fix"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Update CLI from source code",slug:"update-cli-from-source-code",hide_title:!0,tags:["references","help","update","upgrade","fix"]},sidebar:"defaultSidebar",previous:{title:"Uninstall Lightning Node",permalink:"/references/Lightning CLI/uninstall-lightning-node"},next:{title:"Service keeps running after shutdown",permalink:"/references/Systemd/service-keeps-running-after-shutdown"}},g={},u=[{value:"Switch to the installation user",id:"switch-to-the-installation-user",level:2},{value:"Change directory to the source code",id:"change-directory-to-the-source-code",level:2},{value:"Checkout to branch",id:"checkout-to-branch",level:2},{value:"Pull the latest changes",id:"pull-the-latest-changes",level:2},{value:"Build binary from the source",id:"build-binary-from-the-source",level:2},{value:"Update the symlink",id:"update-the-symlink",level:2},{value:"Set user path in config.toml",id:"set-user-path-in-configtoml",level:2},{value:"Update the systemd service unit",id:"update-the-systemd-service-unit",level:2},{value:"Clear the data",id:"clear-the-data",level:2},{value:"Update the config.toml",id:"update-the-configtoml",level:2},{value:"Update the config.toml with user home path",id:"update-the-configtoml-with-user-home-path",level:2},{value:"Restart the service",id:"restart-the-service",level:2},{value:"Health checkup",id:"health-checkup",level:2}];function p(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsx)(n.p,{children:"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"curl -sS https://get.fleek.network/update | bash\n"})})]}),"\n",(0,s.jsx)(n.h2,{id:"switch-to-the-installation-user",children:"Switch to the installation user"}),"\n",(0,s.jsx)(n.p,{children:"Switch to the username you've used throughout the installation process."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"su \n"})}),"\n",(0,s.jsxs)(n.p,{children:["For example, if you used the username ",(0,s.jsx)(n.code,{children:"lgtn"})," it'll look like the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"su lgtn\n"})}),"\n",(0,s.jsx)(n.h2,{id:"change-directory-to-the-source-code",children:"Change directory to the source code"}),"\n",(0,s.jsxs)(n.p,{children:["If you have installed it via the recommended process or instructions, then the default location where the ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"source code"})," is stored is ",(0,s.jsx)(n.code,{children:"~/fleek-network/lightning"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cd ~/fleek-network/lightning\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Notice that we use ",(0,s.jsx)(n.code,{children:"~"}),", which refers to ",(0,s.jsx)(n.code,{children:"$HOME"}),". You must use the username used for the installation process. For example, on ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#server",children:"Ubuntu"})," if you use the username ",(0,s.jsx)(n.code,{children:"lgtn"}),", the pathname for ",(0,s.jsx)(n.code,{children:"$HOME"})," is ",(0,s.jsx)(n.code,{children:"/home/lgtn"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"checkout-to-branch",children:"Checkout to branch"}),"\n",(0,s.jsxs)(n.p,{children:["Make sure that you are checked in to the correct branch. For the current testnet phase that'd be ",(0,s.jsx)(n.code,{children:"testnet-alpha-1"}),". If you use any other branch name, your node will not function correctly. Use the branch name ",(0,s.jsx)(n.code,{children:"testnet-alpha-1"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"git checkout testnet-alpha-1\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["We try to update our documentation promptly but sometimes are a bit behind on any changes we might make in real-time. If you find any typos, such as the wrong branch name, help us by letting us know! Find us in Fleek Network section of our ",(0,s.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"Discord"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"pull-the-latest-changes",children:"Pull the latest changes"}),"\n",(0,s.jsxs)(n.p,{children:["Before make sure that you stash or clear any changes you may have in the working directory, as otherwise, ",(0,s.jsx)(n.code,{children:"git"})," will let you know about local changes\u2013if you'd like to learn more about it read the ",(0,s.jsx)(n.a,{href:"https://git-scm.com/docs/git-stash",children:"git stash document"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["A quick way to clean is to ",(0,s.jsx)(n.code,{children:"stash"})," the changes, for example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"git stash \n"})}),"\n",(0,s.jsxs)(n.p,{children:["To pull the latest changes use the ",(0,s.jsx)(n.code,{children:"git pull"})," command, as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"git pull origin testnet-alpha-1\n"})}),"\n",(0,s.jsx)(n.p,{children:"Alternatively, to have to stash and pull, you can reset the repository to the origin."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"git fetch origin testnet-alpha-1\ngit reset --hard origin/testnet-alpha-1\ngit clean -f\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["We are using the branch named ",(0,s.jsx)(n.code,{children:"testnet-alpha-1"}),", which is specific to the early testnet launch. Change to the correct branch name according to needs. For example, in the future the mainnet version will go on branch name ",(0,s.jsx)(n.code,{children:"main"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"build-binary-from-the-source",children:"Build binary from the source"}),"\n",(0,s.jsx)(n.p,{children:"To build the binary from the source code, we execute the cargo build command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cargo +stable build --release\n"})}),"\n",(0,s.jsx)(n.h2,{id:"update-the-symlink",children:"Update the symlink"}),"\n",(0,s.jsx)(n.p,{children:"Start by removing the existing one:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sudo rm -f "/usr/local/bin/lgtn"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Create a new symlink that links the new build binary to ",(0,s.jsx)(n.code,{children:"/usr/local/bin/lgtn"}),", as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo ln -s ~/fleek-network/lightning/target/release/lightning-node /usr/local/bin/lgtn\n"})}),"\n",(0,s.jsx)(n.h2,{id:"set-user-path-in-configtoml",children:"Set user path in config.toml"}),"\n",(0,s.jsx)(r.ZP,{}),"\n",(0,s.jsx)(n.h2,{id:"update-the-systemd-service-unit",children:"Update the systemd service unit"}),"\n",(0,s.jsxs)(n.p,{children:["Open and edit the ",(0,s.jsx)(n.code,{children:"/etc/systemd/system/lightning.service"})," file."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Replace ",(0,s.jsx)(n.code,{children:""})," with the username. For example, in the ",(0,s.jsx)(n.a,{href:"/docs/node/install#create-a-user",children:"documentation"})," we use the username ",(0,s.jsx)(n.code,{children:"lgtn"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Make sure that the ",(0,s.jsx)(n.code,{children:"ExecStart"})," is set correctly"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home//.lightning/config.toml -vv run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,s.jsx)(l.ZP,{}),"\n",(0,s.jsx)(n.p,{children:"When complete make sure the file is saved. Followed by a systemctl daemon reload:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,s.jsx)(n.h2,{id:"clear-the-data",children:"Clear the data"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"rm -rf ~/.lightning/data\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Depending on how you control the system, this might need ",(0,s.jsx)(n.strong,{children:"sudo"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo rm -rf ~/.lightning/data\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"update-the-configtoml",children:["Update the ",(0,s.jsx)(n.code,{children:"config.toml"})]}),"\n",(0,s.jsxs)(n.p,{children:["Remove the ",(0,s.jsx)(n.code,{children:"~/.lightning/config.toml"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"rm ~/.lightning/config.toml\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Create a new ",(0,s.jsx)(n.code,{children:"config.toml"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"lgtn print-config --default > ~/.lightning/config.toml\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"update-the-configtoml-with-user-home-path",children:["Update the ",(0,s.jsx)(n.code,{children:"config.toml"})," with user home path"]}),"\n",(0,s.jsx)(a.ZP,{}),"\n",(0,s.jsx)(n.h2,{id:"restart-the-service",children:"Restart the service"}),"\n",(0,s.jsxs)(n.p,{children:["Once the cargo build process is completed, you have to restart the service. We're assuming you are using non-root user as ",(0,s.jsx)(n.a,{href:"/docs/node/install#create-a-user",children:"recommended"}),", you won't use ",(0,s.jsx)(n.strong,{children:"sudo"})," to start the service. The command will look as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl restart lightning\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["If you have installed the Fleek Network lightning manually, the ",(0,s.jsx)(n.a,{href:"/docs/node/install#systemd-service-setup",children:"installation instructions"})," recommended setting up a systemd service for the Fleek Network process. If you haven't, you're advised to check the instructions provided."]})}),"\n",(0,s.jsx)(n.h2,{id:"health-checkup",children:"Health checkup"}),"\n",(0,s.jsx)(n.p,{children:"Do a quick health check by running:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'curl -w "\\p" localhost:4230/health\n'})}),"\n",(0,s.jsxs)(n.p,{children:["If successful, you should get the response ",(0,s.jsx)(n.code,{children:"running and staked"}),", as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"running and staked\n"})}),"\n",(0,s.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function m(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var s=t(5893);const o=e=>{let{image:n,name:t,title:o,url:i,communityMember:r=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:i,target:"_blank",alt:t,children:(0,s.jsx)("img",{src:n,alt:t})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:i,target:"_blank",alt:t,children:t})}),(0,s.jsx)("span",{className:"title",children:o}),(0,s.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>r});var s=t(7294);const o={},i=s.createContext(o);function r(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4247aede.b2010ed6.js b/assets/js/4247aede.df1864bc.js similarity index 83% rename from assets/js/4247aede.b2010ed6.js rename to assets/js/4247aede.df1864bc.js index 926816170..c917972f5 100644 --- a/assets/js/4247aede.b2010ed6.js +++ b/assets/js/4247aede.df1864bc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2800],{4948:e=>{e.exports=JSON.parse('{"label":"consensus","permalink":"/docs/tags/consensus","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2800],{4948:e=>{e.exports=JSON.parse('{"label":"consensus","permalink":"/docs/tags/consensus","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/433ff3d6.d3c847c3.js b/assets/js/433ff3d6.093c7d9e.js similarity index 90% rename from assets/js/433ff3d6.d3c847c3.js rename to assets/js/433ff3d6.093c7d9e.js index 7256d8e30..f2530a05b 100644 --- a/assets/js/433ff3d6.d3c847c3.js +++ b/assets/js/433ff3d6.093c7d9e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[555],{2787:e=>{e.exports=JSON.parse('{"label":"rewards","permalink":"/docs/tags/rewards","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[555],{2787:e=>{e.exports=JSON.parse('{"label":"rewards","permalink":"/docs/tags/rewards","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/43ee1886.331e3119.js b/assets/js/43ee1886.d81e37f7.js similarity index 89% rename from assets/js/43ee1886.331e3119.js rename to assets/js/43ee1886.d81e37f7.js index de09dc39c..1a130dfcc 100644 --- a/assets/js/43ee1886.331e3119.js +++ b/assets/js/43ee1886.d81e37f7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5466],{653:e=>{e.exports=JSON.parse('{"label":"idle","permalink":"/references/tags/idle","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5466],{653:e=>{e.exports=JSON.parse('{"label":"idle","permalink":"/references/tags/idle","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/445e9e2a.9a475749.js b/assets/js/445e9e2a.9a475749.js new file mode 100644 index 000000000..1e6d7ca6a --- /dev/null +++ b/assets/js/445e9e2a.9a475749.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8578],{1478:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>g,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var n=s(5893),i=s(1151),o=s(3872);const r={title:"Node secret key does not exist",slug:"node-secret-key-does-not-exist",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},a=void 0,d={id:"Lightning CLI/node-secret-key-does-not-exist",title:"Node secret key does not exist",description:"Node secret key does not exist",source:"@site/references/Lightning CLI/node-secret-key-does-not-exist.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/node-secret-key-does-not-exist",permalink:"/references/Lightning CLI/node-secret-key-does-not-exist",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/node-secret-key-does-not-exist.md",tags:[{label:"keystore",permalink:"/references/tags/keystore"},{label:"lost keys",permalink:"/references/tags/lost-keys"},{label:"ownership",permalink:"/references/tags/ownership"},{label:"file permissions",permalink:"/references/tags/file-permissions"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Node secret key does not exist",slug:"node-secret-key-does-not-exist",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},sidebar:"defaultSidebar",previous:{title:"Backing up the keystore",permalink:"/references/Lightning CLI/backing-up-the-keystore"},next:{title:"Permission denied (os error 13)",permalink:"/references/Lightning CLI/permission-denied-os-error-13"}},l={},c=[{value:"Node secret key does not exist",id:"node-secret-key-does-not-exist",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"node-secret-key-does-not-exist",children:"Node secret key does not exist"}),"\n",(0,n.jsx)(t.p,{children:'When watching the Fleek Network Lightning service log output, you find the "Node secret key does not exist" message as follows:'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-sh",children:"Error: Could not start the node.\n\nCaused by:\n Node Initialization failed: InitializationFailed(Tag as SignerInterface>, Node secret key does not exist. Use the CLI to generate keys.)\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Edit the ",(0,n.jsx)(t.code,{children:"~/.lightning/config.toml"})," to include the full location for the PEM files. For example, let's say that it's located under ",(0,n.jsx)(t.code,{children:"/home/skywalker"})," that'd look like:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:'[signer]\nconsensus_key_path = "/home/skywalker/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/skywalker/.lightning/keystore/node.pem"\n'})}),"\n",(0,n.jsxs)(t.p,{children:["To learn more about how file permissions and ownership work, you're advised to read the reference document ",(0,n.jsx)(t.a,{href:"/references/Lightning%20CLI/file-permissions-and-ownership",children:"here"}),"."]}),"\n",(0,n.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function g(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3872:(e,t,s)=>{s.d(t,{Z:()=>i});s(7294);var n=s(5893);const i=e=>{let{image:t,name:s,title:i,url:o,communityMember:r=!1}=e;return(0,n.jsx)("section",{className:"author_card",children:(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"avatar",children:(0,n.jsx)("a",{href:o,target:"_blank",alt:s,children:(0,n.jsx)("img",{src:t,alt:s})})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"name",children:(0,n.jsx)("a",{href:o,target:"_blank",alt:s,children:s})}),(0,n.jsx)("span",{className:"title",children:i}),(0,n.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,n.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>r});var n=s(7294);const i={},o=n.createContext(i);function r(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/445e9e2a.e889d98e.js b/assets/js/445e9e2a.e889d98e.js deleted file mode 100644 index 2e01a2481..000000000 --- a/assets/js/445e9e2a.e889d98e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8578],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,s=e.originalType,l=e.parentName,d=a(e,["components","mdxType","originalType","parentName"]),p=c(n),u=o,g=p["".concat(l,".").concat(u)]||p[u]||m[u]||s;return n?r.createElement(g,i(i({ref:t},d),{},{components:n})):r.createElement(g,i({ref:t},d))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=n.length,i=new Array(s);i[0]=u;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[p]="string"==typeof e?e:o,i[1]=a;for(var c=2;c{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var r=n(7462),o=(n(7294),n(3905)),s=n(3872);const i={title:"Node secret key does not exist",slug:"node-secret-key-does-not-exist",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},a=void 0,l={unversionedId:"Lightning CLI/node-secret-key-does-not-exist",id:"Lightning CLI/node-secret-key-does-not-exist",title:"Node secret key does not exist",description:"Node secret key does not exist",source:"@site/references/Lightning CLI/node-secret-key-does-not-exist.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/node-secret-key-does-not-exist",permalink:"/references/Lightning CLI/node-secret-key-does-not-exist",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/node-secret-key-does-not-exist.md",tags:[{label:"keystore",permalink:"/references/tags/keystore"},{label:"lost keys",permalink:"/references/tags/lost-keys"},{label:"ownership",permalink:"/references/tags/ownership"},{label:"file permissions",permalink:"/references/tags/file-permissions"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Node secret key does not exist",slug:"node-secret-key-does-not-exist",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},sidebar:"defaultSidebar",previous:{title:"Backing up the keystore",permalink:"/references/Lightning CLI/backing-up-the-keystore"},next:{title:"Permission denied (os error 13)",permalink:"/references/Lightning CLI/permission-denied-os-error-13"}},c={},d=[{value:"Node secret key does not exist",id:"node-secret-key-does-not-exist",level:2}],p={toc:d},m="wrapper";function u(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"node-secret-key-does-not-exist"},"Node secret key does not exist"),(0,o.kt)("p",null,'When watching the Fleek Network Lightning service log output, you find the "Node secret key does not exist" message as follows:'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"Error: Could not start the node.\n\nCaused by:\n Node Initialization failed: InitializationFailed(Tag as SignerInterface>, Node secret key does not exist. Use the CLI to generate keys.)\n")),(0,o.kt)("p",null,"Edit the ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning/config.toml")," to include the full location for the PEM files. For example, let's say that it's located under ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/skywalker")," that'd look like:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},'[signer]\nconsensus_key_path = "/home/skywalker/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/skywalker/.lightning/keystore/node.pem"\n')),(0,o.kt)("p",null,"To learn more about how file permissions and ownership work, you're advised to read the reference document ",(0,o.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/file-permissions-and-ownership"},"here"),"."),(0,o.kt)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}u.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294);const o=e=>{let{image:t,name:n,title:o,url:s,communityMember:i=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:s,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:s,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},o),r.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/44969bae.7e6abc6e.js b/assets/js/44969bae.7e6abc6e.js deleted file mode 100644 index 9fe3f8a83..000000000 --- a/assets/js/44969bae.7e6abc6e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4063],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=p(n),m=o,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||i;return n?r.createElement(h,a(a({ref:t},u),{},{components:n})):r.createElement(h,a({ref:t},u))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:o,a[1]=l;for(var p=2;p{n.d(t,{ZP:()=>l});var r=n(7462),o=(n(7294),n(3905));const i={toc:[{value:"Connection Pool (4x00-4x09)",id:"connection-pool-4x00-4x09",level:3},{value:"Consensus (4x10-4x19)",id:"consensus-4x10-4x19",level:3},{value:"Handshake (4x20-4x29)",id:"handshake-4x20-4x29",level:3},{value:"RPC (4x30-4x39)",id:"rpc-4x30-4x39",level:3},{value:"DHT (4x40-4x49)",id:"dht-4x40-4x49",level:3},{value:"Broadcast",id:"broadcast",level:3},{value:"Blockstore Server",id:"blockstore-server",level:3}]},a="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(a,(0,r.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully."),(0,o.kt)("p",null,"We reserve the following top level ranges:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"TCP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4200-4299")),(0,o.kt)("li",{parentName:"ul"},"UDP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4300-4399"))),(0,o.kt)("p",null,"Each service in the node has 10 ports reserved within each range."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"For the Node Operators who opt to run the ",(0,o.kt)("inlineCode",{parentName:"p"},"get.fleek.network")," assisted installer, the ports are verified if in use.")),(0,o.kt)("p",null,"The Node process requires the following ports:"),(0,o.kt)("h3",{id:"connection-pool-4x00-4x09"},"Connection Pool (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x00-4x09"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Netkit QUIC: ",(0,o.kt)("inlineCode",{parentName:"li"},"4300 (UDP)"))),(0,o.kt)("h3",{id:"consensus-4x10-4x19"},"Consensus (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x10-4x19"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Mempool: ",(0,o.kt)("inlineCode",{parentName:"li"},"4210 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"Primary: ",(0,o.kt)("inlineCode",{parentName:"li"},"4310 (UDP)")),(0,o.kt)("li",{parentName:"ul"},"Worker: ",(0,o.kt)("inlineCode",{parentName:"li"},"4311 (UDP)"))),(0,o.kt)("h3",{id:"handshake-4x20-4x29"},"Handshake (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x20-4x29"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"HTTP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4220 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"TCP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4221 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"WebRTC: ",(0,o.kt)("inlineCode",{parentName:"li"},"4320 (UDP)")),(0,o.kt)("li",{parentName:"ul"},"WebTransport: ",(0,o.kt)("inlineCode",{parentName:"li"},"4321 (UDP)"))),(0,o.kt)("h3",{id:"rpc-4x30-4x39"},"RPC (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x30-4x39"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"HTTP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4230 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"WebSocket / WebTransport?")),(0,o.kt)("h3",{id:"dht-4x40-4x49"},"DHT (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x40-4x49"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"UDP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4340 (UDP)"))),(0,o.kt)("h3",{id:"broadcast"},"Broadcast"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Uses connection pool")),(0,o.kt)("h3",{id:"blockstore-server"},"Blockstore Server"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Uses connection pool")),(0,o.kt)("admonition",{title:"required",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports.")))}l.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294);const o=e=>{let{image:t,name:n,title:o,url:i,communityMember:a=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:i,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:i,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},o),r.createElement("span",{className:"discord"},a?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},7159:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>h,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var r=n(7462),o=(n(7294),n(3905)),i=n(3872),a=n(7906);const l={title:"Requirements",hide_title:!0,description:"The requirements for the server specifications on which the Fleek Network Node can be installed and run.",tags:["requirements","server"],sidebarCollapsible:!1},s=void 0,p={unversionedId:"node/requirements",id:"node/requirements",title:"Requirements",description:"The requirements for the server specifications on which the Fleek Network Node can be installed and run.",source:"@site/docs/node/requirements.md",sourceDirName:"node",slug:"/node/requirements",permalink:"/docs/node/requirements",draft:!1,tags:[{label:"requirements",permalink:"/docs/tags/requirements"},{label:"server",permalink:"/docs/tags/server"}],version:"current",frontMatter:{title:"Requirements",hide_title:!0,description:"The requirements for the server specifications on which the Fleek Network Node can be installed and run.",tags:["requirements","server"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"Overview",permalink:"/docs/node/overview"},next:{title:"Testnet onboarding",permalink:"/docs/node/testnet-onboarding"}},u={},d=[{value:"Requirements",id:"requirements",level:2},{value:"Server",id:"server",level:2},{value:"Ports",id:"ports",level:2},{value:"Specs",id:"specs",level:2}],c={toc:d},m="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(m,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"requirements"},"Requirements"),(0,o.kt)("p",null,"This section provides the requirements for the server specifications on which the Fleek Network Node can be installed and run."),(0,o.kt)("admonition",{title:"warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Only 64-bits distributions are supported. Do not try to install it on a 32-bits operating system!")),(0,o.kt)("h2",{id:"server"},"Server"),(0,o.kt)("hr",null),(0,o.kt)("p",null,"The Fleek Network node binary is only supported by a Linux server. Currently, we are only providing support for the following distros:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Debian (>= 11)"),(0,o.kt)("li",{parentName:"ul"},"Ubuntu (>= 22.04 LTS)")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Support for other OS will be made available soon, e.g. CentOS and Fedora. Feel free to test running on older versions, but we reduce the number of versions to ease support and keep instructions less verbose, which should be easily translatable to your preferred OS Distro and Version. Any contributions to provide support for your favorite distro are welcomed! Feel free to ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network"},"open a PR")," in our repositories.")),(0,o.kt)("p",null,"Because of the use of Linux containerization technology, other operating systems, such as FreeBSD, OpenBSD, MacOS, Windows and others are not supported."),(0,o.kt)("p",null,"If you don\u2019t have a server or a spare machine, keep reading as we'll give you some hints on how to rent one, although we are not affiliated with any provider."),(0,o.kt)("h2",{id:"ports"},"Ports"),(0,o.kt)(a.ZP,{mdxType:"Ports"}),(0,o.kt)("h2",{id:"specs"},"Specs"),(0,o.kt)("hr",null),(0,o.kt)("p",null,"The recommended number of CPU cores is a minimum of 4 with a minimum CPU speed of 2.0 GHz. The Fleek Network node binary is only supported on CPUs that adhere to the x86_64 architecture (64-bit)."),(0,o.kt)("p",null,"A minimum of 32 GB of memory (RAM) is required and a reasonable amount of disk space for the installation and running processes, which at the minimum should be around 20 GB."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"We're mainly supporting ",(0,o.kt)("inlineCode",{parentName:"p"},"GenuineIntel")," and there have been reports of failure to build the binary on ",(0,o.kt)("inlineCode",{parentName:"p"},"AMD"),". The ",(0,o.kt)("inlineCode",{parentName:"p"},"ARM64")," is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference ",(0,o.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/error-building-on-arm64"},"error building on ARM64"),".")),(0,o.kt)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/44969bae.ff574e4c.js b/assets/js/44969bae.ff574e4c.js new file mode 100644 index 000000000..25b635416 --- /dev/null +++ b/assets/js/44969bae.ff574e4c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4063],{7767:(e,n,r)=>{r.d(n,{ZP:()=>t});var s=r(5893),i=r(1151);function o(e){const n={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully."}),"\n",(0,s.jsx)(n.p,{children:"We reserve the following top level ranges:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["TCP: ",(0,s.jsx)(n.code,{children:"4200-4299"})]}),"\n",(0,s.jsxs)(n.li,{children:["UDP: ",(0,s.jsx)(n.code,{children:"4300-4399"})]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Each service in the node has 10 ports reserved within each range."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsx)(n.p,{children:"For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node."})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["For the Node Operators who opt to run the ",(0,s.jsx)(n.code,{children:"get.fleek.network"})," assisted installer, the ports are verified if in use."]})}),"\n",(0,s.jsx)(n.p,{children:"The Node process requires the following ports:"}),"\n",(0,s.jsxs)(n.h3,{id:"connection-pool-4x00-4x09",children:["Connection Pool (",(0,s.jsx)(n.code,{children:"4x00-4x09"}),")"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Netkit QUIC: ",(0,s.jsx)(n.code,{children:"4300 (UDP)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"consensus-4x10-4x19",children:["Consensus (",(0,s.jsx)(n.code,{children:"4x10-4x19"}),")"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Mempool: ",(0,s.jsx)(n.code,{children:"4210 (TCP)"})]}),"\n",(0,s.jsxs)(n.li,{children:["Primary: ",(0,s.jsx)(n.code,{children:"4310 (UDP)"})]}),"\n",(0,s.jsxs)(n.li,{children:["Worker: ",(0,s.jsx)(n.code,{children:"4311 (UDP)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"handshake-4x20-4x29",children:["Handshake (",(0,s.jsx)(n.code,{children:"4x20-4x29"}),")"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["HTTP: ",(0,s.jsx)(n.code,{children:"4220 (TCP)"})]}),"\n",(0,s.jsxs)(n.li,{children:["TCP: ",(0,s.jsx)(n.code,{children:"4221 (TCP)"})]}),"\n",(0,s.jsxs)(n.li,{children:["WebRTC: ",(0,s.jsx)(n.code,{children:"4320 (UDP)"})]}),"\n",(0,s.jsxs)(n.li,{children:["WebTransport: ",(0,s.jsx)(n.code,{children:"4321 (UDP)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"rpc-4x30-4x39",children:["RPC (",(0,s.jsx)(n.code,{children:"4x30-4x39"}),")"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["HTTP: ",(0,s.jsx)(n.code,{children:"4230 (TCP)"})]}),"\n",(0,s.jsx)(n.li,{children:"WebSocket / WebTransport?"}),"\n"]}),"\n",(0,s.jsxs)(n.h3,{id:"dht-4x40-4x49",children:["DHT (",(0,s.jsx)(n.code,{children:"4x40-4x49"}),")"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["UDP: ",(0,s.jsx)(n.code,{children:"4340 (UDP)"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"broadcast",children:"Broadcast"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Uses connection pool"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"blockstore-server",children:"Blockstore Server"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Uses connection pool"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"required",type:"caution",children:(0,s.jsx)(n.p,{children:"The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports."})})]})}function t(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},6019:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>p,frontMatter:()=>d,metadata:()=>c,toc:()=>h});var s=r(5893),i=r(1151),o=r(3872),t=r(7767);const d={title:"Requirements",hide_title:!0,description:"The requirements for the server specifications on which the Fleek Network Node can be installed and run.",tags:["requirements","server"],sidebarCollapsible:!1},l=void 0,c={id:"node/requirements",title:"Requirements",description:"The requirements for the server specifications on which the Fleek Network Node can be installed and run.",source:"@site/docs/node/requirements.md",sourceDirName:"node",slug:"/node/requirements",permalink:"/docs/node/requirements",draft:!1,unlisted:!1,tags:[{label:"requirements",permalink:"/docs/tags/requirements"},{label:"server",permalink:"/docs/tags/server"}],version:"current",frontMatter:{title:"Requirements",hide_title:!0,description:"The requirements for the server specifications on which the Fleek Network Node can be installed and run.",tags:["requirements","server"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"Overview",permalink:"/docs/node/overview"},next:{title:"Testnet onboarding",permalink:"/docs/node/testnet-onboarding"}},a={},h=[{value:"Requirements",id:"requirements",level:2},{value:"Server",id:"server",level:2},{value:"Ports",id:"ports",level:2},{value:"Specs",id:"specs",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",hr:"hr",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"requirements",children:"Requirements"}),"\n",(0,s.jsx)(n.p,{children:"This section provides the requirements for the server specifications on which the Fleek Network Node can be installed and run."}),"\n",(0,s.jsx)(n.admonition,{title:"warning",type:"caution",children:(0,s.jsx)(n.p,{children:"Only 64-bits distributions are supported. Do not try to install it on a 32-bits operating system!"})}),"\n",(0,s.jsx)(n.h2,{id:"server",children:"Server"}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:"The Fleek Network node binary is only supported by a Linux server. Currently, we are only providing support for the following distros:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Debian (>= 11)"}),"\n",(0,s.jsx)(n.li,{children:"Ubuntu (>= 22.04 LTS)"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Support for other OS will be made available soon, e.g. CentOS and Fedora. Feel free to test running on older versions, but we reduce the number of versions to ease support and keep instructions less verbose, which should be easily translatable to your preferred OS Distro and Version. Any contributions to provide support for your favorite distro are welcomed! Feel free to ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network",children:"open a PR"})," in our repositories."]})}),"\n",(0,s.jsx)(n.p,{children:"Because of the use of Linux containerization technology, other operating systems, such as FreeBSD, OpenBSD, MacOS, Windows and others are not supported."}),"\n",(0,s.jsx)(n.p,{children:"If you don\u2019t have a server or a spare machine, keep reading as we'll give you some hints on how to rent one, although we are not affiliated with any provider."}),"\n",(0,s.jsx)(n.h2,{id:"ports",children:"Ports"}),"\n",(0,s.jsx)(t.ZP,{}),"\n",(0,s.jsx)(n.h2,{id:"specs",children:"Specs"}),"\n",(0,s.jsx)(n.hr,{}),"\n",(0,s.jsx)(n.p,{children:"The recommended number of CPU cores is a minimum of 4 with a minimum CPU speed of 2.0 GHz. The Fleek Network node binary is only supported on CPUs that adhere to the x86_64 architecture (64-bit)."}),"\n",(0,s.jsx)(n.p,{children:"A minimum of 32 GB of memory (RAM) is required and a reasonable amount of disk space for the installation and running processes, which at the minimum should be around 20 GB."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["We're mainly supporting ",(0,s.jsx)(n.code,{children:"GenuineIntel"})," and there have been reports of failure to build the binary on ",(0,s.jsx)(n.code,{children:"AMD"}),". The ",(0,s.jsx)(n.code,{children:"ARM64"})," is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference ",(0,s.jsx)(n.a,{href:"/references/Lightning%20CLI/error-building-on-arm64",children:"error building on ARM64"}),"."]})}),"\n",(0,s.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},3872:(e,n,r)=>{r.d(n,{Z:()=>i});r(7294);var s=r(5893);const i=e=>{let{image:n,name:r,title:i,url:o,communityMember:t=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:o,target:"_blank",alt:r,children:(0,s.jsx)("img",{src:n,alt:r})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:o,target:"_blank",alt:r,children:r})}),(0,s.jsx)("span",{className:"title",children:i}),(0,s.jsxs)("span",{className:"discord",children:[t?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,r)=>{r.d(n,{Z:()=>d,a:()=>t});var s=r(7294);const i={},o=s.createContext(i);function t(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/45ac3af8.59f3bef9.js b/assets/js/45ac3af8.cf7a9fd9.js similarity index 87% rename from assets/js/45ac3af8.59f3bef9.js rename to assets/js/45ac3af8.cf7a9fd9.js index 0987216ff..7ec52f6b7 100644 --- a/assets/js/45ac3af8.59f3bef9.js +++ b/assets/js/45ac3af8.cf7a9fd9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5204],{5796:e=>{e.exports=JSON.parse('{"label":"systemctl","permalink":"/docs/tags/systemctl","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5204],{5796:e=>{e.exports=JSON.parse('{"label":"systemctl","permalink":"/docs/tags/systemctl","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/45c86e35.7db05553.js b/assets/js/45c86e35.17e3d245.js similarity index 93% rename from assets/js/45c86e35.7db05553.js rename to assets/js/45c86e35.17e3d245.js index a98708a64..f4dafaab1 100644 --- a/assets/js/45c86e35.7db05553.js +++ b/assets/js/45c86e35.17e3d245.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9847],{2316:e=>{e.exports=JSON.parse('{"label":"about","permalink":"/docs/tags/about","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9847],{2316:e=>{e.exports=JSON.parse('{"label":"about","permalink":"/docs/tags/about","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/45e1a117.149c1b9d.js b/assets/js/45e1a117.340acc3e.js similarity index 88% rename from assets/js/45e1a117.149c1b9d.js rename to assets/js/45e1a117.340acc3e.js index 61b0dd76b..cd1666930 100644 --- a/assets/js/45e1a117.149c1b9d.js +++ b/assets/js/45e1a117.340acc3e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6696],{5382:e=>{e.exports=JSON.parse('{"label":"frozen","permalink":"/references/tags/frozen","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6696],{5382:e=>{e.exports=JSON.parse('{"label":"frozen","permalink":"/references/tags/frozen","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/469c924f.1b5727ea.js b/assets/js/469c924f.9a76c610.js similarity index 82% rename from assets/js/469c924f.1b5727ea.js rename to assets/js/469c924f.9a76c610.js index 8131c123a..b13792cd7 100644 --- a/assets/js/469c924f.1b5727ea.js +++ b/assets/js/469c924f.9a76c610.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2240],{342:a=>{a.exports=JSON.parse('{"label":"Roadmap","permalink":"/docs/tags/roadmap","allTagsPath":"/docs/tags","count":1,"items":[{"id":"roadmap","title":"Roadmap","description":"Fleek Network\'s high-level roadmap per stage. Devnet, Testnet, and Mainnet.","permalink":"/docs/roadmap"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2240],{342:a=>{a.exports=JSON.parse('{"label":"Roadmap","permalink":"/docs/tags/roadmap","allTagsPath":"/docs/tags","count":1,"items":[{"id":"roadmap","title":"Roadmap","description":"Fleek Network\'s high-level roadmap per stage. Devnet, Testnet, and Mainnet.","permalink":"/docs/roadmap"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/48857ff6.d7494b7e.js b/assets/js/48857ff6.ba1d9243.js similarity index 91% rename from assets/js/48857ff6.d7494b7e.js rename to assets/js/48857ff6.ba1d9243.js index 3fe81a65e..570db4bb3 100644 --- a/assets/js/48857ff6.d7494b7e.js +++ b/assets/js/48857ff6.ba1d9243.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2908],{1014:e=>{e.exports=JSON.parse('{"label":"Open source","permalink":"/docs/tags/open-source","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"},{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2908],{1014:e=>{e.exports=JSON.parse('{"label":"Open source","permalink":"/docs/tags/open-source","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"},{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/48e81e49.381d2121.js b/assets/js/48e81e49.5ac56e34.js similarity index 89% rename from assets/js/48e81e49.381d2121.js rename to assets/js/48e81e49.5ac56e34.js index a527fb693..3f791ad9d 100644 --- a/assets/js/48e81e49.381d2121.js +++ b/assets/js/48e81e49.5ac56e34.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[173],{5121:e=>{e.exports=JSON.parse('{"label":"incentives","permalink":"/docs/tags/incentives","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[173],{5121:e=>{e.exports=JSON.parse('{"label":"incentives","permalink":"/docs/tags/incentives","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/4972.0a28dda3.js b/assets/js/4972.0a28dda3.js deleted file mode 100644 index 8cdab0c5e..000000000 --- a/assets/js/4972.0a28dda3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4972],{4972:(e,t,a)=>{a.r(t),a.d(t,{default:()=>c});var n=a(7294),l=a(5999),o=a(833),r=a(8888);function c(){return n.createElement(n.Fragment,null,n.createElement(o.d,{title:(0,l.I)({id:"theme.NotFound.title",message:"Page Not Found"})}),n.createElement(r.Z,null,n.createElement("main",{className:"container margin-vert--xl"},n.createElement("div",{className:"row"},n.createElement("div",{className:"col col--6 col--offset-3"},n.createElement("h1",{className:"hero__title"},n.createElement(l.Z,{id:"theme.NotFound.title",description:"The title of the 404 page"},"Page Not Found")),n.createElement("p",null,n.createElement(l.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page"},"We could not find what you were looking for.")),n.createElement("p",null,n.createElement(l.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page"},"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))))}}}]); \ No newline at end of file diff --git a/assets/js/49b5e83d.31ceddd4.js b/assets/js/49b5e83d.bb00ad8f.js similarity index 85% rename from assets/js/49b5e83d.31ceddd4.js rename to assets/js/49b5e83d.bb00ad8f.js index c25463033..87ec631f6 100644 --- a/assets/js/49b5e83d.31ceddd4.js +++ b/assets/js/49b5e83d.bb00ad8f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[402],{3969:a=>{a.exports=JSON.parse('{"label":"manual","permalink":"/docs/tags/manual","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[402],{3969:a=>{a.exports=JSON.parse('{"label":"manual","permalink":"/docs/tags/manual","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/4a821728.447bd46f.js b/assets/js/4a821728.3a30c2cd.js similarity index 93% rename from assets/js/4a821728.447bd46f.js rename to assets/js/4a821728.3a30c2cd.js index c86d1902d..99d11a1fa 100644 --- a/assets/js/4a821728.447bd46f.js +++ b/assets/js/4a821728.3a30c2cd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9513],{9748:e=>{e.exports=JSON.parse('{"label":"whitepaper","permalink":"/docs/tags/whitepaper","allTagsPath":"/docs/tags","count":2,"items":[{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9513],{9748:e=>{e.exports=JSON.parse('{"label":"whitepaper","permalink":"/docs/tags/whitepaper","allTagsPath":"/docs/tags","count":2,"items":[{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/4beaa780.28992a2f.js b/assets/js/4beaa780.9c9386ab.js similarity index 82% rename from assets/js/4beaa780.28992a2f.js rename to assets/js/4beaa780.9c9386ab.js index af03ad97a..3c2750250 100644 --- a/assets/js/4beaa780.28992a2f.js +++ b/assets/js/4beaa780.9c9386ab.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5081],{380:e=>{e.exports=JSON.parse('{"label":"reputation","permalink":"/docs/tags/reputation","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5081],{380:e=>{e.exports=JSON.parse('{"label":"reputation","permalink":"/docs/tags/reputation","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/4c027320.0ae961df.js b/assets/js/4c027320.9f0993f7.js similarity index 95% rename from assets/js/4c027320.0ae961df.js rename to assets/js/4c027320.9f0993f7.js index a7ba2bf22..e4d92ec6a 100644 --- a/assets/js/4c027320.0ae961df.js +++ b/assets/js/4c027320.9f0993f7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9511],{2564:t=>{t.exports=JSON.parse('{"label":"Getting Started","permalink":"/guides/tags/getting-started","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","permalink":"/guides/Node Operators/getting-started"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9511],{2564:t=>{t.exports=JSON.parse('{"label":"Getting Started","permalink":"/guides/tags/getting-started","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","permalink":"/guides/Node Operators/getting-started"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/4c9535f7.6cbde464.js b/assets/js/4c9535f7.6cbde464.js new file mode 100644 index 000000000..86918f8d3 --- /dev/null +++ b/assets/js/4c9535f7.6cbde464.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6296],{9237:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>p,frontMatter:()=>c,metadata:()=>l,toc:()=>u});var i=t(5893),r=t(1151),o=t(3872),s=t(3183),a=t(8432);const c={title:"Running a node in Docker",hide_title:!0,slug:"running-a-node-in-docker",image:"./assets/running-a-node-in-docker.png?202311181211",date:new Date("2023-09-18T17:00:00.000Z"),description:"A guide on how to run Fleek Network's node in a Docker container",category:"Tutorial",tags:["guide","docker","container"]},d=void 0,l={id:"Node Operators/running-a-node-in-docker",title:"Running a node in Docker",description:"A guide on how to run Fleek Network's node in a Docker container",source:"@site/guides/Node Operators/running-a-node-in-docker.md",sourceDirName:"Node Operators",slug:"/Node Operators/running-a-node-in-docker",permalink:"/guides/Node Operators/running-a-node-in-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/running-a-node-in-docker.md",tags:[{label:"guide",permalink:"/guides/tags/guide"},{label:"docker",permalink:"/guides/tags/docker"},{label:"container",permalink:"/guides/tags/container"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Running a node in Docker",hide_title:!0,slug:"running-a-node-in-docker",image:"./assets/running-a-node-in-docker.png?202311181211",date:"2023-09-18T17:00:00.000Z",description:"A guide on how to run Fleek Network's node in a Docker container",category:"Tutorial",tags:["guide","docker","container"]},sidebar:"defaultSidebar",previous:{title:"Managing the keystore",permalink:"/guides/Node Operators/managing-the-keystore"},next:{title:"Transfering setup ownership",permalink:"/guides/Node Operators/transfering-setup-ownership"}},h={image:t(3451).Z},u=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"For the impatient",id:"for-the-impatient",level:2},{value:"Pull and run image",id:"pull-and-run-image",level:3},{value:"Setup",id:"setup",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Create a user",id:"create-a-user",level:3},{value:"Lightning CLI source code",id:"lightning-cli-source-code",level:3},{value:"Change directory to Lightning source code",id:"change-directory-to-lightning-source-code",level:3},{value:"Install Docker",id:"install-docker",level:3},{value:"Create the Docker image",id:"create-the-docker-image",level:3},{value:"Build the Docker image",id:"build-the-docker-image",level:3},{value:"Docker Container",id:"docker-container",level:2},{value:"Generate keys",id:"generate-keys",level:2},{value:"Run the Docker Container as Systemd Service",id:"run-the-docker-container-as-systemd-service",level:2},{value:"Create the Systemd Service Unit",id:"create-the-systemd-service-unit",level:3},{value:"Viewing logs",id:"viewing-logs",level:2},{value:"Conclusion",id:"conclusion",level:2}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Running a node in Docker",src:t(8597).Z+"",width:"1450",height:"816"})}),"\n","\n","\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsxs)(n.p,{children:["Our ",(0,i.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/images/",children:"image"})," provides all the requirements to have Fleek Network running quickly and the following guide will provide you a quick reference to get you started with Docker."]}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, if you need a deep dive into Docker, check the official getting started ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/get-started/",children:"here"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["TL;DR If you have Docker experience then you'll find our ",(0,i.jsx)(n.a,{href:"#for-the-impatient",children:"for the impatient"})," sufficient to get started."]}),"\n",(0,i.jsx)(n.h2,{id:"pre-requisites",children:"Pre-requisites"}),"\n",(0,i.jsx)(n.p,{children:"To follow the guide, you will need the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Familiarity with the command-line interface"}),"\n",(0,i.jsx)(n.li,{children:"Git"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"for-the-impatient",children:"For the impatient"}),"\n",(0,i.jsxs)(n.p,{children:["Building a Docker image requires some effort and some of our users might find it easier to pull our ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/pkgs/container/lightning",children:"latest image"})," for quick access to Lightning CLI, which doesn't require them to build from source."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The Docker Container image for Lightning is located at ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/pkgs/container/lightning",children:"https://github.com/fleek-network/lightning/pkgs/container/lightning"}),"."]})}),"\n",(0,i.jsx)(n.h3,{id:"pull-and-run-image",children:"Pull and run image"}),"\n",(0,i.jsx)(n.p,{children:"You can pull and run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it ghcr.io/fleek-network/lightning:latest\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["Keys have to be generated when launching the service. On Docker run, if the ",(0,i.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"keystore"})," is not found, the keys are automatically generated and stored in the Docker host's ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"})," directory. To learn more about how to manage the keystore, visit the ",(0,i.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"managing keystore"})," section."]})}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"caution",children:(0,i.jsxs)(n.p,{children:["The Docker image is tied to a CPU architecture, make sure that you have verified the ",(0,i.jsx)(n.a,{href:"/docs/node/requirements#specs",children:"required"})," specifications to run the container successfully."]})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The command has a list of ports ",(0,i.jsx)(n.code,{children:"-p"})," values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ",(0,i.jsx)(n.a,{href:"/docs/node/requirements#ports",children:"ports"})," to find the latest updates."]})}),"\n",(0,i.jsx)(n.h2,{id:"setup",children:"Setup"}),"\n",(0,i.jsx)(n.h3,{id:"requirements",children:"Requirements"}),"\n",(0,i.jsx)(n.p,{children:"To follow the guide successfully, a good amount of memory and disk space is necessary to run Docker. The main reason for our use-case is that your host machine requires a generous amount of memory and disk space, for the containers."}),"\n",(0,i.jsxs)(n.p,{children:["For this guide, we used a server with the 4vCPU, 32\xa0GB ram memory and 20 GB disk space specifications. Learn more about the recommended specifications ",(0,i.jsx)(n.a,{href:"/docs/node/requirements",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"create-a-user",children:"Create a user"}),"\n",(0,i.jsx)(a.ZP,{}),"\n",(0,i.jsx)(n.h3,{id:"lightning-cli-source-code",children:"Lightning CLI source code"}),"\n",(0,i.jsxs)(n.p,{children:["Start by cloning the repository located at ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"https://github.com/fleek-network/lightning"}),"."]}),"\n",(0,i.jsx)(s.ZP,{}),"\n",(0,i.jsx)(n.h3,{id:"change-directory-to-lightning-source-code",children:"Change directory to Lightning source code"}),"\n",(0,i.jsxs)(n.p,{children:["If you have cloned the project correctly, you should ",(0,i.jsx)(n.code,{children:"change directory"})," to the project source code directory which by default is ",(0,i.jsx)(n.code,{children:"~/fleek-network/lightning"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cd ~/fleek-network/lightning\n"})}),"\n",(0,i.jsxs)(n.p,{children:["At time of writing, this is how the project root looks like (e.g. use the ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Ls",children:"ls"})," to see the list):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:".\n\u251c\u2500\u2500 CODE_OF_CONDUCT.md\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Cargo.lock\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 codecov.yml\n\u251c\u2500\u2500 core\n\u251c\u2500\u2500 docs\n\u251c\u2500\u2500 etc\n\u251c\u2500\u2500 lib\n\u251c\u2500\u2500 rust-toolchain\n\u251c\u2500\u2500 rustfmt.toml\n\u251c\u2500\u2500 services\n\u2514\u2500\u2500 target\n"})}),"\n",(0,i.jsx)(n.h3,{id:"install-docker",children:"Install Docker"}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["To keep our guide short, we're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems ",(0,i.jsx)(n.a,{href:"/docs/node/requirements#server",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"First, update the existing list of packages:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo apt update\n"})}),"\n",(0,i.jsx)(n.p,{children:"Next, install the required packages to let apt use packages over HTTPS:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo apt install apt-transport-https ca-certificates software-properties-common\n"})}),"\n",(0,i.jsx)(n.p,{children:"Add the GPG key for the official Docker repository to your system:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\n"})}),"\n",(0,i.jsx)(n.p,{children:"Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"\n'})}),"\n",(0,i.jsx)(n.p,{children:"Set to install from the Docker repo instead of the default Ubuntu repo:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"apt-cache policy docker-ce\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"docker-ce:\n Installed: (none)\n Candidate: 5:24.0.6-1~ubuntu.22.04~jammy\n Version table:\n 5:24.0.6-1~ubuntu.22.04~jammy 500\n 500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n 5:24.0.6-1~ubuntu.22.04~jammy 500\n"})}),"\n",(0,i.jsx)(n.p,{children:"Finally, install Docker:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo apt install docker-ce\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once complete you should be able to run it via the CLI, as such:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"docker -v\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here's the output (versions might differ a bit from the time of writing):"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"Docker version 24.0.6, build ed223bc\n"})}),"\n",(0,i.jsx)(n.p,{children:"The following command's output will indicate if Docker's working correctly:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo docker run hello-world\n"})}),"\n",(0,i.jsx)(n.p,{children:"Here's an example of the output you'll find us \"Hello from Docker!\":"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'Hello from Docker!\nThis message shows that your installation appears to be working correctly.\n\nTo generate this message, Docker took the following steps:\n 1. The Docker client contacted the Docker daemon.\n 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.\n (amd64)\n 3. The Docker daemon created a new container from that image which runs the\n executable that produces the output you are currently reading.\n 4. The Docker daemon streamed that output to the Docker client, which sent it\n to your terminal.\n\nTo try something more ambitious, you can run an Ubuntu container with:\n $ docker run -it ubuntu bash\n\nShare images, automate workflows, and more with a free Docker ID:\n https://hub.docker.com/\n\nFor more examples and ideas, visit:\n https://docs.docker.com/get-started/\n'})}),"\n",(0,i.jsx)(n.p,{children:"Run all the commands above in your terminal, to confirm everything's working before proceeding to the next steps."}),"\n",(0,i.jsx)(n.h3,{id:"create-the-docker-image",children:"Create the Docker image"}),"\n",(0,i.jsx)(n.p,{children:"A Docker image is a read-only template with instructions for creating a Docker container, like a template. Docker images also act as a starting point when using Docker."}),"\n",(0,i.jsx)(n.p,{children:'The starting point for our use-case is a Dockerfile, where all those "template instructions" are declared.'}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.a,{href:"https://raw.githubusercontent.com/fleek-network/lightning/main/Dockerfile",children:"Dockerfile"})," should exist in the repository source code, so make sure you have ",(0,i.jsx)(n.a,{href:"#change-directory-to-lightning-source-code",children:"change directory to the lightning source code"})," to find it."]}),"\n",(0,i.jsx)(n.h3,{id:"build-the-docker-image",children:"Build the Docker image"}),"\n",(0,i.jsxs)(n.p,{children:["Build the image named as ",(0,i.jsx)(n.code,{children:"lightning"})," from our Dockerfile:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo docker build -t lightning -f ./Dockerfile .\n"})}),"\n",(0,i.jsx)(n.p,{children:"The build process takes awhile, and you have to wait for completion."}),"\n",(0,i.jsx)(n.p,{children:"The output should be similar to:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"[+] Building 1.2s (16/16) FINISHED docker:default\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 990B 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/library/debian:bullseye-slim 0.6s\n => [internal] load metadata for docker.io/library/rust:latest 0.9s\n => [stage-1 1/3] FROM docker.io/library/debian:bullseye-slim@sha256:3bc5e94a0e8329c102203c3f5f26fd67835f0c81633dd6949de0557867a87fac 0.0s\n => [builder 1/7] FROM docker.io/library/rust:latest@sha256:8a4ca3ca75afbc97bcf5362e9a694fe049d15734fbbaf82b8b7e224616c1254b 0.0s\n => [internal] load build context 0.3s\n => => transferring context: 948.93kB 0.3s\n => CACHED [stage-1 2/3] RUN DEBIAN_FRONTEND=noninteractive apt-get update -yq && DEBIAN_FRONTEND=noninteractive apt-get install -yq libs 0.0s\n => CACHED [builder 2/7] WORKDIR /lightning 0.0s\n => CACHED [builder 3/7] RUN apt-get update 0.0s\n => CACHED [builder 4/7] RUN apt-get install -y build-essential cmake clang pkg-config libssl-dev gcc protobuf-comp 0.0s\n => CACHED [builder 5/7] RUN --mount=type=cache,target=/usr/local/cargo/registry cargo install cargo-strip 0.0s\n => CACHED [builder 6/7] COPY . . 0.0s\n => CACHED [builder 7/7] RUN --mount=type=cache,target=/usr/local/cargo/registry --mount=type=cache,target=/lightning/target cargo buil 0.0s\n => CACHED [stage-1 3/3] COPY --from=builder /lightning/target/release/lightning-node /usr/local/bin/lgtn 0.0s\n => exporting to image 0.0s\n => => exporting layers 0.0s\n => => writing image sha256:e8e5ed19f59c3cc6a9add5bdb578c464904e9789d5f386cc4af81044c062d998 0.0s\n => => naming to docker.io/library/lightning\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The Docker image is only required to be built once and/or, when changes are pulled from the remote repository, or specific versions you might be interested in. Otherwise, you're not required to build it every time to run the node. If you'd like to learn how to update the Lightning CLI, find our references ",(0,i.jsx)(n.a,{href:"/references/Lightning%20CLI/update-cli-from-source-code",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"If you don't update your source code and binary build often, you won't have the latest changes, which should happen frequently to take advantage of all the ongoing development. This is quite important to understand, as it causes confusion to some users. The Lightning application at time of writing does not update automatically."})}),"\n",(0,i.jsx)(n.h2,{id:"docker-container",children:"Docker Container"}),"\n",(0,i.jsxs)(n.p,{children:["A container is what's originated from the image we discussed in the section ",(0,i.jsx)(n.a,{href:"#build-the-docker-image",children:"build the docker image"}),", it is a run-able instance of an image. We can create, start, stop, move, or delete a container using the Docker API or CLI."]}),"\n",(0,i.jsx)(n.p,{children:"Following up, we'll learn how to run the Docker container that includes our Lightning CLI program, built from our Dockerfile."}),"\n",(0,i.jsxs)(n.p,{children:["Once the ",(0,i.jsx)(n.a,{href:"#build-the-docker-image",children:"Docker image"})," is ready, run the container based on the image ",(0,i.jsx)(n.code,{children:"lightning"}),". Effectively running the Fleek Network Lightning node process:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it ghcr.io/fleek-network/lightning:latest\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Notice that the command arguments we pass are for the flag's ",(0,i.jsx)(n.code,{children:"-p"})," port numbers, ",(0,i.jsx)(n.code,{children:"-v"})," to bind mount a location in your host to a container path (useful to persist your configuration files, e.g. keystore), ",(0,i.jsx)(n.code,{children:"--name"})," to make it easier to identify, ",(0,i.jsx)(n.code,{children:"-it"})," to make it interactive (e.g. presents output to the terminal), and the image name we ",(0,i.jsx)(n.a,{href:"#build-the-docker-image",children:"built earlier"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:'The output would look as the following, showing the error message "Node is not whitelisted" (this error message is due to the testnet phase that requires nodes to be whitelisted to run successfully):'}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"thread 'main' panicked at 'Node is not whitelisted. Please join the Fleek Discord to get invited.', core/cli/src/testnet_sync.rs:45:9\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n/root/init: line 7: 7 Aborted (core dumped) lgtn run\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Keys have to be generated when launching the service. On Docker run, if the ",(0,i.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"keystore"})," is not found, the keys are automatically generated and stored in the Docker host's ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"})," directory."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Have in mind that the ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/config.toml"})," is where the keystore location paths are configured, which default value is in the user ",(0,i.jsx)(n.code,{children:"$HOME"})," path. The users who customize or modify the default location, need to apply the required customizations. To learn more about how to manage the keystore, visit the ",(0,i.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"managing keystore"})," section."]})}),"\n",(0,i.jsx)(n.h2,{id:"generate-keys",children:"Generate keys"}),"\n",(0,i.jsxs)(n.p,{children:["Execute the ",(0,i.jsx)(n.code,{children:"keys generate"})," command on the container ",(0,i.jsx)(n.code,{children:"lightning-node"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo docker exec -it lightning-node lgtn keys generate\n"})}),"\n",(0,i.jsxs)(n.p,{children:["We've bound the host path ",(0,i.jsx)(n.code,{children:"~/.lightning"})," into the container ",(0,i.jsx)(n.code,{children:"/home/lgtn/.lightning"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You can list the contents of the ",(0,i.jsx)(n.code,{children:"~/.lightning"}),", where you should find the ",(0,i.jsx)(n.code,{children:"config.toml"})," and ",(0,i.jsx)(n.code,{children:"keystore"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:".\n..\nconfig.toml\nkeystore\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You only have to run the ",(0,i.jsx)(n.code,{children:"keys generate"})," once from your host."]}),"\n",(0,i.jsx)(n.p,{children:"Finally, you can start the Fleek Network node by running the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo docker start lightning-node\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"lightning-node"})," is the name we provided on first run as described in ",(0,i.jsx)(n.a,{href:"#docker-container",children:"docker container"})," section. If you have set a different name, change accordingly."]})}),"\n",(0,i.jsx)(n.h2,{id:"run-the-docker-container-as-systemd-service",children:"Run the Docker Container as Systemd Service"}),"\n",(0,i.jsxs)(n.p,{children:["In this section we\u2019ll cover how to wrap a Docker Container as a Systemd Service without the need for third party tools or complex commands. Some reasons include, minimizing the dependency on the Docker Daemon as we can move to an ",(0,i.jsx)(n.a,{href:"https://opencontainers.org/",children:"OCI complaint solution"})," other that Docker at anytime, or the fact we recommend Systemd Service Units and Systemctl to control the Service in our ",(0,i.jsx)(n.a,{href:"/docs/node/install",children:"Native install"})," that most users are familiar. Our goal is to provide guidance to the widest audience possible, if you have other preferences on managing your service that is more fitting to your needs that's fine."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Docker recommends using their cross-platform built-in restart policy for running a Container as a Service. For that, configure your Docker service to ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/install/linux/linux-postinstall/#configure-docker-to-start-on-boot",children:"start on system boot"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Systemd was specifically developed to serve the purpose of stopping services, dependency checking and recovery of failed services. You can have your host start, stop, enable, check the status, and generally manage a container as a Systemd Service."}),"\n",(0,i.jsx)(n.h3,{id:"create-the-systemd-service-unit",children:"Create the Systemd Service Unit"}),"\n",(0,i.jsxs)(n.p,{children:["We are going to create the unit configuration file in the /etc/systemd/system/ directory. The Service Unit is going to be named as ",(0,i.jsx)(n.code,{children:"docker-lightning.service"}),". To create the file run the following command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo touch /etc/systemd/system/docker-lightning.service\n"})}),"\n",(0,i.jsx)(n.p,{children:"Open the file in your favorite text editor and populate with the content found here:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nRestart=always\nRestartSec=5\nTimeoutStartSec=0\nExecStartPre=-/usr/bin/docker kill lightning-node\nExecStartPre=-/usr/bin/docker rm lightning-node\nExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest\nExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest\nExecStop=/usr/bin/docker stop lightning-node\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,i.jsx)(n.p,{children:"Once the file is saved, change the file permissions by running the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo chmod 644 /etc/systemd/system/docker-lightning.service\n"})}),"\n",(0,i.jsx)(n.p,{children:"Next, reload the Systemctl Daemon:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,i.jsx)(n.p,{children:"Enable the service on startup when the system boots:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo systemctl enable docker-lightning.service\n"})}),"\n",(0,i.jsxs)(n.p,{children:["As a result, we are now able to run our containers as a Systemd service. For this, read the document ",(0,i.jsx)(n.a,{href:"/docs/node/install#use-systemctl-to-manage-systemd-service",children:"manage systemd service"})," to find more about how to control the service."]}),"\n",(0,i.jsx)(n.h2,{id:"viewing-logs",children:"Viewing logs"}),"\n",(0,i.jsx)(n.p,{children:"To view the logs of a Docker container in real time, use the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo docker logs -f lightning-node\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you have wrapped the ",(0,i.jsx)(n.a,{href:"#run-the-docker-container-as-systemd-service",children:"docker container as a systemd service"}),", you can use the same commands found when installed natively, such as:"]}),"\n",(0,i.jsx)(n.p,{children:"For standard output:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/output.log\n"})}),"\n",(0,i.jsx)(n.p,{children:"Or, the standard error:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/diagnostic.log\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Learn more about how to ",(0,i.jsx)(n.a,{href:"/docs/node/analyzing-logs",children:"analyze log messages"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"Containers are a way to have a self-contained environment that includes all necessary dependencies, libraries, software, amongst others required to run an application."}),"\n",(0,i.jsxs)(n.p,{children:["Fleek Network's Lightning is developed with ",(0,i.jsx)(n.a,{href:"https://www.rust-lang.org/",children:"Rust"}),", a general-purpose programming language, that requires several dependencies and libraries to compile the project. Some of these libraries are not installed by default and require some troubleshooting for the end user. ",(0,i.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," provides us with containers, self-containing all the required libraries for the purpose of running Lightning, our application."]}),"\n",(0,i.jsxs)(n.p,{children:["We guided you through the initial installation steps, and how to build a ",(0,i.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})," image, which then's used to Docker run a container. Plus, provided lower-level commands, to help you understand other present or advanced use-cases, and also at higher level, offerring simple utility methods."]}),"\n",(0,i.jsxs)(n.p,{children:["While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our ",(0,i.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"Discord"})," or by opening a ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network",children:"PR"})," in any of our repositories."]}),"\n",(0,i.jsxs)(n.p,{children:["Discover more about the project by ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"watching/contributing on Github"}),", following us on ",(0,i.jsx)(n.a,{href:"https://twitter.com/fleek_net",children:"Twitter"}),", and joining ",(0,i.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"our community Discord"})," for all the best updates!"]}),"\n",(0,i.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(g,{...e})}):g(e)}},8432:(e,n,t)=>{t.d(n,{ZP:()=>s});var i=t(5893),r=t(1151);function o(e){const n={admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["We recommend creating a ",(0,i.jsx)(n.code,{children:"non-root"})," user with administrative privileges. It'll allow us to install any system requirements."]}),"\n",(0,i.jsxs)(n.p,{children:["You can create a new user and add to the ",(0,i.jsx)(n.strong,{children:"sudo"})," group by running:"]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["For our example, we'll be using the name ",(0,i.jsx)(n.code,{children:"lgtn"})," but you can pick whichever you'd like. If you already have a ",(0,i.jsx)(n.strong,{children:"sudoer"})," account, you can skip this step."]})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo adduser lgtn\n"})}),"\n",(0,i.jsxs)(n.p,{children:["After completing the ",(0,i.jsx)(n.code,{children:"adduser"})," steps, execute the ",(0,i.jsx)(n.code,{children:"usermod"})," to add the ",(0,i.jsx)(n.code,{children:"user"})," to the ",(0,i.jsx)(n.strong,{children:"sudo"})," group, as follows:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo usermod -aG sudo lgtn\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Switch to the new ",(0,i.jsx)(n.strong,{children:"user"})," by using the command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"su lgtn\n"})}),"\n",(0,i.jsx)(n.p,{children:"Change the directory to the new user's home, as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cd /home/lgtn\n"})})]})}function s(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},3183:(e,n,t)=>{t.d(n,{ZP:()=>s});var i=t(5893),r=t(1151);function o(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsx)(n.p,{children:"You have several ways of doing this:"}),(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Clone via HTTPS"}),"\n",(0,i.jsx)(n.li,{children:"Clone via SSH"}),"\n",(0,i.jsx)(n.li,{children:"Download via Github CLI"}),"\n",(0,i.jsxs)(n.li,{children:["Download the ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip",children:"zip package"})," from the repository"]}),"\n"]}),(0,i.jsxs)(n.p,{children:["We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,i.jsx)(n.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh",children:"here"}),"."]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git \n"})}),(0,i.jsxs)(n.p,{children:["At time of writing, we are checking the branch name ",(0,i.jsx)(n.code,{children:"testnet-alpha-1"})," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"})})]})}function s(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>r});t(7294);var i=t(5893);const r=e=>{let{image:n,name:t,title:r,url:o,communityMember:s=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:o,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:o,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:r}),(0,i.jsxs)("span",{className:"discord",children:[s?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},3451:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/running-a-node-in-docker-cc0a5b3fda558b4b6dd40022fe5dd09f.png"},8597:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/running-a-node-in-docker-cc0a5b3fda558b4b6dd40022fe5dd09f.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>s});var i=t(7294);const r={},o=i.createContext(r);function s(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c9535f7.9ccfa098.js b/assets/js/4c9535f7.9ccfa098.js deleted file mode 100644 index 03cd0e87e..000000000 --- a/assets/js/4c9535f7.9ccfa098.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6296],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=c(n),h=r,m=u["".concat(s,".").concat(h)]||u[h]||p[h]||o;return n?a.createElement(m,i(i({ref:t},d),{},{components:n})):a.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>p});var a=n(7462),r=(n(7294),n(3905)),o=n(3872),i=n(2915),l=n(6733);const s={title:"Running a node in Docker",hide_title:!0,slug:"running-a-node-in-docker",image:"./assets/running-a-node-in-docker.png?202311181211",date:new Date("2023-09-18T17:00:00.000Z"),description:"A guide on how to run Fleek Network's node in a Docker container",category:"Tutorial",tags:["guide","docker","container"]},c=void 0,d={unversionedId:"Node Operators/running-a-node-in-docker",id:"Node Operators/running-a-node-in-docker",title:"Running a node in Docker",description:"A guide on how to run Fleek Network's node in a Docker container",source:"@site/guides/Node Operators/running-a-node-in-docker.md",sourceDirName:"Node Operators",slug:"/Node Operators/running-a-node-in-docker",permalink:"/guides/Node Operators/running-a-node-in-docker",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/running-a-node-in-docker.md",tags:[{label:"guide",permalink:"/guides/tags/guide"},{label:"docker",permalink:"/guides/tags/docker"},{label:"container",permalink:"/guides/tags/container"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Running a node in Docker",hide_title:!0,slug:"running-a-node-in-docker",image:"./assets/running-a-node-in-docker.png?202311181211",date:"2023-09-18T17:00:00.000Z",description:"A guide on how to run Fleek Network's node in a Docker container",category:"Tutorial",tags:["guide","docker","container"]},sidebar:"defaultSidebar",previous:{title:"Managing the keystore",permalink:"/guides/Node Operators/managing-the-keystore"},next:{title:"Transfering setup ownership",permalink:"/guides/Node Operators/transfering-setup-ownership"}},u={image:n(8597).Z},p=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"For the impatient",id:"for-the-impatient",level:2},{value:"Pull and run image",id:"pull-and-run-image",level:3},{value:"Setup",id:"setup",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Create a user",id:"create-a-user",level:3},{value:"Lightning CLI source code",id:"lightning-cli-source-code",level:3},{value:"Change directory to Lightning source code",id:"change-directory-to-lightning-source-code",level:3},{value:"Install Docker",id:"install-docker",level:3},{value:"Create the Docker image",id:"create-the-docker-image",level:3},{value:"Build the Docker image",id:"build-the-docker-image",level:3},{value:"Docker Container",id:"docker-container",level:2},{value:"Generate keys",id:"generate-keys",level:2},{value:"Run the Docker Container as Systemd Service",id:"run-the-docker-container-as-systemd-service",level:2},{value:"Create the Systemd Service Unit",id:"create-the-systemd-service-unit",level:3},{value:"Viewing logs",id:"viewing-logs",level:2},{value:"Conclusion",id:"conclusion",level:2}],h={toc:p},m="wrapper";function g(e){let{components:t,...s}=e;return(0,r.kt)(m,(0,a.Z)({},h,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Running a node in Docker",src:n(8597).Z,width:"1450",height:"816"})),(0,r.kt)("h2",{id:"introduction"},"Introduction"),(0,r.kt)("p",null,"Our ",(0,r.kt)("a",{parentName:"p",href:"https://www.docker.com/"},"Docker")," ",(0,r.kt)("a",{parentName:"p",href:"https://docs.docker.com/engine/reference/commandline/images/"},"image")," provides all the requirements to have Fleek Network running quickly and the following guide will provide you a quick reference to get you started with Docker. "),(0,r.kt)("p",null,"Alternatively, if you need a deep dive into Docker, check the official getting started ",(0,r.kt)("a",{parentName:"p",href:"https://docs.docker.com/get-started/"},"here"),"."),(0,r.kt)("p",null,"TL;DR If you have Docker experience then you'll find our ",(0,r.kt)("a",{parentName:"p",href:"#for-the-impatient"},"for the impatient")," sufficient to get started."),(0,r.kt)("h2",{id:"pre-requisites"},"Pre-requisites"),(0,r.kt)("p",null,"To follow the guide, you will need the following:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Familiarity with the command-line interface"),(0,r.kt)("li",{parentName:"ul"},"Git")),(0,r.kt)("h2",{id:"for-the-impatient"},"For the impatient"),(0,r.kt)("p",null,"Building a Docker image requires some effort and some of our users might find it easier to pull our ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/pkgs/container/lightning"},"latest image")," for quick access to Lightning CLI, which doesn't require them to build from source."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The Docker Container image for Lightning is located at ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/pkgs/container/lightning"},"https://github.com/fleek-network/lightning/pkgs/container/lightning"),".")),(0,r.kt)("h3",{id:"pull-and-run-image"},"Pull and run image"),(0,r.kt)("p",null,"You can pull and run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it ghcr.io/fleek-network/lightning:latest\n")),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"Keys have to be generated when launching the service. On Docker run, if the ",(0,r.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"keystore")," is not found, the keys are automatically generated and stored in the Docker host's ",(0,r.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore")," directory. To learn more about how to manage the keystore, visit the ",(0,r.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"managing keystore")," section.")),(0,r.kt)("admonition",{title:"warning",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The Docker image is tied to a CPU architecture, make sure that you have verified the ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/requirements#specs"},"required")," specifications to run the container successfully.")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The command has a list of ports ",(0,r.kt)("inlineCode",{parentName:"p"},"-p")," values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/requirements#ports"},"ports")," to find the latest updates.")),(0,r.kt)("h2",{id:"setup"},"Setup"),(0,r.kt)("h3",{id:"requirements"},"Requirements"),(0,r.kt)("p",null,"To follow the guide successfully, a good amount of memory and disk space is necessary to run Docker. The main reason for our use-case is that your host machine requires a generous amount of memory and disk space, for the containers."),(0,r.kt)("p",null,"For this guide, we used a server with the 4vCPU, 32\xa0GB ram memory and 20 GB disk space specifications. Learn more about the recommended specifications ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"here"),"."),(0,r.kt)("h3",{id:"create-a-user"},"Create a user"),(0,r.kt)(l.ZP,{mdxType:"CreateAUser"}),(0,r.kt)("h3",{id:"lightning-cli-source-code"},"Lightning CLI source code"),(0,r.kt)("p",null,"Start by cloning the repository located at ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"https://github.com/fleek-network/lightning"),"."),(0,r.kt)(i.ZP,{mdxType:"GitCloneOptions"}),(0,r.kt)("h3",{id:"change-directory-to-lightning-source-code"},"Change directory to Lightning source code"),(0,r.kt)("p",null,"If you have cloned the project correctly, you should ",(0,r.kt)("inlineCode",{parentName:"p"},"change directory")," to the project source code directory which by default is ",(0,r.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~/fleek-network/lightning\n")),(0,r.kt)("p",null,"At time of writing, this is how the project root looks like (e.g. use the ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Ls"},"ls")," to see the list):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},".\n\u251c\u2500\u2500 CODE_OF_CONDUCT.md\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Cargo.lock\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 codecov.yml\n\u251c\u2500\u2500 core\n\u251c\u2500\u2500 docs\n\u251c\u2500\u2500 etc\n\u251c\u2500\u2500 lib\n\u251c\u2500\u2500 rust-toolchain\n\u251c\u2500\u2500 rustfmt.toml\n\u251c\u2500\u2500 services\n\u2514\u2500\u2500 target\n")),(0,r.kt)("h3",{id:"install-docker"},"Install Docker"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"To keep our guide short, we're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"here"),".")),(0,r.kt)("p",null,"First, update the existing list of packages:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt update\n")),(0,r.kt)("p",null,"Next, install the required packages to let apt use packages over HTTPS:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install apt-transport-https ca-certificates software-properties-common\n")),(0,r.kt)("p",null,"Add the GPG key for the official Docker repository to your system:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\n")),(0,r.kt)("p",null,"Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"\n')),(0,r.kt)("p",null,"Set to install from the Docker repo instead of the default Ubuntu repo:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"apt-cache policy docker-ce\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"docker-ce:\n Installed: (none)\n Candidate: 5:24.0.6-1~ubuntu.22.04~jammy\n Version table:\n 5:24.0.6-1~ubuntu.22.04~jammy 500\n 500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages\n 5:24.0.6-1~ubuntu.22.04~jammy 500\n")),(0,r.kt)("p",null,"Finally, install Docker:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install docker-ce\n")),(0,r.kt)("p",null,"Once complete you should be able to run it via the CLI, as such:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"docker -v\n")),(0,r.kt)("p",null,"Here's the output (versions might differ a bit from the time of writing):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"Docker version 24.0.6, build ed223bc\n")),(0,r.kt)("p",null,"The following command's output will indicate if Docker's working correctly:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker run hello-world\n")),(0,r.kt)("p",null,"Here's an example of the output you'll find us \"Hello from Docker!\":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'Hello from Docker!\nThis message shows that your installation appears to be working correctly.\n\nTo generate this message, Docker took the following steps:\n 1. The Docker client contacted the Docker daemon.\n 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.\n (amd64)\n 3. The Docker daemon created a new container from that image which runs the\n executable that produces the output you are currently reading.\n 4. The Docker daemon streamed that output to the Docker client, which sent it\n to your terminal.\n\nTo try something more ambitious, you can run an Ubuntu container with:\n $ docker run -it ubuntu bash\n\nShare images, automate workflows, and more with a free Docker ID:\n https://hub.docker.com/\n\nFor more examples and ideas, visit:\n https://docs.docker.com/get-started/\n')),(0,r.kt)("p",null,"Run all the commands above in your terminal, to confirm everything's working before proceeding to the next steps."),(0,r.kt)("h3",{id:"create-the-docker-image"},"Create the Docker image"),(0,r.kt)("p",null,"A Docker image is a read-only template with instructions for creating a Docker container, like a template. Docker images also act as a starting point when using Docker. "),(0,r.kt)("p",null,'The starting point for our use-case is a Dockerfile, where all those "template instructions" are declared.'),(0,r.kt)("p",null,"A ",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/fleek-network/lightning/main/Dockerfile"},"Dockerfile")," should exist in the repository source code, so make sure you have ",(0,r.kt)("a",{parentName:"p",href:"#change-directory-to-lightning-source-code"},"change directory to the lightning source code")," to find it."),(0,r.kt)("h3",{id:"build-the-docker-image"},"Build the Docker image"),(0,r.kt)("p",null,"Build the image named as ",(0,r.kt)("inlineCode",{parentName:"p"},"lightning")," from our Dockerfile:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker build -t lightning -f ./Dockerfile .\n")),(0,r.kt)("p",null,"The build process takes awhile, and you have to wait for completion. "),(0,r.kt)("p",null,"The output should be similar to:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"[+] Building 1.2s (16/16) FINISHED docker:default\n => [internal] load build definition from Dockerfile 0.0s\n => => transferring dockerfile: 990B 0.0s\n => [internal] load .dockerignore 0.0s\n => => transferring context: 2B 0.0s\n => [internal] load metadata for docker.io/library/debian:bullseye-slim 0.6s\n => [internal] load metadata for docker.io/library/rust:latest 0.9s\n => [stage-1 1/3] FROM docker.io/library/debian:bullseye-slim@sha256:3bc5e94a0e8329c102203c3f5f26fd67835f0c81633dd6949de0557867a87fac 0.0s\n => [builder 1/7] FROM docker.io/library/rust:latest@sha256:8a4ca3ca75afbc97bcf5362e9a694fe049d15734fbbaf82b8b7e224616c1254b 0.0s\n => [internal] load build context 0.3s\n => => transferring context: 948.93kB 0.3s\n => CACHED [stage-1 2/3] RUN DEBIAN_FRONTEND=noninteractive apt-get update -yq && DEBIAN_FRONTEND=noninteractive apt-get install -yq libs 0.0s\n => CACHED [builder 2/7] WORKDIR /lightning 0.0s\n => CACHED [builder 3/7] RUN apt-get update 0.0s\n => CACHED [builder 4/7] RUN apt-get install -y build-essential cmake clang pkg-config libssl-dev gcc protobuf-comp 0.0s\n => CACHED [builder 5/7] RUN --mount=type=cache,target=/usr/local/cargo/registry cargo install cargo-strip 0.0s\n => CACHED [builder 6/7] COPY . . 0.0s\n => CACHED [builder 7/7] RUN --mount=type=cache,target=/usr/local/cargo/registry --mount=type=cache,target=/lightning/target cargo buil 0.0s\n => CACHED [stage-1 3/3] COPY --from=builder /lightning/target/release/lightning-node /usr/local/bin/lgtn 0.0s\n => exporting to image 0.0s\n => => exporting layers 0.0s\n => => writing image sha256:e8e5ed19f59c3cc6a9add5bdb578c464904e9789d5f386cc4af81044c062d998 0.0s\n => => naming to docker.io/library/lightning\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The Docker image is only required to be built once and/or, when changes are pulled from the remote repository, or specific versions you might be interested in. Otherwise, you're not required to build it every time to run the node. If you'd like to learn how to update the Lightning CLI, find our references ",(0,r.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/update-cli-from-source-code"},"here"),".")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"If you don't update your source code and binary build often, you won't have the latest changes, which should happen frequently to take advantage of all the ongoing development. This is quite important to understand, as it causes confusion to some users. The Lightning application at time of writing does not update automatically.")),(0,r.kt)("h2",{id:"docker-container"},"Docker Container"),(0,r.kt)("p",null,"A container is what's originated from the image we discussed in the section ",(0,r.kt)("a",{parentName:"p",href:"#build-the-docker-image"},"build the docker image"),", it is a run-able instance of an image. We can create, start, stop, move, or delete a container using the Docker API or CLI."),(0,r.kt)("p",null,"Following up, we'll learn how to run the Docker container that includes our Lightning CLI program, built from our Dockerfile."),(0,r.kt)("p",null,"Once the ",(0,r.kt)("a",{parentName:"p",href:"#build-the-docker-image"},"Docker image")," is ready, run the container based on the image ",(0,r.kt)("inlineCode",{parentName:"p"},"lightning"),". Effectively running the Fleek Network Lightning node process:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it ghcr.io/fleek-network/lightning:latest\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Notice that the command arguments we pass are for the flag's ",(0,r.kt)("inlineCode",{parentName:"p"},"-p")," port numbers, ",(0,r.kt)("inlineCode",{parentName:"p"},"-v")," to bind mount a location in your host to a container path (useful to persist your configuration files, e.g. keystore), ",(0,r.kt)("inlineCode",{parentName:"p"},"--name")," to make it easier to identify, ",(0,r.kt)("inlineCode",{parentName:"p"},"-it")," to make it interactive (e.g. presents output to the terminal), and the image name we ",(0,r.kt)("a",{parentName:"p",href:"#build-the-docker-image"},"built earlier"),".")),(0,r.kt)("p",null,'The output would look as the following, showing the error message "Node is not whitelisted" (this error message is due to the testnet phase that requires nodes to be whitelisted to run successfully):'),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"thread 'main' panicked at 'Node is not whitelisted. Please join the Fleek Discord to get invited.', core/cli/src/testnet_sync.rs:45:9\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n/root/init: line 7: 7 Aborted (core dumped) lgtn run\n")),(0,r.kt)("p",null,"Keys have to be generated when launching the service. On Docker run, if the ",(0,r.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"keystore")," is not found, the keys are automatically generated and stored in the Docker host's ",(0,r.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore")," directory."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Have in mind that the ",(0,r.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/config.toml")," is where the keystore location paths are configured, which default value is in the user ",(0,r.kt)("inlineCode",{parentName:"p"},"$HOME")," path. The users who customize or modify the default location, need to apply the required customizations. To learn more about how to manage the keystore, visit the ",(0,r.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"managing keystore")," section.")),(0,r.kt)("h2",{id:"generate-keys"},"Generate keys"),(0,r.kt)("p",null,"Execute the ",(0,r.kt)("inlineCode",{parentName:"p"},"keys generate")," command on the container ",(0,r.kt)("inlineCode",{parentName:"p"},"lightning-node"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker exec -it lightning-node lgtn keys generate\n")),(0,r.kt)("p",null,"We've bound the host path ",(0,r.kt)("inlineCode",{parentName:"p"},"~/.lightning")," into the container ",(0,r.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning"),"."),(0,r.kt)("p",null,"You can list the contents of the ",(0,r.kt)("inlineCode",{parentName:"p"},"~/.lightning"),", where you should find the ",(0,r.kt)("inlineCode",{parentName:"p"},"config.toml")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"keystore"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},".\n..\nconfig.toml\nkeystore\n")),(0,r.kt)("p",null,"You only have to run the ",(0,r.kt)("inlineCode",{parentName:"p"},"keys generate")," once from your host."),(0,r.kt)("p",null,"Finally, you can start the Fleek Network node by running the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker start lightning-node\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The ",(0,r.kt)("inlineCode",{parentName:"p"},"lightning-node")," is the name we provided on first run as described in ",(0,r.kt)("a",{parentName:"p",href:"#docker-container"},"docker container")," section. If you have set a different name, change accordingly.")),(0,r.kt)("h2",{id:"run-the-docker-container-as-systemd-service"},"Run the Docker Container as Systemd Service"),(0,r.kt)("p",null,"In this section we\u2019ll cover how to wrap a Docker Container as a Systemd Service without the need for third party tools or complex commands. Some reasons include, minimizing the dependency on the Docker Daemon as we can move to an ",(0,r.kt)("a",{parentName:"p",href:"https://opencontainers.org/"},"OCI complaint solution")," other that Docker at anytime, or the fact we recommend Systemd Service Units and Systemctl to control the Service in our ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install"},"Native install")," that most users are familiar. Our goal is to provide guidance to the widest audience possible, if you have other preferences on managing your service that is more fitting to your needs that's fine."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Docker recommends using their cross-platform built-in restart policy for running a Container as a Service. For that, configure your Docker service to ",(0,r.kt)("a",{parentName:"p",href:"https://docs.docker.com/install/linux/linux-postinstall/#configure-docker-to-start-on-boot"},"start on system boot"),".")),(0,r.kt)("p",null,"Systemd was specifically developed to serve the purpose of stopping services, dependency checking and recovery of failed services. You can have your host start, stop, enable, check the status, and generally manage a container as a Systemd Service."),(0,r.kt)("h3",{id:"create-the-systemd-service-unit"},"Create the Systemd Service Unit"),(0,r.kt)("p",null,"We are going to create the unit configuration file in the /etc/systemd/system/ directory. The Service Unit is going to be named as ",(0,r.kt)("inlineCode",{parentName:"p"},"docker-lightning.service"),". To create the file run the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo touch /etc/systemd/system/docker-lightning.service\n")),(0,r.kt)("p",null,"Open the file in your favorite text editor and populate with the content found here:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nRestart=always\nRestartSec=5\nTimeoutStartSec=0\nExecStartPre=-/usr/bin/docker kill lightning-node\nExecStartPre=-/usr/bin/docker rm lightning-node\nExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest\nExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest\nExecStop=/usr/bin/docker stop lightning-node\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\n\n[Install]\nWantedBy=multi-user.target\n")),(0,r.kt)("p",null,"Once the file is saved, change the file permissions by running the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo chmod 644 /etc/systemd/system/docker-lightning.service\n")),(0,r.kt)("p",null,"Next, reload the Systemctl Daemon:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,r.kt)("p",null,"Enable the service on startup when the system boots:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable docker-lightning.service\n")),(0,r.kt)("p",null,"As a result, we are now able to run our containers as a Systemd service. For this, read the document ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#use-systemctl-to-manage-systemd-service"},"manage systemd service")," to find more about how to control the service."),(0,r.kt)("h2",{id:"viewing-logs"},"Viewing logs"),(0,r.kt)("p",null,"To view the logs of a Docker container in real time, use the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker logs -f lightning-node\n")),(0,r.kt)("p",null,"If you have wrapped the ",(0,r.kt)("a",{parentName:"p",href:"#run-the-docker-container-as-systemd-service"},"docker container as a systemd service"),", you can use the same commands found when installed natively, such as:"),(0,r.kt)("p",null,"For standard output:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/output.log\n")),(0,r.kt)("p",null,"Or, the standard error:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/diagnostic.log\n")),(0,r.kt)("p",null,"Learn more about how to ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/analyzing-logs"},"analyze log messages"),"."),(0,r.kt)("h2",{id:"conclusion"},"Conclusion"),(0,r.kt)("p",null,"Containers are a way to have a self-contained environment that includes all necessary dependencies, libraries, software, amongst others required to run an application."),(0,r.kt)("p",null,"Fleek Network's Lightning is developed with ",(0,r.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/"},"Rust"),", a general-purpose programming language, that requires several dependencies and libraries to compile the project. Some of these libraries are not installed by default and require some troubleshooting for the end user. ",(0,r.kt)("a",{parentName:"p",href:"https://www.docker.com/"},"Docker")," provides us with containers, self-containing all the required libraries for the purpose of running Lightning, our application."),(0,r.kt)("p",null,"We guided you through the initial installation steps, and how to build a ",(0,r.kt)("a",{parentName:"p",href:"https://www.docker.com/"},"Docker")," image, which then's used to Docker run a container. Plus, provided lower-level commands, to help you understand other present or advanced use-cases, and also at higher level, offerring simple utility methods."),(0,r.kt)("p",null,"While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our ",(0,r.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"Discord")," or by opening a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fleek-network"},"PR")," in any of our repositories."),(0,r.kt)("p",null,"Discover more about the project by ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"watching/contributing on Github"),", following us on ",(0,r.kt)("a",{parentName:"p",href:"https://twitter.com/fleek_net"},"Twitter"),", and joining ",(0,r.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"our community Discord")," for all the best updates!"),(0,r.kt)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}g.isMDXComponent=!0},6733:(e,t,n)=>{n.d(t,{ZP:()=>l});var a=n(7462),r=(n(7294),n(3905));const o={toc:[]},i="wrapper";function l(e){let{components:t,...n}=e;return(0,r.kt)(i,(0,a.Z)({},o,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"We recommend creating a ",(0,r.kt)("inlineCode",{parentName:"p"},"non-root")," user with administrative privileges. It'll allow us to install any system requirements."),(0,r.kt)("p",null,"You can create a new user and add to the ",(0,r.kt)("strong",{parentName:"p"},"sudo")," group by running:"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For our example, we'll be using the name ",(0,r.kt)("inlineCode",{parentName:"p"},"lgtn")," but you can pick whichever you'd like. If you already have a ",(0,r.kt)("strong",{parentName:"p"},"sudoer")," account, you can skip this step.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo adduser lgtn\n")),(0,r.kt)("p",null,"After completing the ",(0,r.kt)("inlineCode",{parentName:"p"},"adduser")," steps, execute the ",(0,r.kt)("inlineCode",{parentName:"p"},"usermod")," to add the ",(0,r.kt)("inlineCode",{parentName:"p"},"user")," to the ",(0,r.kt)("strong",{parentName:"p"},"sudo")," group, as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo usermod -aG sudo lgtn\n")),(0,r.kt)("p",null,"Switch to the new ",(0,r.kt)("strong",{parentName:"p"},"user")," by using the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"su lgtn\n")),(0,r.kt)("p",null,"Change the directory to the new user's home, as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"cd /home/lgtn\n")))}l.isMDXComponent=!0},2915:(e,t,n)=>{n.d(t,{ZP:()=>l});var a=n(7462),r=(n(7294),n(3905));const o={toc:[]},i="wrapper";function l(e){let{components:t,...n}=e;return(0,r.kt)(i,(0,a.Z)({},o,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"You have several ways of doing this:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"Clone via HTTPS"),(0,r.kt)("li",{parentName:"ul"},"Clone via SSH"),(0,r.kt)("li",{parentName:"ul"},"Download via Github CLI"),(0,r.kt)("li",{parentName:"ul"},"Download the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip"},"zip package")," from the repository")),(0,r.kt)("p",{parentName:"admonition"},"We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,r.kt)("a",{parentName:"p",href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh"},"here"),"."),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git \n")),(0,r.kt)("p",{parentName:"admonition"},"At time of writing, we are checking the branch name ",(0,r.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1")," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"))))}l.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(7294);const r=e=>{let{image:t,name:n,title:r,url:o,communityMember:i=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:o,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:o,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},r),a.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},8597:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/running-a-node-in-docker-cc0a5b3fda558b4b6dd40022fe5dd09f.png"}}]); \ No newline at end of file diff --git a/assets/js/4d7007b2.4b984760.js b/assets/js/4d7007b2.4b984760.js new file mode 100644 index 000000000..8544de01e --- /dev/null +++ b/assets/js/4d7007b2.4b984760.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6272],{2482:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var r=n(5893),s=n(1151);const o=n.p+"assets/images/banner-references-a0368a847f1d60e338779105f44a9e9a.png",i={title:"About references",hide_title:!0,sidebar_position:1,tags:["References","Help"]},a=void 0,c={id:"index",title:"About references",description:"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.",source:"@site/references/index.md",sourceDirName:".",slug:"/",permalink:"/references/",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/index.md",tags:[{label:"References",permalink:"/references/tags/references"},{label:"Help",permalink:"/references/tags/help"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",sidebarPosition:1,frontMatter:{title:"About references",hide_title:!0,sidebar_position:1,tags:["References","Help"]},sidebar:"defaultSidebar",next:{title:"Build and run in Docker",permalink:"/references/Docker/build-and-run-in-docker"}},d={},l=[];function f(e){const t={a:"a",p:"p",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("img",{className:"banner",src:o}),"\n",(0,r.jsx)(t.p,{children:"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference."}),"\n",(0,r.jsxs)(t.p,{children:["It differs from ",(0,r.jsx)(t.a,{href:"/guides",children:"Guides"})," which is more descriptive or verbose when providing instructions and how-to's."]}),"\n",(0,r.jsx)(t.p,{children:"To start, find references by consulting the available categories to locate the appropriate content on the sidebar. Our references are also available as a result when using the search feature located at the very top of the documentation site."})]})}function u(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(f,{...e})}):f(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var r=n(7294);const s={},o=r.createContext(s);function i(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4d7007b2.73a373f9.js b/assets/js/4d7007b2.73a373f9.js deleted file mode 100644 index e8b080106..000000000 --- a/assets/js/4d7007b2.73a373f9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6272],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),f=l(r),d=o,m=f["".concat(s,".").concat(d)]||f[d]||u[d]||a;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[f]="string"==typeof e?e:o,i[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const a=r.p+"assets/images/banner-references-a0368a847f1d60e338779105f44a9e9a.png",i={title:"About references",hide_title:!0,sidebar_position:1,tags:["References","Help"]},c=void 0,s={unversionedId:"index",id:"index",title:"About references",description:"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.",source:"@site/references/index.md",sourceDirName:".",slug:"/",permalink:"/references/",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/index.md",tags:[{label:"References",permalink:"/references/tags/references"},{label:"Help",permalink:"/references/tags/help"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",sidebarPosition:1,frontMatter:{title:"About references",hide_title:!0,sidebar_position:1,tags:["References","Help"]},sidebar:"defaultSidebar",next:{title:"Build and run in Docker",permalink:"/references/Docker/build-and-run-in-docker"}},l={},p=[],f={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},f,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("img",{className:"banner",src:a}),(0,o.kt)("p",null,"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference."),(0,o.kt)("p",null,"It differs from ",(0,o.kt)("a",{parentName:"p",href:"/guides"},"Guides")," which is more descriptive or verbose when providing instructions and how-to's."),(0,o.kt)("p",null,"To start, find references by consulting the available categories to locate the appropriate content on the sidebar. Our references are also available as a result when using the search feature located at the very top of the documentation site."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/50f02954.171a32d5.js b/assets/js/50f02954.c6206aff.js similarity index 96% rename from assets/js/50f02954.171a32d5.js rename to assets/js/50f02954.c6206aff.js index 64f713e3d..92fe9fbf4 100644 --- a/assets/js/50f02954.171a32d5.js +++ b/assets/js/50f02954.c6206aff.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4826],{3900:e=>{e.exports=JSON.parse('{"label":"systemd","permalink":"/references/tags/systemd","allTagsPath":"/references/tags","count":3,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4826],{3900:e=>{e.exports=JSON.parse('{"label":"systemd","permalink":"/references/tags/systemd","allTagsPath":"/references/tags","count":3,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/514cab6e.8af2ed2b.js b/assets/js/514cab6e.8af2ed2b.js new file mode 100644 index 000000000..1ad79446a --- /dev/null +++ b/assets/js/514cab6e.8af2ed2b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6410],{5673:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var t=o(5893),i=o(1151);const r={draft:!1,title:"Code of Conduct",date:new Date("2023-01-15T09:00:00.000Z"),description:"Contributor Covenant Code of Conduct",category:"Documentation",keywords:["conduct","contributor"],tags:["standards","pledge","contribute","code of conduct"]},a=void 0,s={id:"Open-source/code-of-conduct",title:"Code of Conduct",description:"Contributor Covenant Code of Conduct",source:"@site/docs/Open-source/code-of-conduct.md",sourceDirName:"Open-source",slug:"/Open-source/code-of-conduct",permalink:"/docs/Open-source/code-of-conduct",draft:!1,unlisted:!1,tags:[{label:"standards",permalink:"/docs/tags/standards"},{label:"pledge",permalink:"/docs/tags/pledge"},{label:"contribute",permalink:"/docs/tags/contribute"},{label:"code of conduct",permalink:"/docs/tags/code-of-conduct"}],version:"current",frontMatter:{draft:!1,title:"Code of Conduct",date:"2023-01-15T09:00:00.000Z",description:"Contributor Covenant Code of Conduct",category:"Documentation",keywords:["conduct","contributor"],tags:["standards","pledge","contribute","code of conduct"]},sidebar:"docs",previous:{title:"Roadmap",permalink:"/docs/roadmap"},next:{title:"Contributing",permalink:"/docs/Open-source/contributing"}},c={},d=[{value:"Our Pledge",id:"our-pledge",level:2},{value:"Our Standards",id:"our-standards",level:2},{value:"Our Responsibilities",id:"our-responsibilities",level:2},{value:"Scope",id:"scope",level:2},{value:"Enforcement",id:"enforcement",level:2},{value:"Attribution",id:"attribution",level:2}];function l(e){const n={a:"a",h2:"h2",li:"li",p:"p",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"our-pledge",children:"Our Pledge"}),"\n",(0,t.jsx)(n.p,{children:"In the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to make participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation."}),"\n",(0,t.jsx)(n.h2,{id:"our-standards",children:"Our Standards"}),"\n",(0,t.jsx)(n.p,{children:"Examples of behavior that contributes to a positive environment for our\ncommunity include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Demonstrating empathy and kindness toward other people"}),"\n",(0,t.jsx)(n.li,{children:"Being respectful of differing opinions, viewpoints, and experiences"}),"\n",(0,t.jsx)(n.li,{children:"Giving and gracefully accepting constructive feedback"}),"\n",(0,t.jsx)(n.li,{children:"Accepting responsibility and apologizing to those affected by our mistakes,\nand learning from the experience"}),"\n",(0,t.jsx)(n.li,{children:"Focusing on what is best not just for us as individuals, but for the\noverall community"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Examples of unacceptable behavior include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The use of sexualized language or imagery, and sexual attention or\nadvances"}),"\n",(0,t.jsx)(n.li,{children:"Trolling, insulting or derogatory comments, and personal or political attacks"}),"\n",(0,t.jsx)(n.li,{children:"Public or private harassment"}),"\n",(0,t.jsx)(n.li,{children:"Publishing others' private information, such as a physical or email\naddress, without their explicit permission"}),"\n",(0,t.jsx)(n.li,{children:"Other conduct which could reasonably be considered inappropriate in a\nprofessional setting"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"our-responsibilities",children:"Our Responsibilities"}),"\n",(0,t.jsx)(n.p,{children:"Project maintainers are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior."}),"\n",(0,t.jsx)(n.p,{children:"Project maintainers have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, or to ban\ntemporarily or permanently any contributor for other behaviors that they deem\ninappropriate, threatening, offensive, or harmful."}),"\n",(0,t.jsx)(n.h2,{id:"scope",children:"Scope"}),"\n",(0,t.jsx)(n.p,{children:"This Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event."}),"\n",(0,t.jsx)(n.h2,{id:"enforcement",children:"Enforcement"}),"\n",(0,t.jsx)(n.p,{children:"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at Fleek Network Discord.\nAll complaints will be reviewed and investigated promptly and fairly."}),"\n",(0,t.jsx)(n.p,{children:"All community leaders are obligated to respect the privacy and security of the\nreporter of any incident."}),"\n",(0,t.jsx)(n.h2,{id:"attribution",children:"Attribution"}),"\n",(0,t.jsxs)(n.p,{children:["This Code of Conduct is adapted from the ",(0,t.jsx)(n.a,{href:"https://contributor-covenant.org/",children:"Contributor Covenant"}),", version\n",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/version/1/4/code-of-conduct/code_of_conduct.md",children:"1.4"})," and\n",(0,t.jsx)(n.a,{href:"https://www.contributor-covenant.org/version/2/0/code_of_conduct/code_of_conduct.md",children:"2.0"}),",\nand was generated by ",(0,t.jsx)(n.a,{href:"https://github.com/bttger/contributing-gen",children:"contributing-gen"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,n,o)=>{o.d(n,{Z:()=>s,a:()=>a});var t=o(7294);const i={},r=t.createContext(i);function a(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/514cab6e.e8c2eaad.js b/assets/js/514cab6e.e8c2eaad.js deleted file mode 100644 index 4e4071751..000000000 --- a/assets/js/514cab6e.e8c2eaad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6410],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),s=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return o.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=s(n),f=r,m=u["".concat(l,".").concat(f)]||u[f]||p[f]||a;return n?o.createElement(m,i(i({ref:t},d),{},{components:n})):o.createElement(m,i({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[u]="string"==typeof e?e:r,i[1]=c;for(var s=2;s{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>s});var o=n(7462),r=(n(7294),n(3905));const a={draft:!1,title:"Code of Conduct",date:new Date("2023-01-15T09:00:00.000Z"),description:"Contributor Covenant Code of Conduct",category:"Documentation",keywords:["conduct","contributor"],tags:["standards","pledge","contribute","code of conduct"]},i=void 0,c={unversionedId:"Open-source/code-of-conduct",id:"Open-source/code-of-conduct",title:"Code of Conduct",description:"Contributor Covenant Code of Conduct",source:"@site/docs/Open-source/code-of-conduct.md",sourceDirName:"Open-source",slug:"/Open-source/code-of-conduct",permalink:"/docs/Open-source/code-of-conduct",draft:!1,tags:[{label:"standards",permalink:"/docs/tags/standards"},{label:"pledge",permalink:"/docs/tags/pledge"},{label:"contribute",permalink:"/docs/tags/contribute"},{label:"code of conduct",permalink:"/docs/tags/code-of-conduct"}],version:"current",frontMatter:{draft:!1,title:"Code of Conduct",date:"2023-01-15T09:00:00.000Z",description:"Contributor Covenant Code of Conduct",category:"Documentation",keywords:["conduct","contributor"],tags:["standards","pledge","contribute","code of conduct"]},sidebar:"docs",previous:{title:"Roadmap",permalink:"/docs/roadmap"},next:{title:"Contributing",permalink:"/docs/Open-source/contributing"}},l={},s=[{value:"Our Pledge",id:"our-pledge",level:2},{value:"Our Standards",id:"our-standards",level:2},{value:"Our Responsibilities",id:"our-responsibilities",level:2},{value:"Scope",id:"scope",level:2},{value:"Enforcement",id:"enforcement",level:2},{value:"Attribution",id:"attribution",level:2}],d={toc:s},u="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(u,(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"our-pledge"},"Our Pledge"),(0,r.kt)("p",null,"In the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to make participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation."),(0,r.kt)("h2",{id:"our-standards"},"Our Standards"),(0,r.kt)("p",null,"Examples of behavior that contributes to a positive environment for our\ncommunity include:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Demonstrating empathy and kindness toward other people"),(0,r.kt)("li",{parentName:"ul"},"Being respectful of differing opinions, viewpoints, and experiences"),(0,r.kt)("li",{parentName:"ul"},"Giving and gracefully accepting constructive feedback"),(0,r.kt)("li",{parentName:"ul"},"Accepting responsibility and apologizing to those affected by our mistakes,\nand learning from the experience"),(0,r.kt)("li",{parentName:"ul"},"Focusing on what is best not just for us as individuals, but for the\noverall community")),(0,r.kt)("p",null,"Examples of unacceptable behavior include:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The use of sexualized language or imagery, and sexual attention or\nadvances"),(0,r.kt)("li",{parentName:"ul"},"Trolling, insulting or derogatory comments, and personal or political attacks"),(0,r.kt)("li",{parentName:"ul"},"Public or private harassment"),(0,r.kt)("li",{parentName:"ul"},"Publishing others' private information, such as a physical or email\naddress, without their explicit permission"),(0,r.kt)("li",{parentName:"ul"},"Other conduct which could reasonably be considered inappropriate in a\nprofessional setting")),(0,r.kt)("h2",{id:"our-responsibilities"},"Our Responsibilities"),(0,r.kt)("p",null,"Project maintainers are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior."),(0,r.kt)("p",null,"Project maintainers have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, or to ban\ntemporarily or permanently any contributor for other behaviors that they deem\ninappropriate, threatening, offensive, or harmful."),(0,r.kt)("h2",{id:"scope"},"Scope"),(0,r.kt)("p",null,"This Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event."),(0,r.kt)("h2",{id:"enforcement"},"Enforcement"),(0,r.kt)("p",null,"Instances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at ",(0,r.kt)("a",{parentName:"p",href:"mailto:dev@fleek.network"},"dev@fleek.network"),".\nAll complaints will be reviewed and investigated promptly and fairly."),(0,r.kt)("p",null,"All community leaders are obligated to respect the privacy and security of the\nreporter of any incident."),(0,r.kt)("h2",{id:"attribution"},"Attribution"),(0,r.kt)("p",null,"This Code of Conduct is adapted from the ",(0,r.kt)("a",{parentName:"p",href:"https://contributor-covenant.org/"},"Contributor Covenant"),", version\n",(0,r.kt)("a",{parentName:"p",href:"https://www.contributor-covenant.org/version/1/4/code-of-conduct/code_of_conduct.md"},"1.4")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://www.contributor-covenant.org/version/2/0/code_of_conduct/code_of_conduct.md"},"2.0"),",\nand was generated by ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/bttger/contributing-gen"},"contributing-gen"),"."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/51d5b592.a4e0e2e7.js b/assets/js/51d5b592.a4e0e2e7.js deleted file mode 100644 index 6517d4f31..000000000 --- a/assets/js/51d5b592.a4e0e2e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1984],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),h=o,m=c["".concat(s,".").concat(h)]||c[h]||d[h]||i;return n?a.createElement(m,r(r({ref:t},u),{},{components:n})):a.createElement(m,r({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:o,r[1]=l;for(var p=2;p{n.d(t,{ZP:()=>l});var a=n(7462),o=(n(7294),n(3905));const i={toc:[]},r="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(r,(0,a.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"We recommend creating a ",(0,o.kt)("inlineCode",{parentName:"p"},"non-root")," user with administrative privileges. It'll allow us to install any system requirements."),(0,o.kt)("p",null,"You can create a new user and add to the ",(0,o.kt)("strong",{parentName:"p"},"sudo")," group by running:"),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"For our example, we'll be using the name ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," but you can pick whichever you'd like. If you already have a ",(0,o.kt)("strong",{parentName:"p"},"sudoer")," account, you can skip this step.")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo adduser lgtn\n")),(0,o.kt)("p",null,"After completing the ",(0,o.kt)("inlineCode",{parentName:"p"},"adduser")," steps, execute the ",(0,o.kt)("inlineCode",{parentName:"p"},"usermod")," to add the ",(0,o.kt)("inlineCode",{parentName:"p"},"user")," to the ",(0,o.kt)("strong",{parentName:"p"},"sudo")," group, as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo usermod -aG sudo lgtn\n")),(0,o.kt)("p",null,"Switch to the new ",(0,o.kt)("strong",{parentName:"p"},"user")," by using the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"su lgtn\n")),(0,o.kt)("p",null,"Change the directory to the new user's home, as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cd /home/lgtn\n")))}l.isMDXComponent=!0},2915:(e,t,n)=>{n.d(t,{ZP:()=>l});var a=n(7462),o=(n(7294),n(3905));const i={toc:[]},r="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(r,(0,a.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You have several ways of doing this:"),(0,o.kt)("ul",{parentName:"admonition"},(0,o.kt)("li",{parentName:"ul"},"Clone via HTTPS"),(0,o.kt)("li",{parentName:"ul"},"Clone via SSH"),(0,o.kt)("li",{parentName:"ul"},"Download via Github CLI"),(0,o.kt)("li",{parentName:"ul"},"Download the ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip"},"zip package")," from the repository")),(0,o.kt)("p",{parentName:"admonition"},"We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,o.kt)("a",{parentName:"p",href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh"},"here"),"."),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git \n")),(0,o.kt)("p",{parentName:"admonition"},"At time of writing, we are checking the branch name ",(0,o.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1")," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"))))}l.isMDXComponent=!0},3813:(e,t,n)=>{n.d(t,{ZP:()=>l});var a=n(7462),o=(n(7294),n(3905));const i={toc:[]},r="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(r,(0,a.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The flag ",(0,o.kt)("inlineCode",{parentName:"p"},"-c")," in the ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning.service")," ",(0,o.kt)("strong",{parentName:"p"},"ExecStart"),", is to provide the toml configuration file path e.g. defaults to ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning/config.toml"),". This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a ",(0,o.kt)("strong",{parentName:"p"},"user")," or ",(0,o.kt)("strong",{parentName:"p"},"sudoer"),". For example, a ",(0,o.kt)("strong",{parentName:"p"},"sudoer")," would have the ",(0,o.kt)("strong",{parentName:"p"},"configuration")," set to ",(0,o.kt)("inlineCode",{parentName:"p"},"/root/.lightning/config.toml")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/username/.lightning/config.toml")," depending on using ",(0,o.kt)("strong",{parentName:"p"},"sudo")," which might cause some confusion to some users.")))}l.isMDXComponent=!0},2300:(e,t,n)=>{n.d(t,{ZP:()=>l});var a=n(7462),o=(n(7294),n(3905));const i={toc:[]},r="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(r,(0,a.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"You should be following the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user-1"},"create a user")," recommendation. For our example, we have the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn"),"."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"If you have chosen a different username, replace ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," by the correct username you have selected.")),(0,o.kt)("p",null,"In the ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")," you'll find some and more of the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("p",null,"Find and replace all instances of ",(0,o.kt)("inlineCode",{parentName:"p"},"~")," in the config file ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/config.toml"),". Here's an example using ",(0,o.kt)("inlineCode",{parentName:"p"},"sed"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n')),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")," example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here.")),(0,o.kt)("p",null,"Once changed, all the instances of ",(0,o.kt)("inlineCode",{parentName:"p"},"~/")," should be replaced by your user path e.g. ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/"),". For our example, the output would look like the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "/home/lgtn/.lightning/data/app_db"\n\n[consensus]\nstore_path = "/home/lgtn/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "/home/lgtn/.lightning/blockstore"\n\n[resolver]\nstore_path = "/home/lgtn/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n')))}l.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(7294);const o=e=>{let{image:t,name:n,title:o,url:i,communityMember:r=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:i,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:i,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},o),a.createElement("span",{className:"discord"},r?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},7183:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>f,frontMatter:()=>u,metadata:()=>d,toc:()=>m});var a=n(7462),o=(n(7294),n(3905)),i=n(3872),r=n(2915),l=n(6733),s=n(2300),p=n(3813);const u={title:"Install",hide_title:!0,slug:"install",date:new Date("2023-08-21T23:00:00.000Z"),canonical:"",description:"The Fleek Network Lightning CLI installation walkthrough",category:"Tutorial",tags:["CDN","Guide","Getting Started","Fleek Network","Rust dependencies","compile","build","wizard","manual"]},c=void 0,d={unversionedId:"node/install",id:"node/install",title:"Install",description:"The Fleek Network Lightning CLI installation walkthrough",source:"@site/docs/node/install.md",sourceDirName:"node",slug:"/node/install",permalink:"/docs/node/install",draft:!1,tags:[{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Getting Started",permalink:"/docs/tags/getting-started"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"},{label:"Rust dependencies",permalink:"/docs/tags/rust-dependencies"},{label:"compile",permalink:"/docs/tags/compile"},{label:"build",permalink:"/docs/tags/build"},{label:"wizard",permalink:"/docs/tags/wizard"},{label:"manual",permalink:"/docs/tags/manual"}],version:"current",frontMatter:{title:"Install",hide_title:!0,slug:"install",date:"2023-08-21T23:00:00.000Z",canonical:"",description:"The Fleek Network Lightning CLI installation walkthrough",category:"Tutorial",tags:["CDN","Guide","Getting Started","Fleek Network","Rust dependencies","compile","build","wizard","manual"]},sidebar:"docs",previous:{title:"Testnet onboarding",permalink:"/docs/node/testnet-onboarding"},next:{title:"Health check",permalink:"/docs/node/health-check"}},h={},m=[{value:"Assisted installer",id:"assisted-installer",level:2},{value:"Prerequesites",id:"prerequesites",level:3},{value:"Connect to your server",id:"connect-to-your-server",level:3},{value:"Create a user",id:"create-a-user",level:3},{value:"Run the script for a quick install",id:"run-the-script-for-a-quick-install",level:3},{value:"About the process",id:"about-the-process",level:3},{value:"Manual installation",id:"manual-installation",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Create a user",id:"create-a-user-1",level:3},{value:"Install Rust with Rustup tool",id:"install-rust-with-rustup-tool",level:3},{value:"Lightning installer rust dependencies",id:"lightning-installer-rust-dependencies",level:3},{value:"Linux dependencies",id:"linux-dependencies",level:3},{value:"Installing Lightning CLI",id:"installing-lightning-cli",level:3},{value:"Key generator",id:"key-generator",level:3},{value:"Set user path in config.toml",id:"set-user-path-in-configtoml",level:3},{value:"Set testnet in config.toml",id:"set-testnet-in-configtoml",level:3},{value:"Start the node",id:"start-the-node",level:3},{value:"Systemd Service Setup",id:"systemd-service-setup",level:3},{value:"Docker installation",id:"docker-installation",level:2},{value:"Quick pull and run",id:"quick-pull-and-run",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Docker Container as a Systemd Service",id:"docker-container-as-a-systemd-service",level:3},{value:"Frequently Used Commands (Quick Reference)",id:"frequently-used-commands-quick-reference",level:2}],g={toc:m},k="wrapper";function f(e){let{components:t,...n}=e;return(0,o.kt)(k,(0,a.Z)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"This section describes how to install the Fleek Network Lightning on supported operating systems. The installation can be made quicker by running the ",(0,o.kt)("a",{parentName:"p",href:"#assisted-installer"},"assisted installer")," or by following the ",(0,o.kt)("a",{parentName:"p",href:"#manual-installation"},"manual installation")," if you want a bit more control."),(0,o.kt)("admonition",{title:"Warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"If you'd like to participate in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/roadmap"},"alpha Testnet"),", you have to go through the onboarding process. Check the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"requirements")," and find the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/testnet-onboarding"},"onboarding instructions")," to enable you to proceed and ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install"},"install")," a network node successfully.")),(0,o.kt)("h2",{id:"assisted-installer"},"Assisted installer"),(0,o.kt)("p",null,"The assisted installer is a script written in ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Bash_(Unix_shell)"},"Bash")," (Unix shell) that is available as a curl command line."),(0,o.kt)("h3",{id:"prerequesites"},"Prerequesites"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A basic knowledge of command line interface (CLI)"),(0,o.kt)("li",{parentName:"ul"},"A ",(0,o.kt)("a",{parentName:"li",href:"/docs/node/requirements#server"},"supported")," Linux server")),(0,o.kt)("h3",{id:"connect-to-your-server"},"Connect to your server"),(0,o.kt)("p",null,"Connect to the Linux server where the Node's going to be installed via SSH by opening a shell session there."),(0,o.kt)("p",null,"If you have set up a public SSH key for the machine, connecting to the server should be as simple as:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"ssh @\n")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Check the cloud provider for instructions to understand how to setup an ssh connection and connect to it remotely. Some other users might have local access to a ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"supported")," Linux server. To keep this guide short, we'll assume you've rented a VPS from a cloud provider.")),(0,o.kt)("h3",{id:"create-a-user"},"Create a user"),(0,o.kt)(l.ZP,{mdxType:"CreateAUser"}),(0,o.kt)("h3",{id:"run-the-script-for-a-quick-install"},"Run the script for a quick install"),(0,o.kt)("p",null,"Copy and paste it to the server host terminal and execute it to launch the assisted installation process, as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://get.fleek.network | bash\n")),(0,o.kt)("p",null,"On success, you should be greeted by the following welcome screen:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'\u2b50\ufe0f Fleek Network Lightning CLI installer \u2b50\ufe0f\n\n zeeeeee-\n z$$$$$$"\n d$$$$$$"\n d$$$$$P\n d$$$$$P\n $$$$$$"\n .$$$$$$"\n .$$$$$$"\n 4$$$$$$$$$$$$$"\n z$$$$$$$$$$$$$"\n """""""3$$$$$"\n z$$$$P\n d$$$$"\n .$$$$$"\n z$$$$$"\n z$$$$P\n d$$$$$$$$$$"\n *******$$$"\n .$$$"\n .$$"\n 4$P"\n z$"\n zP\n z"\n/\n\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83c\udf0d Website https://fleek.network\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83d\udcda Documentation https://docs.fleek.network\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83d\udcbe Git repository https://github.com/fleek-network/lightning\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83e\udd16 Discord https://discord.gg/fleekxyz\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83d\udc24 Twitter https://twitter.com/fleek_net\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83c\udfa8 Ascii art by https://www.asciiart.eu\n\n...\n\nRemaining output omitted for brevity, you\'ll not see this text line\n')),(0,o.kt)("p",null,"Follow the installation wizard to have the Fleek Network Lightning CLI and service installed on the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"supported server"),"."),(0,o.kt)("p",null,"After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:"),(0,o.kt)("p",null,"After creating the service, launch the service by executing the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning.service\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To learn more about Systemctl commands, visit the section ",(0,o.kt)("a",{parentName:"p",href:"#use-systemctl-to-manage-systemd-service"},"Use Systemctl to manage the Lightning Service"))),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/analyzing-logs"},"Log Messages"),".")),(0,o.kt)("p",null,"Once the installation is complete, do a health check! Check the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/health-check"},"Health Check")," to learn how to do a node health checkup."),(0,o.kt)("h3",{id:"about-the-process"},"About the process"),(0,o.kt)("p",null,"The installation process is open source and transparent. The source is available in the ",(0,o.kt)("a",{parentName:"p",href:"https://get.fleek.network"},"get.fleek.network")," or the origin repository ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/get.fleek.network"},"here"),"."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},'"Get Fleek Network" is an attempt to make our software more accessible. By providing scripts to automate the installation process of our software, we believe that it can help improve the onboarding experience of our users.')),(0,o.kt)("p",null,"The installer assists the node operator by automating the Lightning CLI build from the open-source code and setting up the system service. A node operator should use the assisted installer to ease onboarding, reduce repetition,"),(0,o.kt)("p",null,"At a high level, the installer will:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Install required dependencies, e.g. rust toolchain"),(0,o.kt)("li",{parentName:"ul"},"Pull the source code from the origin ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning"},"repository")),(0,o.kt)("li",{parentName:"ul"},"Build the binary, e.g. a ",(0,o.kt)("inlineCode",{parentName:"li"},"lightning CLI")," (lgtn) is compiled from source code"),(0,o.kt)("li",{parentName:"ul"},"Setup a ",(0,o.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Systemd"},"Systemd")," service named lightning"),(0,o.kt)("li",{parentName:"ul"},"Provide instructions to launch, stop the Fleek network via the Systemd lightning service")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Remember that if you use the assisted installer, you won't have to do the ",(0,o.kt)("a",{parentName:"p",href:"#manual-installation"},"manual installation")," process as described in the next section. On success, the assisted installer should provide the same result as following the manual instructions.")),(0,o.kt)("h2",{id:"manual-installation"},"Manual installation"),(0,o.kt)("p",null,"The following section will walk through the dependencies and Rust installation process for Linux. If you're on Windows, we recommend to setup ",(0,o.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/windows/wsl/install"},"Windows Subsystem Linux"),", reading the ",(0,o.kt)("a",{parentName:"p",href:"https://ubuntu.com/tutorials/install-ubuntu-on-wsl2-on-windows-10#1-overview"},"Ubuntu tutorial")," or picking another ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"supported distro"),". The WSL will let you use Linux applications, utilities and bash command tools you'll find in the tutorial."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"We're only supporting Linux operating system (server edition). Find the list of supported OS ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"here"),".")),(0,o.kt)("h3",{id:"prerequisites"},"Prerequisites"),(0,o.kt)("p",null,"To follow the guide, you will need the following:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Familiarity with the command-line interface"),(0,o.kt)("li",{parentName:"ul"},"Git")),(0,o.kt)("p",null,"You're required to have some experience with the command-line interface and have Git installed; Also, you should be happy to troubleshoot, since versions might differ from the time of writing and reading. Most times, a simple web search provides the best answers."),(0,o.kt)("p",null,"If you don't have Git installed, learn more about it and the instructions by reading the ",(0,o.kt)("a",{parentName:"p",href:"https://git-scm.com/book/en/v2"},"Git documentation"),"."),(0,o.kt)("h3",{id:"create-a-user-1"},"Create a user"),(0,o.kt)(l.ZP,{mdxType:"CreateAUser"}),(0,o.kt)("h3",{id:"install-rust-with-rustup-tool"},"Install Rust with Rustup tool"),(0,o.kt)("p",null,"Visit the ",(0,o.kt)("a",{parentName:"p",href:"https://www.rust-lang.org/"},"Rust website")," getting started guide, to find, copy and run the ",(0,o.kt)("a",{parentName:"p",href:"https://rustup.rs/"},"Rustup tool")," for installation and version management."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("a",{parentName:"p",href:"https://curl.se/"},"curl")," is an application that is generally available in most OS, if missing install it. Find more ",(0,o.kt)("a",{parentName:"p",href:"https://curl.se/"},"here"),".")),(0,o.kt)("p",null,"Alternatively, if you have installed Rust in the past, you may want to update it \ud83d\udc4c."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"rustup update\n")),(0,o.kt)("p",null,"During the installation process, if asked about preferences, select the default option!"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"You can uninstall at any time with rustup self uninstall and\nthese changes will be reverted.\n\nCurrent installation options:\n\n\n default host triple: x86_64-unknown-linux-gnu\n default toolchain: stable (default)\n profile: default\n modify PATH variable: yes\n\n1) Proceed with installation (default)\n2) Customize installation\n3) Cancel installation\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Once complete, you'll have to restart your current shell or reload the \"PATH\" environment variable to include Cargo's bin directory ",(0,o.kt)("inlineCode",{parentName:"p"},"$HOME/.cargo/bin"),'. This is required to let you use "cargo" command globally.')),(0,o.kt)("p",null,"To configure your current shell, run:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'source "$HOME/.cargo/env"\n')),(0,o.kt)("p",null,"From then on, the latest version of Cargo (Rust's build and package manager tool) should be installed. Learn more about Cargo, ",(0,o.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/cargo/index.html"},"here"),"."),(0,o.kt)("p",null,"Check the ",(0,o.kt)("inlineCode",{parentName:"p"},"version")," to confirm's working correctly:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cargo --version\n")),(0,o.kt)("p",null,"Here's the output we got (beware that our version might differ to yours, it's expected \ud83d\ude05)."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cargo 1.65.0 (4bc8f24d3 2022-10-20)\n")),(0,o.kt)("h3",{id:"lightning-installer-rust-dependencies"},"Lightning installer rust dependencies"),(0,o.kt)("p",null,"Rustup subcommands deal with ",(0,o.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/rustup/concepts/toolchains.html"},"toolchains"),", a collection of programs required to compile a Rust application."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"rustup toolchain list\n")),(0,o.kt)("p",null,"For example, on Linux Ubuntu we generally have it set to the default:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"stable-x86_64-unknown-linux-gnu (default)\n")),(0,o.kt)("p",null,"While on macOS:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"stable-x86_64-apple-darwin (default)\n")),(0,o.kt)("p",null,"Make sure you have Rustup set to the desired toolchain as default if required \ud83d\udc81\u200d\u2640\ufe0f!"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"rustup default \n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Rust compilation is long and compiler caching can help speed things up immensely. The Lightning CLI project can be used to reduce the perceived compilation times.")),(0,o.kt)("h3",{id:"linux-dependencies"},"Linux dependencies"),(0,o.kt)("p",null,"On Linux (we'll stick with Ubuntu as the Linux distro example), start by updating the package information in the source list and then upgrade all the installed packages with the latest versions (do the equivalent for your Linux distro), as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get update\nsudo apt-get upgrade\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can optionally pass the ",(0,o.kt)("inlineCode",{parentName:"p"},"y")," flag to skip any user prompts e.g. ",(0,o.kt)("inlineCode",{parentName:"p"},"sudo apt-get update -y")," to any remaining apt-get commands.")),(0,o.kt)("p",null,"Install the build-essentials packages, necessary for compiling general software and for our use-case Lightning CLI."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install build-essential\n")),(0,o.kt)("p",null,"Followed by the required tools to compile the application (",(0,o.kt)("a",{parentName:"p",href:"https://cmake.org/"},"cmake"),", ",(0,o.kt)("a",{parentName:"p",href:"https://clang.llvm.org/"},"clang"),", ",(0,o.kt)("a",{parentName:"p",href:"https://www.freedesktop.org/wiki/Software/pkg-config/"},"pkg-config")," and ",(0,o.kt)("a",{parentName:"p",href:"https://packages.debian.org/sid/libssl-dev"},"libssl-dev "),")."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install cmake clang pkg-config libssl-dev gcc-multilib\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"For Debian, you should install ",(0,o.kt)("inlineCode",{parentName:"p"},"gcc"),", as follows:"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get update\nsudo apt-get install gcc\n"))),(0,o.kt)("p",null,"Now install the ",(0,o.kt)("a",{parentName:"p",href:"https://grpc.io/docs/protoc-installation/"},"Protobufer Compiler"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install protobuf-compiler\n")),(0,o.kt)("p",null,"Ensure the compiler version is 3+"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"protoc --version\n")),(0,o.kt)("h3",{id:"installing-lightning-cli"},"Installing Lightning CLI"),(0,o.kt)("p",null,"If you haven't already, clone the Fleek Network's Lightning repository to your machine."),(0,o.kt)(r.ZP,{mdxType:"GitCloneOptions"}),(0,o.kt)("p",null,"When git clone completes \ud83d\udc4d, ",(0,o.kt)("inlineCode",{parentName:"p"},"change directory")," to the project directory e.g. we cloned to the default name ",(0,o.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~/fleek-network/lightning\n")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The ",(0,o.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"$HOME/fleek-network/lightning")," directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation.")),(0,o.kt)("p",null,"If you list (",(0,o.kt)("inlineCode",{parentName:"p"},"ls"),") the files in the directory, it should be similar to:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},".\n\u251c\u2500\u2500 CODE_OF_CONDUCT.md\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Cargo.lock\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 codecov.yml\n\u251c\u2500\u2500 core\n\u251c\u2500\u2500 docs\n\u251c\u2500\u2500 lib\n\u251c\u2500\u2500 lightning.toml\n\u251c\u2500\u2500 rust-toolchain\n\u251c\u2500\u2500 rustfmt.toml\n\u251c\u2500\u2500 services\n\u2514\u2500\u2500 target\n")),(0,o.kt)("p",null,"At this point, you should be able to run the ",(0,o.kt)("inlineCode",{parentName:"p"},"install")," command successfully."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"If you already had Rust installed, or the project before, and skipped instructions directly here, there might be case where you get errors. So, make sure to clear your work directory:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cargo clean\ncargo update\n")),(0,o.kt)("p",null,"Start the ",(0,o.kt)("inlineCode",{parentName:"p"},"install")," process by running the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cargo +stable build --release\n")),(0,o.kt)("p",null,"The installation process is long, as it compiles the application binary for us from the source code."),(0,o.kt)("p",null,"\ud83c\udf08 Here's the output when successful! Note, that the output might differ slightly from time of writing."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"}," Finished release [optimized] target(s) in 11m 22s\n Installing /home/lgtn/.cargo/bin/lightning\n Installed package `lightning v0.1.0 (/crates/lightning)` (executable `lightning`)\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Once Rust generates the binary ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning-node"),", you can find it in the project root ",(0,o.kt)("inlineCode",{parentName:"p"},"target")," directory. Depending on the usage of ",(0,o.kt)("inlineCode",{parentName:"p"},"+stable")," flag, the binary should be located at ",(0,o.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning/target/debug/lightning-node")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning/target/release/lightning-node"),".")),(0,o.kt)("p",null,"You can create an ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," symbolic link to ",(0,o.kt)("inlineCode",{parentName:"p"},"/usr/local/bin")," to make it available globally."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sudo ln -s "$HOME/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn\n')),(0,o.kt)("p",null,"After completing, you'll have the ability to type ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," to execute the binary anywhere for your user account. Other users might find it better to copy or create an ",(0,o.kt)("inlineCode",{parentName:"p"},"alias")," instead."),(0,o.kt)("p",null,"Run the ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn help")," sub-command as a checkup:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"Usage: lightning-node [OPTIONS] \n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: lightning.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n")),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Beware that your output might differ a bit, as ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"Lightning"),' is in constant development. Note that you\'ll have to "re-install" every time you want to pull updates from the source repository, as the update at the time of writing is done manually and not automatically.')),(0,o.kt)("h3",{id:"key-generator"},"Key generator"),(0,o.kt)("p",null,"Before starting the node, you should generate a public and private key."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn keys generate\n")),(0,o.kt)("p",null,"The keys will be generated and placed under the system directory ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning/keystore"),". The ",(0,o.kt)("inlineCode",{parentName:"p"},"private")," key is the user's responsibility and no one else can generate or recover it for you, including Fleek Network or any team member. Your keys, your responsibility!"),(0,o.kt)("h3",{id:"set-user-path-in-configtoml"},"Set user path in config.toml"),(0,o.kt)(s.ZP,{mdxType:"SetUserPathInConfigToml"}),(0,o.kt)("h3",{id:"set-testnet-in-configtoml"},"Set testnet in config.toml"),(0,o.kt)("p",null,"Set the testnet attribute to ",(0,o.kt)("inlineCode",{parentName:"p"},"true")," in the ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")," located in the path ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning/config.toml"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'[application]\ndb_path = "~/.lightning/data/app_data"\nmode = "Prod"\nstorage = "RocksDb"\ntestnet = true\n\n...\n')),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"The configuration file should have more content, which was omitted here to keep it short and to the point. You're interested in the ",(0,o.kt)("inlineCode",{parentName:"p"},"testnet")," property name only.")),(0,o.kt)("h3",{id:"start-the-node"},"Start the node"),(0,o.kt)("admonition",{title:"Warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"To participate in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/roadmap"},"alpha Testnet"),", you have to through the onboarding process. Make sure you request access by following the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/testnet-onboarding"},"onboarding instructions"),". If you fail to enable your node for testnet, it'll not run!")),(0,o.kt)("p",null,"To start the node, you should execute the sub-command ",(0,o.kt)("inlineCode",{parentName:"p"},"run"),". Noteworthy that while it launches the node, you're recommended to set up a systemd service to run it for a long period."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn run\n")),(0,o.kt)("admonition",{title:"WARNING",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"We recommend setting up the process as a systemd service, as it's a long-running process. Instructions to setup a systemd service are available in the section ",(0,o.kt)("a",{parentName:"p",href:"#systemd-service-setup"},"Systemd Service Setup"),".")),(0,o.kt)("p",null,"Great! You have successfully installed all the required packages, and libraries and have compiled and installed lightning. Check the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/health-check"},"Health Check")," to learn how to do a node health checkup."),(0,o.kt)("h3",{id:"systemd-service-setup"},"Systemd Service Setup"),(0,o.kt)("p",null,"Create a new Systemd service file:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo touch /etc/systemd/system/lightning.service\n")),(0,o.kt)("p",null,"Open the file and put the following content:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run\nExecStop=killall -9 lgtn\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n")),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Notice that we're using ",(0,o.kt)("inlineCode",{parentName:"p"},"lgnt")," as the username. If you have a different custom username change it accordingly. Beware that we've recommended using a ",(0,o.kt)("inlineCode",{parentName:"p"},"non-root")," user, as described in the section ",(0,o.kt)("a",{parentName:"p",href:"#create-a-user-1"},"create a user"),".")),(0,o.kt)(p.ZP,{mdxType:"NoteExecStartFlagCConfigPath"}),(0,o.kt)("p",null,"Change the file permissions for the service:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo chmod 644 /etc/systemd/system/lightning.service\n")),(0,o.kt)("p",null,"After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,o.kt)("p",null,"To start the service at boot, use the enable command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable lightning.service\n")),(0,o.kt)("p",null,"Create the directory where the log message will be stored, as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo mkdir -p /var/log/lightning\n")),(0,o.kt)("p",null,"You may want to create empty placeholders for the stdout and stderr log files:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo touch /var/log/lightning/output.log\nsudo touch /var/log/lightning/diagnostic.log\n")),(0,o.kt)("admonition",{title:"WARNING",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"We're assuming that you've ",(0,o.kt)("a",{parentName:"p",href:"#create-a-user-1"},"created a new user")," and can start the service operating without ",(0,o.kt)("strong",{parentName:"p"},"sudo"),".")),(0,o.kt)("p",null,"Start the service by:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning.service\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/analyzing-logs"},"Log Messages"),".")),(0,o.kt)("p",null,"To learn more, visit the section ",(0,o.kt)("a",{parentName:"p",href:"#use-systemctl-to-manage-systemd-service"},"Use Systemctl to manage the Lightning Service")),(0,o.kt)("h2",{id:"docker-installation"},"Docker installation"),(0,o.kt)("p",null,"In this section we'll describe how to run a Fleek Network Lightning Node as a Docker Service. We're going to assume that you have Docker installed and running. If you need help to install Docker, check the guide ",(0,o.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/running-a-node-in-docker"},"running a node in docker"),"."),(0,o.kt)("p",null,"a) We can ",(0,o.kt)("a",{parentName:"p",href:"#quick-pull-and-run"},"easily pull and run")," the Lightning Docker image from our registry to run the Docker Container quickly."),(0,o.kt)("p",null,"b) ",(0,o.kt)("a",{parentName:"p",href:"#build-from-source"},"Build the Docker image")," from the repository source code"),(0,o.kt)("p",null,"Optionally, ",(0,o.kt)("a",{parentName:"p",href:"#docker-container-as-a-systemd-service"},"wrap the Docker Container as a Systemd Service"),"."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"The Docker images are built for particular CPU architectures (x64) and as declared in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements/#specs"},"requirements"),", we're mainly supporting ",(0,o.kt)("inlineCode",{parentName:"p"},"GenuineIntel"),", as there has been reports of failure to build and run the binary on AMD. If you're running on a ",(0,o.kt)("inlineCode",{parentName:"p"},"AuthenticAMD"),", provide us feedback on our ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"Discord"),".")),(0,o.kt)("h3",{id:"quick-pull-and-run"},"Quick pull and run"),(0,o.kt)("p",null,"You can pull an run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it ghcr.io/fleek-network/lightning:latest\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"The command has a list of ports ",(0,o.kt)("inlineCode",{parentName:"p"},"-p")," values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements#ports"},"ports")," to find the latest updates.")),(0,o.kt)("h3",{id:"build-from-source"},"Build from source"),(0,o.kt)("p",null,"Clone the repository located at ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"https://github.com/fleek-network/lightning"),"."),(0,o.kt)(r.ZP,{mdxType:"GitCloneOptions"}),(0,o.kt)("p",null,"Change directory to the project source code directory, e.g. the default ",(0,o.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning"),"."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~/fleek-network/lightning\n")),(0,o.kt)("p",null,"Build the image named as ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning")," from our Dockerfile:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker build -t lightning -f ./Dockerfile .\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Take note of the Docker image name ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning"),", as that's the name we'll use and pass to the ",(0,o.kt)("inlineCode",{parentName:"p"},"Docker run")," to be successful. You can name it differently if that's your preference.")),(0,o.kt)("p",null,"Once the image is built, you can launch the Docker Container with a ",(0,o.kt)("inlineCode",{parentName:"p"},"--name")," such as ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning-node")," from the ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning")," image we just created by running:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it lightning\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"The command has a list of ports ",(0,o.kt)("inlineCode",{parentName:"p"},"-p")," values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements#ports"},"ports")," to find the latest updates.")),(0,o.kt)("p",null,"If a ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning")," directory or ",(0,o.kt)("inlineCode",{parentName:"p"},"~/.lightning/keystore")," doesn't exist, one is created for you on ",(0,o.kt)("inlineCode",{parentName:"p"},"docker run"),". You'll need to have the directory populated with the ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," if you want to use a particular identity. Learn more about managing the keystore ",(0,o.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"here"),"."),(0,o.kt)("h3",{id:"docker-container-as-a-systemd-service"},"Docker Container as a Systemd Service"),(0,o.kt)("p",null,"Create a unit configuration file:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo touch /etc/systemd/system/docker-lightning.service\n")),(0,o.kt)("p",null,"Open the ",(0,o.kt)("inlineCode",{parentName:"p"},"docker-lightning.service")," file in your favourite text editor and put the content:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nRestart=always\nRestartSec=5\nTimeoutStartSec=0\nExecStartPre=-/usr/bin/docker kill lightning-node\nExecStartPre=-/usr/bin/docker rm lightning-node\nExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest\nExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest\nExecStop=/usr/bin/docker stop lightning-node\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\n\n[Install]\nWantedBy=multi-user.target\n")),(0,o.kt)("p",null,"Change the file permissions by running the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo chmod 644 /etc/systemd/system/docker-lightning.service\n")),(0,o.kt)("p",null,"Next, reload the Systemctl Daemon:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,o.kt)("p",null,"Enable the service on startup when the system boots:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable docker-lightning.service\n")),(0,o.kt)("p",null,"Learn how to manage the Systemd Service by reading the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"systemd service"),"."),(0,o.kt)("h2",{id:"frequently-used-commands-quick-reference"},"Frequently Used Commands (Quick Reference)"),(0,o.kt)("p",null,"A quick reference of the most Frequently Used Commands are available for ",(0,o.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/frequently-used-commands-for-native-setup"},"Native")," and ",(0,o.kt)("a",{parentName:"p",href:"/references/Docker/frequently-used-commands-for-docker-setup"},"Docker")," setups. If you'd like a more in depth explanation of the commands, check the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/health-check"},"health check"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/analyzing-logs"},"analyzing logs"),", ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"systemd service")," and ",(0,o.kt)("a",{parentName:"p",href:"/guides/index"},"guides")," sections separately."),(0,o.kt)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/51d5b592.eb15ccfd.js b/assets/js/51d5b592.eb15ccfd.js new file mode 100644 index 000000000..c1de54344 --- /dev/null +++ b/assets/js/51d5b592.eb15ccfd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1984],{8432:(e,n,t)=>{t.d(n,{ZP:()=>o});var s=t(5893),i=t(1151);function r(e){const n={admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["We recommend creating a ",(0,s.jsx)(n.code,{children:"non-root"})," user with administrative privileges. It'll allow us to install any system requirements."]}),"\n",(0,s.jsxs)(n.p,{children:["You can create a new user and add to the ",(0,s.jsx)(n.strong,{children:"sudo"})," group by running:"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["For our example, we'll be using the name ",(0,s.jsx)(n.code,{children:"lgtn"})," but you can pick whichever you'd like. If you already have a ",(0,s.jsx)(n.strong,{children:"sudoer"})," account, you can skip this step."]})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo adduser lgtn\n"})}),"\n",(0,s.jsxs)(n.p,{children:["After completing the ",(0,s.jsx)(n.code,{children:"adduser"})," steps, execute the ",(0,s.jsx)(n.code,{children:"usermod"})," to add the ",(0,s.jsx)(n.code,{children:"user"})," to the ",(0,s.jsx)(n.strong,{children:"sudo"})," group, as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo usermod -aG sudo lgtn\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Switch to the new ",(0,s.jsx)(n.strong,{children:"user"})," by using the command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"su lgtn\n"})}),"\n",(0,s.jsx)(n.p,{children:"Change the directory to the new user's home, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cd /home/lgtn\n"})})]})}function o(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},3183:(e,n,t)=>{t.d(n,{ZP:()=>o});var s=t(5893),i=t(1151);function r(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsx)(n.p,{children:"You have several ways of doing this:"}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Clone via HTTPS"}),"\n",(0,s.jsx)(n.li,{children:"Clone via SSH"}),"\n",(0,s.jsx)(n.li,{children:"Download via Github CLI"}),"\n",(0,s.jsxs)(n.li,{children:["Download the ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip",children:"zip package"})," from the repository"]}),"\n"]}),(0,s.jsxs)(n.p,{children:["We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,s.jsx)(n.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh",children:"here"}),"."]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git \n"})}),(0,s.jsxs)(n.p,{children:["At time of writing, we are checking the branch name ",(0,s.jsx)(n.code,{children:"testnet-alpha-1"})," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"})})]})}function o(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},1761:(e,n,t)=>{t.d(n,{ZP:()=>o});var s=t(5893),i=t(1151);function r(e){const n={admonition:"admonition",code:"code",p:"p",strong:"strong",...(0,i.a)(),...e.components};return(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["The flag ",(0,s.jsx)(n.code,{children:"-c"})," in the ",(0,s.jsx)(n.code,{children:"lightning.service"})," ",(0,s.jsx)(n.strong,{children:"ExecStart"}),", is to provide the toml configuration file path e.g. defaults to ",(0,s.jsx)(n.code,{children:"~/.lightning/config.toml"}),". This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a ",(0,s.jsx)(n.strong,{children:"user"})," or ",(0,s.jsx)(n.strong,{children:"sudoer"}),". For example, a ",(0,s.jsx)(n.strong,{children:"sudoer"})," would have the ",(0,s.jsx)(n.strong,{children:"configuration"})," set to ",(0,s.jsx)(n.code,{children:"/root/.lightning/config.toml"})," or ",(0,s.jsx)(n.code,{children:"/home/username/.lightning/config.toml"})," depending on using ",(0,s.jsx)(n.strong,{children:"sudo"})," which might cause some confusion to some users."]})})}function o(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},4405:(e,n,t)=>{t.d(n,{ZP:()=>o});var s=t(5893),i=t(1151);function r(e){const n={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["You should be following the ",(0,s.jsx)(n.a,{href:"/docs/node/install#create-a-user-1",children:"create a user"})," recommendation. For our example, we have the username ",(0,s.jsx)(n.code,{children:"lgtn"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["If you have chosen a different username, replace ",(0,s.jsx)(n.code,{children:"lgtn"})," by the correct username you have selected."]})}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"config.toml"})," you'll find some and more of the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Find and replace all instances of ",(0,s.jsx)(n.code,{children:"~"})," in the config file ",(0,s.jsx)(n.code,{children:"/home/lgtn/.lightning/config.toml"}),". Here's an example using ",(0,s.jsx)(n.code,{children:"sed"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"config.toml"})," example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here."]})}),"\n",(0,s.jsxs)(n.p,{children:["Once changed, all the instances of ",(0,s.jsx)(n.code,{children:"~/"})," should be replaced by your user path e.g. ",(0,s.jsx)(n.code,{children:"/home/lgtn/"}),". For our example, the output would look like the following:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "/home/lgtn/.lightning/data/app_db"\n\n[consensus]\nstore_path = "/home/lgtn/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "/home/lgtn/.lightning/blockstore"\n\n[resolver]\nstore_path = "/home/lgtn/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n'})})]})}function o(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(r,{...e})}):r(e)}},7859:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>g,contentTitle:()=>h,default:()=>x,frontMatter:()=>d,metadata:()=>u,toc:()=>p});var s=t(5893),i=t(1151),r=t(3872),o=t(3183),l=t(8432),a=t(4405),c=t(1761);const d={title:"Install",hide_title:!0,slug:"install",date:new Date("2023-08-21T23:00:00.000Z"),canonical:"",description:"The Fleek Network Lightning CLI installation walkthrough",category:"Tutorial",tags:["CDN","Guide","Getting Started","Fleek Network","Rust dependencies","compile","build","wizard","manual"]},h=void 0,u={id:"node/install",title:"Install",description:"The Fleek Network Lightning CLI installation walkthrough",source:"@site/docs/node/install.md",sourceDirName:"node",slug:"/node/install",permalink:"/docs/node/install",draft:!1,unlisted:!1,tags:[{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Getting Started",permalink:"/docs/tags/getting-started"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"},{label:"Rust dependencies",permalink:"/docs/tags/rust-dependencies"},{label:"compile",permalink:"/docs/tags/compile"},{label:"build",permalink:"/docs/tags/build"},{label:"wizard",permalink:"/docs/tags/wizard"},{label:"manual",permalink:"/docs/tags/manual"}],version:"current",frontMatter:{title:"Install",hide_title:!0,slug:"install",date:"2023-08-21T23:00:00.000Z",canonical:"",description:"The Fleek Network Lightning CLI installation walkthrough",category:"Tutorial",tags:["CDN","Guide","Getting Started","Fleek Network","Rust dependencies","compile","build","wizard","manual"]},sidebar:"docs",previous:{title:"Testnet onboarding",permalink:"/docs/node/testnet-onboarding"},next:{title:"Health check",permalink:"/docs/node/health-check"}},g={},p=[{value:"Assisted installer",id:"assisted-installer",level:2},{value:"Prerequesites",id:"prerequesites",level:3},{value:"Connect to your server",id:"connect-to-your-server",level:3},{value:"Create a user",id:"create-a-user",level:3},{value:"Run the script for a quick install",id:"run-the-script-for-a-quick-install",level:3},{value:"About the process",id:"about-the-process",level:3},{value:"Manual installation",id:"manual-installation",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Create a user",id:"create-a-user-1",level:3},{value:"Install Rust with Rustup tool",id:"install-rust-with-rustup-tool",level:3},{value:"Lightning installer rust dependencies",id:"lightning-installer-rust-dependencies",level:3},{value:"Linux dependencies",id:"linux-dependencies",level:3},{value:"Installing Lightning CLI",id:"installing-lightning-cli",level:3},{value:"Key generator",id:"key-generator",level:3},{value:"Set user path in config.toml",id:"set-user-path-in-configtoml",level:3},{value:"Set testnet in config.toml",id:"set-testnet-in-configtoml",level:3},{value:"Start the node",id:"start-the-node",level:3},{value:"Systemd Service Setup",id:"systemd-service-setup",level:3},{value:"Docker installation",id:"docker-installation",level:2},{value:"Quick pull and run",id:"quick-pull-and-run",level:3},{value:"Build from source",id:"build-from-source",level:3},{value:"Docker Container as a Systemd Service",id:"docker-container-as-a-systemd-service",level:3},{value:"Frequently Used Commands (Quick Reference)",id:"frequently-used-commands-quick-reference",level:2}];function m(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["This section describes how to install the Fleek Network Lightning on supported operating systems. The installation can be made quicker by running the ",(0,s.jsx)(n.a,{href:"#assisted-installer",children:"assisted installer"})," or by following the ",(0,s.jsx)(n.a,{href:"#manual-installation",children:"manual installation"})," if you want a bit more control."]}),"\n",(0,s.jsx)(n.admonition,{title:"Warning",type:"caution",children:(0,s.jsxs)(n.p,{children:["If you'd like to participate in the ",(0,s.jsx)(n.a,{href:"/docs/roadmap",children:"alpha Testnet"}),", you have to go through the onboarding process. Check the ",(0,s.jsx)(n.a,{href:"/docs/node/requirements",children:"requirements"})," and find the ",(0,s.jsx)(n.a,{href:"/docs/node/testnet-onboarding",children:"onboarding instructions"})," to enable you to proceed and ",(0,s.jsx)(n.a,{href:"/docs/node/install",children:"install"})," a network node successfully."]})}),"\n",(0,s.jsx)(n.h2,{id:"assisted-installer",children:"Assisted installer"}),"\n",(0,s.jsxs)(n.p,{children:["The assisted installer is a script written in ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Bash_(Unix_shell)",children:"Bash"})," (Unix shell) that is available as a curl command line."]}),"\n",(0,s.jsx)(n.h3,{id:"prerequesites",children:"Prerequesites"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"A basic knowledge of command line interface (CLI)"}),"\n",(0,s.jsxs)(n.li,{children:["A ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#server",children:"supported"})," Linux server"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"connect-to-your-server",children:"Connect to your server"}),"\n",(0,s.jsx)(n.p,{children:"Connect to the Linux server where the Node's going to be installed via SSH by opening a shell session there."}),"\n",(0,s.jsx)(n.p,{children:"If you have set up a public SSH key for the machine, connecting to the server should be as simple as:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"ssh @\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["Check the cloud provider for instructions to understand how to setup an ssh connection and connect to it remotely. Some other users might have local access to a ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#server",children:"supported"})," Linux server. To keep this guide short, we'll assume you've rented a VPS from a cloud provider."]})}),"\n",(0,s.jsx)(n.h3,{id:"create-a-user",children:"Create a user"}),"\n",(0,s.jsx)(l.ZP,{}),"\n",(0,s.jsx)(n.h3,{id:"run-the-script-for-a-quick-install",children:"Run the script for a quick install"}),"\n",(0,s.jsx)(n.p,{children:"Copy and paste it to the server host terminal and execute it to launch the assisted installation process, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"curl https://get.fleek.network | bash\n"})}),"\n",(0,s.jsx)(n.p,{children:"On success, you should be greeted by the following welcome screen:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'\u2b50\ufe0f Fleek Network Lightning CLI installer \u2b50\ufe0f\n\n zeeeeee-\n z$$$$$$"\n d$$$$$$"\n d$$$$$P\n d$$$$$P\n $$$$$$"\n .$$$$$$"\n .$$$$$$"\n 4$$$$$$$$$$$$$"\n z$$$$$$$$$$$$$"\n """""""3$$$$$"\n z$$$$P\n d$$$$"\n .$$$$$"\n z$$$$$"\n z$$$$P\n d$$$$$$$$$$"\n *******$$$"\n .$$$"\n .$$"\n 4$P"\n z$"\n zP\n z"\n/\n\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83c\udf0d Website https://fleek.network\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83d\udcda Documentation https://docs.fleek.network\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83d\udcbe Git repository https://github.com/fleek-network/lightning\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83e\udd16 Discord https://discord.gg/fleekxyz\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83d\udc24 Twitter https://twitter.com/fleek_net\n\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605\u2605 \ud83c\udfa8 Ascii art by https://www.asciiart.eu\n\n...\n\nRemaining output omitted for brevity, you\'ll not see this text line\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Follow the installation wizard to have the Fleek Network Lightning CLI and service installed on the ",(0,s.jsx)(n.a,{href:"/docs/node/requirements",children:"supported server"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:"}),"\n",(0,s.jsx)(n.p,{children:"After creating the service, launch the service by executing the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl start lightning.service\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["To learn more about Systemctl commands, visit the section ",(0,s.jsx)(n.a,{href:"#use-systemctl-to-manage-systemd-service",children:"Use Systemctl to manage the Lightning Service"})]})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section ",(0,s.jsx)(n.a,{href:"/docs/node/analyzing-logs",children:"Log Messages"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["Once the installation is complete, do a health check! Check the section ",(0,s.jsx)(n.a,{href:"/docs/node/health-check",children:"Health Check"})," to learn how to do a node health checkup."]}),"\n",(0,s.jsx)(n.h3,{id:"about-the-process",children:"About the process"}),"\n",(0,s.jsxs)(n.p,{children:["The installation process is open source and transparent. The source is available in the ",(0,s.jsx)(n.a,{href:"https://get.fleek.network",children:"get.fleek.network"})," or the origin repository ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/get.fleek.network",children:"here"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:'"Get Fleek Network" is an attempt to make our software more accessible. By providing scripts to automate the installation process of our software, we believe that it can help improve the onboarding experience of our users.'})}),"\n",(0,s.jsx)(n.p,{children:"The installer assists the node operator by automating the Lightning CLI build from the open-source code and setting up the system service. A node operator should use the assisted installer to ease onboarding, reduce repetition,"}),"\n",(0,s.jsx)(n.p,{children:"At a high level, the installer will:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Install required dependencies, e.g. rust toolchain"}),"\n",(0,s.jsxs)(n.li,{children:["Pull the source code from the origin ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"repository"})]}),"\n",(0,s.jsxs)(n.li,{children:["Build the binary, e.g. a ",(0,s.jsx)(n.code,{children:"lightning CLI"})," (lgtn) is compiled from source code"]}),"\n",(0,s.jsxs)(n.li,{children:["Setup a ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Systemd",children:"Systemd"})," service named lightning"]}),"\n",(0,s.jsx)(n.li,{children:"Provide instructions to launch, stop the Fleek network via the Systemd lightning service"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Remember that if you use the assisted installer, you won't have to do the ",(0,s.jsx)(n.a,{href:"#manual-installation",children:"manual installation"})," process as described in the next section. On success, the assisted installer should provide the same result as following the manual instructions."]})}),"\n",(0,s.jsx)(n.h2,{id:"manual-installation",children:"Manual installation"}),"\n",(0,s.jsxs)(n.p,{children:["The following section will walk through the dependencies and Rust installation process for Linux. If you're on Windows, we recommend to setup ",(0,s.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/windows/wsl/install",children:"Windows Subsystem Linux"}),", reading the ",(0,s.jsx)(n.a,{href:"https://ubuntu.com/tutorials/install-ubuntu-on-wsl2-on-windows-10#1-overview",children:"Ubuntu tutorial"})," or picking another ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#server",children:"supported distro"}),". The WSL will let you use Linux applications, utilities and bash command tools you'll find in the tutorial."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["We're only supporting Linux operating system (server edition). Find the list of supported OS ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#server",children:"here"}),"."]})}),"\n",(0,s.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsx)(n.p,{children:"To follow the guide, you will need the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Familiarity with the command-line interface"}),"\n",(0,s.jsx)(n.li,{children:"Git"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"You're required to have some experience with the command-line interface and have Git installed; Also, you should be happy to troubleshoot, since versions might differ from the time of writing and reading. Most times, a simple web search provides the best answers."}),"\n",(0,s.jsxs)(n.p,{children:["If you don't have Git installed, learn more about it and the instructions by reading the ",(0,s.jsx)(n.a,{href:"https://git-scm.com/book/en/v2",children:"Git documentation"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"create-a-user-1",children:"Create a user"}),"\n",(0,s.jsx)(l.ZP,{}),"\n",(0,s.jsx)(n.h3,{id:"install-rust-with-rustup-tool",children:"Install Rust with Rustup tool"}),"\n",(0,s.jsxs)(n.p,{children:["Visit the ",(0,s.jsx)(n.a,{href:"https://www.rust-lang.org/",children:"Rust website"})," getting started guide, to find, copy and run the ",(0,s.jsx)(n.a,{href:"https://rustup.rs/",children:"Rustup tool"})," for installation and version management."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://curl.se/",children:"curl"})," is an application that is generally available in most OS, if missing install it. Find more ",(0,s.jsx)(n.a,{href:"https://curl.se/",children:"here"}),"."]})}),"\n",(0,s.jsx)(n.p,{children:"Alternatively, if you have installed Rust in the past, you may want to update it \ud83d\udc4c."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"rustup update\n"})}),"\n",(0,s.jsx)(n.p,{children:"During the installation process, if asked about preferences, select the default option!"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"You can uninstall at any time with rustup self uninstall and\nthese changes will be reverted.\n\nCurrent installation options:\n\n\n default host triple: x86_64-unknown-linux-gnu\n default toolchain: stable (default)\n profile: default\n modify PATH variable: yes\n\n1) Proceed with installation (default)\n2) Customize installation\n3) Cancel installation\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Once complete, you'll have to restart your current shell or reload the \"PATH\" environment variable to include Cargo's bin directory ",(0,s.jsx)(n.code,{children:"$HOME/.cargo/bin"}),'. This is required to let you use "cargo" command globally.']})}),"\n",(0,s.jsx)(n.p,{children:"To configure your current shell, run:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'source "$HOME/.cargo/env"\n'})}),"\n",(0,s.jsxs)(n.p,{children:["From then on, the latest version of Cargo (Rust's build and package manager tool) should be installed. Learn more about Cargo, ",(0,s.jsx)(n.a,{href:"https://doc.rust-lang.org/cargo/index.html",children:"here"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Check the ",(0,s.jsx)(n.code,{children:"version"})," to confirm's working correctly:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cargo --version\n"})}),"\n",(0,s.jsx)(n.p,{children:"Here's the output we got (beware that our version might differ to yours, it's expected \ud83d\ude05)."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cargo 1.65.0 (4bc8f24d3 2022-10-20)\n"})}),"\n",(0,s.jsx)(n.h3,{id:"lightning-installer-rust-dependencies",children:"Lightning installer rust dependencies"}),"\n",(0,s.jsxs)(n.p,{children:["Rustup subcommands deal with ",(0,s.jsx)(n.a,{href:"https://rust-lang.github.io/rustup/concepts/toolchains.html",children:"toolchains"}),", a collection of programs required to compile a Rust application."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"rustup toolchain list\n"})}),"\n",(0,s.jsx)(n.p,{children:"For example, on Linux Ubuntu we generally have it set to the default:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"stable-x86_64-unknown-linux-gnu (default)\n"})}),"\n",(0,s.jsx)(n.p,{children:"While on macOS:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"stable-x86_64-apple-darwin (default)\n"})}),"\n",(0,s.jsx)(n.p,{children:"Make sure you have Rustup set to the desired toolchain as default if required \ud83d\udc81\u200d\u2640\ufe0f!"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"rustup default \n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"Rust compilation is long and compiler caching can help speed things up immensely. The Lightning CLI project can be used to reduce the perceived compilation times."})}),"\n",(0,s.jsx)(n.h3,{id:"linux-dependencies",children:"Linux dependencies"}),"\n",(0,s.jsx)(n.p,{children:"On Linux (we'll stick with Ubuntu as the Linux distro example), start by updating the package information in the source list and then upgrade all the installed packages with the latest versions (do the equivalent for your Linux distro), as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo apt-get update\nsudo apt-get upgrade\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["You can optionally pass the ",(0,s.jsx)(n.code,{children:"y"})," flag to skip any user prompts e.g. ",(0,s.jsx)(n.code,{children:"sudo apt-get update -y"})," to any remaining apt-get commands."]})}),"\n",(0,s.jsx)(n.p,{children:"Install the build-essentials packages, necessary for compiling general software and for our use-case Lightning CLI."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo apt-get install build-essential\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Followed by the required tools to compile the application (",(0,s.jsx)(n.a,{href:"https://cmake.org/",children:"cmake"}),", ",(0,s.jsx)(n.a,{href:"https://clang.llvm.org/",children:"clang"}),", ",(0,s.jsx)(n.a,{href:"https://www.freedesktop.org/wiki/Software/pkg-config/",children:"pkg-config"})," and ",(0,s.jsx)(n.a,{href:"https://packages.debian.org/sid/libssl-dev",children:"libssl-dev "}),")."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo apt-get install cmake clang pkg-config libssl-dev gcc-multilib\n"})}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsxs)(n.p,{children:["For Debian, you should install ",(0,s.jsx)(n.code,{children:"gcc"}),", as follows:"]}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo apt-get update\nsudo apt-get install gcc\n"})})]}),"\n",(0,s.jsxs)(n.p,{children:["Now install the ",(0,s.jsx)(n.a,{href:"https://grpc.io/docs/protoc-installation/",children:"Protobufer Compiler"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo apt-get install protobuf-compiler\n"})}),"\n",(0,s.jsx)(n.p,{children:"Ensure the compiler version is 3+"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"protoc --version\n"})}),"\n",(0,s.jsx)(n.h3,{id:"installing-lightning-cli",children:"Installing Lightning CLI"}),"\n",(0,s.jsx)(n.p,{children:"If you haven't already, clone the Fleek Network's Lightning repository to your machine."}),"\n",(0,s.jsx)(o.ZP,{}),"\n",(0,s.jsxs)(n.p,{children:["When git clone completes \ud83d\udc4d, ",(0,s.jsx)(n.code,{children:"change directory"})," to the project directory e.g. we cloned to the default name ",(0,s.jsx)(n.code,{children:"~/fleek-network/lightning"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cd ~/fleek-network/lightning\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"~/fleek-network/lightning"})," or ",(0,s.jsx)(n.code,{children:"$HOME/fleek-network/lightning"})," directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation."]})}),"\n",(0,s.jsxs)(n.p,{children:["If you list (",(0,s.jsx)(n.code,{children:"ls"}),") the files in the directory, it should be similar to:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:".\n\u251c\u2500\u2500 CODE_OF_CONDUCT.md\n\u251c\u2500\u2500 CONTRIBUTING.md\n\u251c\u2500\u2500 Cargo.lock\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 codecov.yml\n\u251c\u2500\u2500 core\n\u251c\u2500\u2500 docs\n\u251c\u2500\u2500 lib\n\u251c\u2500\u2500 lightning.toml\n\u251c\u2500\u2500 rust-toolchain\n\u251c\u2500\u2500 rustfmt.toml\n\u251c\u2500\u2500 services\n\u2514\u2500\u2500 target\n"})}),"\n",(0,s.jsxs)(n.p,{children:["At this point, you should be able to run the ",(0,s.jsx)(n.code,{children:"install"})," command successfully."]}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsx)(n.p,{children:"If you already had Rust installed, or the project before, and skipped instructions directly here, there might be case where you get errors. So, make sure to clear your work directory:"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cargo clean\ncargo update\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Start the ",(0,s.jsx)(n.code,{children:"install"})," process by running the command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cargo +stable build --release\n"})}),"\n",(0,s.jsx)(n.p,{children:"The installation process is long, as it compiles the application binary for us from the source code."}),"\n",(0,s.jsx)(n.p,{children:"\ud83c\udf08 Here's the output when successful! Note, that the output might differ slightly from time of writing."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:" Finished release [optimized] target(s) in 11m 22s\n Installing /home/lgtn/.cargo/bin/lightning\n Installed package `lightning v0.1.0 (/crates/lightning)` (executable `lightning`)\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Once Rust generates the binary ",(0,s.jsx)(n.code,{children:"lightning-node"}),", you can find it in the project root ",(0,s.jsx)(n.code,{children:"target"})," directory. Depending on the usage of ",(0,s.jsx)(n.code,{children:"+stable"})," flag, the binary should be located at ",(0,s.jsx)(n.code,{children:"~/fleek-network/lightning/target/debug/lightning-node"})," or ",(0,s.jsx)(n.code,{children:"~/fleek-network/lightning/target/release/lightning-node"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["You can create an ",(0,s.jsx)(n.code,{children:"lgtn"})," symbolic link to ",(0,s.jsx)(n.code,{children:"/usr/local/bin"})," to make it available globally."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'sudo ln -s "$HOME/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn\n'})}),"\n",(0,s.jsxs)(n.p,{children:["After completing, you'll have the ability to type ",(0,s.jsx)(n.code,{children:"lgtn"})," to execute the binary anywhere for your user account. Other users might find it better to copy or create an ",(0,s.jsx)(n.code,{children:"alias"})," instead."]}),"\n",(0,s.jsxs)(n.p,{children:["Run the ",(0,s.jsx)(n.code,{children:"lgtn help"})," sub-command as a checkup:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"Usage: lightning-node [OPTIONS] \n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config Path to the toml configuration file [default: lightning.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["Beware that your output might differ a bit, as ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"Lightning"}),' is in constant development. Note that you\'ll have to "re-install" every time you want to pull updates from the source repository, as the update at the time of writing is done manually and not automatically.']})}),"\n",(0,s.jsx)(n.h3,{id:"key-generator",children:"Key generator"}),"\n",(0,s.jsx)(n.p,{children:"Before starting the node, you should generate a public and private key."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"lgtn keys generate\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The keys will be generated and placed under the system directory ",(0,s.jsx)(n.code,{children:"~/.lightning/keystore"}),". The ",(0,s.jsx)(n.code,{children:"private"})," key is the user's responsibility and no one else can generate or recover it for you, including Fleek Network or any team member. Your keys, your responsibility!"]}),"\n",(0,s.jsx)(n.h3,{id:"set-user-path-in-configtoml",children:"Set user path in config.toml"}),"\n",(0,s.jsx)(a.ZP,{}),"\n",(0,s.jsx)(n.h3,{id:"set-testnet-in-configtoml",children:"Set testnet in config.toml"}),"\n",(0,s.jsxs)(n.p,{children:["Set the testnet attribute to ",(0,s.jsx)(n.code,{children:"true"})," in the ",(0,s.jsx)(n.code,{children:"config.toml"})," located in the path ",(0,s.jsx)(n.code,{children:"~/.lightning/config.toml"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'[application]\ndb_path = "~/.lightning/data/app_data"\nmode = "Prod"\nstorage = "RocksDb"\ntestnet = true\n\n...\n'})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The configuration file should have more content, which was omitted here to keep it short and to the point. You're interested in the ",(0,s.jsx)(n.code,{children:"testnet"})," property name only."]})}),"\n",(0,s.jsx)(n.h3,{id:"start-the-node",children:"Start the node"}),"\n",(0,s.jsx)(n.admonition,{title:"Warning",type:"caution",children:(0,s.jsxs)(n.p,{children:["To participate in the ",(0,s.jsx)(n.a,{href:"/docs/roadmap",children:"alpha Testnet"}),", you have to through the onboarding process. Make sure you request access by following the ",(0,s.jsx)(n.a,{href:"/docs/node/testnet-onboarding",children:"onboarding instructions"}),". If you fail to enable your node for testnet, it'll not run!"]})}),"\n",(0,s.jsxs)(n.p,{children:["To start the node, you should execute the sub-command ",(0,s.jsx)(n.code,{children:"run"}),". Noteworthy that while it launches the node, you're recommended to set up a systemd service to run it for a long period."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"lgtn run\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"WARNING",type:"caution",children:(0,s.jsxs)(n.p,{children:["We recommend setting up the process as a systemd service, as it's a long-running process. Instructions to setup a systemd service are available in the section ",(0,s.jsx)(n.a,{href:"#systemd-service-setup",children:"Systemd Service Setup"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["Great! You have successfully installed all the required packages, and libraries and have compiled and installed lightning. Check the section ",(0,s.jsx)(n.a,{href:"/docs/node/health-check",children:"Health Check"})," to learn how to do a node health checkup."]}),"\n",(0,s.jsx)(n.h3,{id:"systemd-service-setup",children:"Systemd Service Setup"}),"\n",(0,s.jsx)(n.p,{children:"Create a new Systemd service file:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo touch /etc/systemd/system/lightning.service\n"})}),"\n",(0,s.jsx)(n.p,{children:"Open the file and put the following content:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run\nExecStop=killall -9 lgtn\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"caution",children:(0,s.jsxs)(n.p,{children:["Notice that we're using ",(0,s.jsx)(n.code,{children:"lgnt"})," as the username. If you have a different custom username change it accordingly. Beware that we've recommended using a ",(0,s.jsx)(n.code,{children:"non-root"})," user, as described in the section ",(0,s.jsx)(n.a,{href:"#create-a-user-1",children:"create a user"}),"."]})}),"\n",(0,s.jsx)(c.ZP,{}),"\n",(0,s.jsx)(n.p,{children:"Change the file permissions for the service:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo chmod 644 /etc/systemd/system/lightning.service\n"})}),"\n",(0,s.jsx)(n.p,{children:"After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,s.jsx)(n.p,{children:"To start the service at boot, use the enable command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl enable lightning.service\n"})}),"\n",(0,s.jsx)(n.p,{children:"Create the directory where the log message will be stored, as follows:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo mkdir -p /var/log/lightning\n"})}),"\n",(0,s.jsx)(n.p,{children:"You may want to create empty placeholders for the stdout and stderr log files:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo touch /var/log/lightning/output.log\nsudo touch /var/log/lightning/diagnostic.log\n"})}),"\n",(0,s.jsx)(n.admonition,{title:"WARNING",type:"caution",children:(0,s.jsxs)(n.p,{children:["We're assuming that you've ",(0,s.jsx)(n.a,{href:"#create-a-user-1",children:"created a new user"})," and can start the service operating without ",(0,s.jsx)(n.strong,{children:"sudo"}),"."]})}),"\n",(0,s.jsx)(n.p,{children:"Start the service by:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl start lightning.service\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section ",(0,s.jsx)(n.a,{href:"/docs/node/analyzing-logs",children:"Log Messages"}),"."]})}),"\n",(0,s.jsxs)(n.p,{children:["To learn more, visit the section ",(0,s.jsx)(n.a,{href:"#use-systemctl-to-manage-systemd-service",children:"Use Systemctl to manage the Lightning Service"})]}),"\n",(0,s.jsx)(n.h2,{id:"docker-installation",children:"Docker installation"}),"\n",(0,s.jsxs)(n.p,{children:["In this section we'll describe how to run a Fleek Network Lightning Node as a Docker Service. We're going to assume that you have Docker installed and running. If you need help to install Docker, check the guide ",(0,s.jsx)(n.a,{href:"/guides/Node%20Operators/running-a-node-in-docker",children:"running a node in docker"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["a) We can ",(0,s.jsx)(n.a,{href:"#quick-pull-and-run",children:"easily pull and run"})," the Lightning Docker image from our registry to run the Docker Container quickly."]}),"\n",(0,s.jsxs)(n.p,{children:["b) ",(0,s.jsx)(n.a,{href:"#build-from-source",children:"Build the Docker image"})," from the repository source code"]}),"\n",(0,s.jsxs)(n.p,{children:["Optionally, ",(0,s.jsx)(n.a,{href:"#docker-container-as-a-systemd-service",children:"wrap the Docker Container as a Systemd Service"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The Docker images are built for particular CPU architectures (x64) and as declared in the ",(0,s.jsx)(n.a,{href:"/docs/node/requirements/#specs",children:"requirements"}),", we're mainly supporting ",(0,s.jsx)(n.code,{children:"GenuineIntel"}),", as there has been reports of failure to build and run the binary on AMD. If you're running on a ",(0,s.jsx)(n.code,{children:"AuthenticAMD"}),", provide us feedback on our ",(0,s.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"Discord"}),"."]})}),"\n",(0,s.jsx)(n.h3,{id:"quick-pull-and-run",children:"Quick pull and run"}),"\n",(0,s.jsx)(n.p,{children:"You can pull an run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it ghcr.io/fleek-network/lightning:latest\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The command has a list of ports ",(0,s.jsx)(n.code,{children:"-p"})," values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#ports",children:"ports"})," to find the latest updates."]})}),"\n",(0,s.jsx)(n.h3,{id:"build-from-source",children:"Build from source"}),"\n",(0,s.jsxs)(n.p,{children:["Clone the repository located at ",(0,s.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"https://github.com/fleek-network/lightning"}),"."]}),"\n",(0,s.jsx)(o.ZP,{}),"\n",(0,s.jsxs)(n.p,{children:["Change directory to the project source code directory, e.g. the default ",(0,s.jsx)(n.code,{children:"~/fleek-network/lightning"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"cd ~/fleek-network/lightning\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Build the image named as ",(0,s.jsx)(n.code,{children:"lightning"})," from our Dockerfile:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo docker build -t lightning -f ./Dockerfile .\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Take note of the Docker image name ",(0,s.jsx)(n.code,{children:"lightning"}),", as that's the name we'll use and pass to the ",(0,s.jsx)(n.code,{children:"Docker run"})," to be successful. You can name it differently if that's your preference."]})}),"\n",(0,s.jsxs)(n.p,{children:["Once the image is built, you can launch the Docker Container with a ",(0,s.jsx)(n.code,{children:"--name"})," such as ",(0,s.jsx)(n.code,{children:"lightning-node"})," from the ",(0,s.jsx)(n.code,{children:"lightning"})," image we just created by running:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it lightning\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["The command has a list of ports ",(0,s.jsx)(n.code,{children:"-p"})," values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#ports",children:"ports"})," to find the latest updates."]})}),"\n",(0,s.jsxs)(n.p,{children:["If a ",(0,s.jsx)(n.code,{children:"~/.lightning"})," directory or ",(0,s.jsx)(n.code,{children:"~/.lightning/keystore"})," doesn't exist, one is created for you on ",(0,s.jsx)(n.code,{children:"docker run"}),". You'll need to have the directory populated with the ",(0,s.jsx)(n.code,{children:"config.toml"})," and ",(0,s.jsx)(n.code,{children:"keystore"})," if you want to use a particular identity. Learn more about managing the keystore ",(0,s.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"here"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"docker-container-as-a-systemd-service",children:"Docker Container as a Systemd Service"}),"\n",(0,s.jsx)(n.p,{children:"Create a unit configuration file:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo touch /etc/systemd/system/docker-lightning.service\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Open the ",(0,s.jsx)(n.code,{children:"docker-lightning.service"})," file in your favourite text editor and put the content:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nRestart=always\nRestartSec=5\nTimeoutStartSec=0\nExecStartPre=-/usr/bin/docker kill lightning-node\nExecStartPre=-/usr/bin/docker rm lightning-node\nExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest\nExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest\nExecStop=/usr/bin/docker stop lightning-node\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,s.jsx)(n.p,{children:"Change the file permissions by running the command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo chmod 644 /etc/systemd/system/docker-lightning.service\n"})}),"\n",(0,s.jsx)(n.p,{children:"Next, reload the Systemctl Daemon:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,s.jsx)(n.p,{children:"Enable the service on startup when the system boots:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo systemctl enable docker-lightning.service\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Learn how to manage the Systemd Service by reading the section ",(0,s.jsx)(n.a,{href:"/docs/node/systemd-service",children:"systemd service"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"frequently-used-commands-quick-reference",children:"Frequently Used Commands (Quick Reference)"}),"\n",(0,s.jsxs)(n.p,{children:["A quick reference of the most Frequently Used Commands are available for ",(0,s.jsx)(n.a,{href:"/references/Lightning%20CLI/frequently-used-commands-for-native-setup",children:"Native"})," and ",(0,s.jsx)(n.a,{href:"/references/Docker/frequently-used-commands-for-docker-setup",children:"Docker"})," setups. If you'd like a more in depth explanation of the commands, check the ",(0,s.jsx)(n.a,{href:"/docs/node/health-check",children:"health check"}),", ",(0,s.jsx)(n.a,{href:"/docs/node/analyzing-logs",children:"analyzing logs"}),", ",(0,s.jsx)(n.a,{href:"/docs/node/systemd-service",children:"systemd service"})," and ",(0,s.jsx)(n.a,{href:"/guides/index",children:"guides"})," sections separately."]}),"\n",(0,s.jsx)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function x(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>i});t(7294);var s=t(5893);const i=e=>{let{image:n,name:t,title:i,url:r,communityMember:o=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:r,target:"_blank",alt:t,children:(0,s.jsx)("img",{src:n,alt:t})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:r,target:"_blank",alt:t,children:t})}),(0,s.jsx)("span",{className:"title",children:i}),(0,s.jsxs)("span",{className:"discord",children:[o?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>o});var s=t(7294);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/51f2bfad.77ca8786.js b/assets/js/51f2bfad.03938b9f.js similarity index 87% rename from assets/js/51f2bfad.77ca8786.js rename to assets/js/51f2bfad.03938b9f.js index 65c8751f7..63ed78f60 100644 --- a/assets/js/51f2bfad.77ca8786.js +++ b/assets/js/51f2bfad.03938b9f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[71],{3386:e=>{e.exports=JSON.parse('{"label":"server","permalink":"/docs/tags/server","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/requirements","title":"Requirements","description":"The requirements for the server specifications on which the Fleek Network Node can be installed and run.","permalink":"/docs/node/requirements"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[71],{3386:e=>{e.exports=JSON.parse('{"label":"server","permalink":"/docs/tags/server","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/requirements","title":"Requirements","description":"The requirements for the server specifications on which the Fleek Network Node can be installed and run.","permalink":"/docs/node/requirements"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/53ca291c.82f62613.js b/assets/js/53ca291c.7e6b99d7.js similarity index 89% rename from assets/js/53ca291c.82f62613.js rename to assets/js/53ca291c.7e6b99d7.js index 342f0283d..33f77f610 100644 --- a/assets/js/53ca291c.82f62613.js +++ b/assets/js/53ca291c.7e6b99d7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3863],{4586:e=>{e.exports=JSON.parse('{"label":"economics","permalink":"/docs/tags/economics","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3863],{4586:e=>{e.exports=JSON.parse('{"label":"economics","permalink":"/docs/tags/economics","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/5437f376.a307a139.js b/assets/js/5437f376.a307a139.js new file mode 100644 index 000000000..0885fa460 --- /dev/null +++ b/assets/js/5437f376.a307a139.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[909],{3616:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>h,default:()=>u,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var i=t(5893),s=t(1151),r=t(3872),o=t(5979);const a={title:"Managing the keystore",hide_title:!0,slug:"managing-the-keystore",date:new Date("2023-11-14T12:00:00.000Z"),image:"./assets/managing-the-keystore.png?202311181211",description:"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to",category:"Tutorial",tags:["guide","keystore","public keys","private keys","keys"]},h=void 0,l={id:"Node Operators/managing-the-keystore",title:"Managing the keystore",description:"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to",source:"@site/guides/Node Operators/managing-the-keystore.md",sourceDirName:"Node Operators",slug:"/Node Operators/managing-the-keystore",permalink:"/guides/Node Operators/managing-the-keystore",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/managing-the-keystore.md",tags:[{label:"guide",permalink:"/guides/tags/guide"},{label:"keystore",permalink:"/guides/tags/keystore"},{label:"public keys",permalink:"/guides/tags/public-keys"},{label:"private keys",permalink:"/guides/tags/private-keys"},{label:"keys",permalink:"/guides/tags/keys"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Managing the keystore",hide_title:!0,slug:"managing-the-keystore",date:"2023-11-14T12:00:00.000Z",image:"./assets/managing-the-keystore.png?202311181211",description:"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to",category:"Tutorial",tags:["guide","keystore","public keys","private keys","keys"]},sidebar:"defaultSidebar",previous:{title:"How to manage log files",permalink:"/guides/Node Operators/how-to-manage-log-files"},next:{title:"Running a node in Docker",permalink:"/guides/Node Operators/running-a-node-in-docker"}},d={image:t(4110).Z},c=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Configuration file",id:"configuration-file",level:2},{value:"Locating the file",id:"locating-the-file",level:3},{value:"Configuration sections",id:"configuration-sections",level:3},{value:"Type of keys",id:"type-of-keys",level:3},{value:"Key privacy",id:"key-privacy",level:3},{value:"Identity selection",id:"identity-selection",level:3},{value:"Backing up the keystore",id:"backing-up-the-keystore",level:2},{value:"Lower security",id:"lower-security",level:3},{value:"Higher security",id:"higher-security",level:3},{value:"Storage",id:"storage",level:3},{value:"Loading keys on runtime",id:"loading-keys-on-runtime",level:2},{value:"Restoring the keystore",id:"restoring-the-keystore",level:2},{value:"Conclusion",id:"conclusion",level:2}];function p(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Managing the keystore",src:t(4350).Z+"",width:"1450",height:"816"})}),"\n","\n","\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"Fleek Network incentivizes participation by rewarding its node providers. A node is identifiable by an identity, which the reward mechanism uses to identify the node to reward it."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["At time of writing the rewards mechanism hasn't yet been introduced, read the ",(0,i.jsx)(n.a,{href:"https://blog.fleek.network/post/fleek-network-testnet-plans",children:"testnet plans"})," to get a high level perspective over the plans. A token and economics paper should be released in the future."]})}),"\n",(0,i.jsxs)(n.p,{children:["We'll use the term identity to describe the key store declared in the configuration, in our case ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail",children:"PEM"})," files. The content of the PEM files and the file itself should be kept secret."]}),"\n",(0,i.jsxs)(n.p,{children:["The key store is in the file system and the location is defined in the Fleek Network ",(0,i.jsx)(n.code,{children:"~/.lightning/config.toml"}),", as a private key stored in an identity named PEM file (by default ",(0,i.jsx)(n.code,{children:"consensus.pem"})," and ",(0,i.jsx)(n.code,{children:"node.pem"}),"). It's essential to understand this, as you may want to copy the identity to a new server setup, to persist the identity accross to the new server setup."]}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility."})}),"\n",(0,i.jsxs)(n.p,{children:["The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any ",(0,i.jsx)(n.a,{href:"/docs/node/requirements#server",children:"supported system"})," you're migrating to."]}),"\n",(0,i.jsx)(n.h2,{id:"pre-requisites",children:"Pre-requisites"}),"\n",(0,i.jsx)(n.p,{children:"To follow the guide, you will need the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Familiarity with the command-line interface"}),"\n",(0,i.jsxs)(n.li,{children:["A basic understanding of ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Public-key_cryptography",children:"how public key cryptography works"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"configuration-file",children:"Configuration file"}),"\n",(0,i.jsx)(n.h3,{id:"locating-the-file",children:"Locating the file"}),"\n",(0,i.jsxs)(n.p,{children:["The Lightning CLI has a configuration file in the home directory of the user, which by default is located in the path ",(0,i.jsx)(n.code,{children:"$HOME/.lightning"})," or ",(0,i.jsx)(n.code,{children:"~/.lightning"})," under the name ",(0,i.jsx)(n.code,{children:"config.toml"}),". It's generally described as ",(0,i.jsx)(n.code,{children:"~/.lightning/config.toml"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The tilde in ",(0,i.jsx)(n.code,{children:"~/.lightning"})," represents ",(0,i.jsx)(n.code,{children:"$HOME"})," which is simpler, but we'll use ",(0,i.jsx)(n.code,{children:"$HOME"})," to make it easy to follow."]})}),"\n",(0,i.jsxs)(n.p,{children:["If you're following the install recommendations you should be logged in with a ",(0,i.jsx)(n.strong,{children:"sudoer"})," account. For our guide, let's imagine that the ",(0,i.jsx)(n.strong,{children:"sudoer"})," username we are logged in with is ",(0,i.jsx)(n.strong,{children:"lgtn"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The word ",(0,i.jsx)(n.strong,{children:"sudo"}),' is the abbreviation of the term "super user do". As the name suggests, it is the privilege that a super user, such as an administrator has to do whatever it wants in the system. A super user can be an administrator, like the ',(0,i.jsx)(n.strong,{children:"root"})," or what we described here as a user in the group ",(0,i.jsx)(n.strong,{children:"sudo"})," aka ",(0,i.jsx)(n.strong,{children:"sudoer"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"If you are logged in with a username, that'd be:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"/home//.lightning/config.toml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["For our example for user ",(0,i.jsx)(n.code,{children:"lgtn"})," that is:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"/home/lgtn/.lightning/config.toml\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you log in with another user, let's say ",(0,i.jsx)(n.code,{children:"fleek"})," it'd be:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"/home/fleek/.lightning/config.toml\n"})}),"\n",(0,i.jsx)(n.p,{children:"At any time, you can check which user you are logged in with by running the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"whoami\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Here's an example of our user ",(0,i.jsx)(n.code,{children:"lgtn"}),", which for the command above outputs:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["To switch to a particular user, you can run the command ",(0,i.jsx)(n.code,{children:"su "})," e.g. for the user ",(0,i.jsx)(n.strong,{children:"lgtn"})," we would execute the command ",(0,i.jsx)(n.code,{children:"su lgtn"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["Now that you know where to locate the configuration file for any given user you are logged in with, learn about the ",(0,i.jsx)(n.a,{href:"#configuration-sections",children:"Configuration sections"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"configuration-sections",children:"Configuration sections"}),"\n",(0,i.jsxs)(n.p,{children:["The Fleek Network node configuration settings are located in the path ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/config.toml"}),", and it's organized by configuration sections."]}),"\n",(0,i.jsx)(n.p,{children:"At the time of writing, we have a TOML file with sections. Here are some examples amongst others:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"application"}),"\n",(0,i.jsx)(n.li,{children:"origin-ipfs"}),"\n",(0,i.jsx)(n.li,{children:"rpc"}),"\n",(0,i.jsx)(n.li,{children:"signer"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Each of the sections holds several property names and values. If you are accustomed to the ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/JSON",children:"JSON"})," or ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/YAML",children:"YAML"})," formats, you'll find the TOML format a bit similar (if you'd like to learn more about the TOML file format, read about it ",(0,i.jsx)(n.a,{href:"https://toml.io/en/",children:"here"}),")."]}),"\n",(0,i.jsx)(n.p,{children:"By default, and at time of writing the Lightning CLI configuration file (config.toml) is similar to:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'[BLANK]\n\n[application]\ndb_path = "/home/lgtn/.lightning/data/app_db"\nmode = "Prod"\nstorage = "RocksDb"\ntestnet = true\n\n[blockserver]\naddress = "0.0.0.0:4211"\n\n[broadcast]\naddress = "0.0.0.0:4200"\n\n[consensus]\nstore_path = "/home/lgtn/.lightning/data/narwhal_store"\n\n[dht]\naddress = "0.0.0.0:8101"\nbootstrappers = []\n\n[fetcher]\n\n[fsstore]\nroot = "/home/lgtn/.lightning/blockstore"\n\n[[handshake.transport]]\nsignal_address = "0.0.0.0:4210"\ntype = "WebRTC"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[origin-ipfs.gateways]]\nauthority = "ipfs.io"\nprotocol = "Https"\n\n[[origin-ipfs.gateways]]\nauthority = "fleek.ipfs.io"\nprotocol = "Https"\n\n[[origin-ipfs.gateways]]\nauthority = "ipfs.runfission.com"\nprotocol = "Https"\n\n[rep-collector]\nreporter_buffer_size = 5\n\n[resolver]\nstore_path = "/home/lgtn/.lightning/data/resolver_store"\n\n[rpc]\naddr = "0.0.0.0"\nport = 4230\n\n[service-executor]\nservices = [0, 1]\n\n[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n\n[topology]\ntesting_min_nodes = 9\ntesting_target_k = 8\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"Beware that the configuration file might look a bit different depending on the version you're running and the current development features in place by the Fleek Network core team. You shouldn't copy the example above and replace with yours, as this only servers for illustrative purposes."})}),"\n",(0,i.jsx)(n.p,{children:"Some advanced use cases might require dealing with the host and port number binding, depending on the service provider's needs and customization. We'll keep things simple and assume the default settings."}),"\n",(0,i.jsxs)(n.p,{children:["In this guide, we are interested in the ",(0,i.jsx)(n.code,{children:"[signer]"})," section settings for the ",(0,i.jsx)(n.code,{children:"consensus_key_path"})," and ",(0,i.jsx)(n.code,{children:"node_key_path"})," which by default is set to ",(0,i.jsx)(n.code,{children:"~/.lightning/keystore"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The identity is a text description for the Keystore and at the time of writing we have not yet implemented multiple identity management via the CLI. Thereupon, the identity value serves to find the filename match in the ",(0,i.jsx)(n.code,{children:"keystore_path"}),". This might change as we progress with development. Check the ",(0,i.jsx)(n.a,{href:"#identity-selection",children:"Identity selection"})," to learn more about it!"]})}),"\n",(0,i.jsx)(n.h3,{id:"type-of-keys",children:"Type of keys"}),"\n",(0,i.jsxs)(n.p,{children:["There are three types of keys related to the identity of a node and the account ownership. The keys are based in public-key cryptography, or asymmetric cryptography where each key pair consists of a public key and a corresponding private key. The keys are described in the section ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network/#identity-on-the-fleek-network",children:"identity on the Fleek Network"})," as follows:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["A Node key (ConsensusPublicKey) is ",(0,i.jsx)(n.a,{href:"https://electriccoin.co/blog/new-snark-curve/",children:"BLS12-381"})," which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["A Node Networking key (NodePublicKey) is ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/EdDSA",children:"Ed25519"})," used for the speed and performance of the network communications"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Account Owner keys are based on ",(0,i.jsx)(n.a,{href:"https://www.secg.org/sec2-v2.pdf",children:"secp256k1"}),", which corresponds to an Ethereum Address"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"For instance, a public key is open to anybody to see, and it represents a unique node identifier in the Fleek Network, a bit like a passport number. On the other hand, the private key is secret, and the operator is responsible to store it privately."}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network relies on cryptography, thus the Fleek Network team and anybody can access, compromise or manipulate the secrets of an identity. On the other hand, the public key can be used by anyone, Fleek Network included, to identify a node or send rewards to the address without jeopardizing identity security."}),"\n",(0,i.jsxs)(n.p,{children:["To learn more about the identities on the Fleek Network ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network/#identity-on-the-fleek-network",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"key-privacy",children:"Key privacy"}),"\n",(0,i.jsx)(n.p,{children:"If you don\u2019t keep your private keys secret, you'll have your node compromised."}),"\n",(0,i.jsx)(n.p,{children:"Here are a few examples of what you should not do:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Share the ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"})," directory file content publicly"]}),"\n",(0,i.jsxs)(n.li,{children:["Track the ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"})," directory files in a version control repository e.g. git"]}),"\n",(0,i.jsxs)(n.li,{children:['Have poor "rights" permissions in UNIX systems e.g. everyone can read, delete, modify ',(0,i.jsx)(n.code,{children:"$HOME/.lightning"})]}),"\n",(0,i.jsx)(n.li,{children:"Allow anyone to access the node provider physically without any access control to the operating and file systems e.g. a VPS provider"}),"\n",(0,i.jsxs)(n.li,{children:["Get rid of a hard drive unformatted or blind erased by selling to somebody or dumping in the bin, which contains ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"There are many other ways of getting compromised, but hopefully, the ones put above give you a good starter into the subject."}),"\n",(0,i.jsx)(n.p,{children:"Remember, the node provider is the only one responsible when managing the key store. Neither Fleek Network nor the most sophisticated AI system presently can compromise the cryptography in use to help you out. You are fully responsible for securing and retaining your private keys."}),"\n",(0,i.jsx)(n.h3,{id:"identity-selection",children:"Identity selection"}),"\n",(0,i.jsx)(n.p,{children:"Multiple identity management is yet to be implemented but in any case, some users might find it trivial to keep multiple identities and switch between them referencing them by name. The following section is not advocating this approach but sharing some approaches that can help certain use-cases."}),"\n",(0,i.jsxs)(n.p,{children:["Let's suppose that we've recently moved to a new server setup and copied our previous server keystore keys as ",(0,i.jsx)(n.code,{children:"consensus.pem"})," and ",(0,i.jsx)(n.code,{children:"node.pem"})," and renamed the ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore/*.pem"})," to ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore/new-*.pem"}),"."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["We are using a wildcard ",(0,i.jsx)(n.code,{children:"*"})," to reduce verbosity. The wildcard means as replacement for all the filenames encountered in the path and extension without having to name them individually as we know they are ",(0,i.jsx)(n.code,{children:"consensus.pem"})," and ",(0,i.jsx)(n.code,{children:"node.pem"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["To illustrate this scenario, here's an example of how our ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"})," directory could look like:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:".\n\u251c\u2500\u2500 new-consensus.pem\n\u251c\u2500\u2500 new-node.pem\n\u2514\u2500\u2500 old-consensus.pem\n\u2514\u2500\u2500 old-node.pem\n\n0 directories, 4 file\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"old-*.pem"})," files are the original key store and ",(0,i.jsx)(n.code,{children:"new-*.pem"})," could correspond to the new identity created while setting up the node in the new server."]}),"\n",(0,i.jsxs)(n.p,{children:["Since we have ",(0,i.jsx)(n.code,{children:"[signer]"})," set to the default values, in particular:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",children:'[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["We'd be required to change and switch to the preferred keys. The identity is switch to the provided values once the node is restarted. Thus, we can switch to any identity by changing the ",(0,i.jsx)(n.code,{children:"[signer]"})," ",(0,i.jsx)(n.code,{children:"consensus_key_path"})," and ",(0,i.jsx)(n.code,{children:"node_key_path"})," pathname values anytime as long we restart the server successfully."]}),"\n",(0,i.jsx)(n.p,{children:"To verify which keys are loaded by the Lightning CLI run the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn keys show\n"})}),"\n",(0,i.jsx)(n.p,{children:"You'd find the public keys in the output, which can be used for comparision and should be different everytime the configuration changes and reloaded. Here's an example of the output:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"Node Public Key: RwPpr35H5AAfWwSDFxwYuJv5TA8PWUd2pdBg+UKsORc=\nConsensus Public Key: s36g09qQzaaOJxi0UZDRCXj3HUUWjaGiYrQV6Ylo9Ih6jMvrnxM5s1OpBnsEj5R1AVYcuxlnVR+oyEjgJ3WpI5LOHSN1Q6Zur33vka3IachBEIKIbsiXMJW16vu4n4bG\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"The PEM files can be named as you wish, but by default we like to keep it sound to avoid confusion and make it as clear as possible."})}),"\n",(0,i.jsx)(n.h2,{id:"backing-up-the-keystore",children:"Backing up the keystore"}),"\n",(0,i.jsx)(n.p,{children:"When dealing with Fleek Network it's crucial to always be aware of the identity. You should backup private keys in case the unexpected happens, as it's impossible to recover the identity in any other way, including the core team, any other person or system."}),"\n",(0,i.jsxs)(n.p,{children:["Backing up your keystore pem files are crucial to ensure the safety and accessibility of your identity on the Fleek Network. For example, if your ",(0,i.jsx)(n.code,{children:"$HOME/.lightning"})," is deleted you'll still be able to restore it if you have backed it up properly."]}),"\n",(0,i.jsx)(n.p,{children:"There are many ways to make identity backups, each with its own benefits and drawbacks. At risk of oversimplifying, we'll focus on a simple manual approach to expose some principles you should have awareness."}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"The security is never stronger than its weakest link, and it is very likely that the weakest link is not the method itself. It's pointless to encrypt the backup archive with sophisticated methods when the passphrase is weak or of an easy guess."})}),"\n",(0,i.jsx)(n.p,{children:"None of the methods described here are being endorsed by the Fleek Network team use the knowledge provided here for educational purposes only and at your own risk."}),"\n",(0,i.jsx)(n.h3,{id:"lower-security",children:"Lower security"}),"\n",(0,i.jsx)(n.p,{children:"If you opt for the lowest level of security, you can use zip and unzip. The man page of zip described the encryption algorithm used to be weaker than PGP."}),"\n",(0,i.jsxs)(n.p,{children:["To zip and encrypto the ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"})," directory run:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"# It'll prompt for password (remember)\nzip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To unzip and decrypt the ",(0,i.jsx)(n.code,{children:"keystore.zip.enc"}),", you'd run:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"# It'll prompt for password (recall)\nunzip keystore.zip.enc -d $HOME/.lightning/keystore\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["We provide the unzip destiny target to the flag ",(0,i.jsx)(n.code,{children:"-d"}),". The unzip process outputs the files onto the desired location ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/keystore"}),", thus overriding any contents. If you have any files in the destiny target directory it'll be overriden, effectively replacing with the output of the unzipped directory content, so make sure you backup any files as required."]})}),"\n",(0,i.jsx)(n.h3,{id:"higher-security",children:"Higher security"}),"\n",(0,i.jsxs)(n.p,{children:["Create a ",(0,i.jsx)(n.code,{children:"Tar"})," archive, which will contain the target directory, files and the Tar stores all of the relative paths in the tarball itself."]}),"\n",(0,i.jsxs)(n.p,{children:["Create a ",(0,i.jsx)(n.code,{children:"tarbar"})," by executing:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'tar -cf "keystore.tar" $HOME/.lightning/keystore\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"keystore.tar"})," should be in the current work directory."]}),"\n",(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.code,{children:"gpg"})," with the ",(0,i.jsx)(n.a,{href:"https://www.gnupg.org/gph/en/manual/x110.html",children:"symmetric option"}),", it creates the keys for that file and request a password to protect them. If you are familiar with asymmetric ",(0,i.jsx)(n.code,{children:"gpg"}),", it's similar, but it's not signed with your public key or such."]}),"\n",(0,i.jsx)(n.p,{children:"The encryption command is:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"keystore.tar.asc"})," should be in the current work directory."]}),"\n",(0,i.jsxs)(n.p,{children:["To decrypt the ",(0,i.jsx)(n.code,{children:"keystore.tar.asc"})," file, enter:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To extract the ",(0,i.jsx)(n.code,{children:"keystore.tar"})," is simple, but be aware that it unarchives with the original directory structure, which might be a bit confusing. So, we'll create a new temporary directory for our example that will use to extract to."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"mkdir $HOME/tar_keystore_extract\n"})}),"\n",(0,i.jsx)(n.p,{children:"Now, run the command to extract to the target directory, as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"tar -xf keystore.tar -C $HOME/tar_keystore_extract\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"/home//.lightning/keystore"})," should be in the ",(0,i.jsx)(n.code,{children:"tar_keystore_extract"})," directory where you'll find the PEM files."]}),"\n",(0,i.jsx)(n.h3,{id:"storage",children:"Storage"}),"\n",(0,i.jsx)(n.p,{children:"The backup archive should only be accessible by yourself. If you decided to store it in a cloud storage provider, be aware of increased security risks. Cloud storage is convenient, but it ultimately puts data into the hands of others. If you're not particularly concerned, or have confidence about the encryption of the files, then that's at your own risk. But it's recommended to store in a physical hard drive that remains disconnected from computers and network devices."}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"If you use cloud storage to store your sensitive data, encryption should be your first line of defense. Encrypting files before uploading them to the cloud is crucial to reduce others from accessing information without your permissions and knowledge."})}),"\n",(0,i.jsx)(n.p,{children:"Remember that the security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only."}),"\n",(0,i.jsx)(n.h2,{id:"loading-keys-on-runtime",children:"Loading keys on runtime"}),"\n",(0,i.jsxs)(n.p,{children:["As described in the section ",(0,i.jsx)(n.a,{href:"#configuration-file",children:"configuration files"})," the default location of the ",(0,i.jsx)(n.code,{children:".lightning"})," system configuration directory is ",(0,i.jsx)(n.code,{children:"$HOME/.lightning"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/config.toml"})," holds the information of where the Lightning CLI node process should pull the keystore pem files. The location of the pem files can be placed anywhere the node process has permissions to read."]}),"\n",(0,i.jsxs)(n.p,{children:["When unarchiving the backup files, the keystore directory or pem files should be placed in the directory declared in the ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/config.toml"}),". That is if the location is the one specified on the runtime\u2013the command declared to launch and run the lightning service, that has the optional ",(0,i.jsx)(n.code,{children:"-c"})," configuration flag that takes any custom location which overrides the default ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/config.toml"}),"."]}),"\n",(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsxs)(n.p,{children:["On runtime, the Lightning service can have specified a configuration file in any readable location. If a configuration pathname isn't passed, it'll default to the ",(0,i.jsx)(n.code,{children:"$HOME/.lightning/config.toml"}),". It's important to understand this to avoid confusion."]}),(0,i.jsx)(n.p,{children:"The service that starts with:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn -c /root/custom-configuration.toml run\n"})}),(0,i.jsx)(n.p,{children:"Can have complete different settings from any of the following:"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn -c /home/lgtn/.lightning/config.toml run\n"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn -c ~/.lightning/config.toml run\n"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn run\n"})}),(0,i.jsx)(n.p,{children:"Due to the fact that any of the fails above might contain different settings declared in the file body."})]}),"\n",(0,i.jsx)(n.p,{children:"For instance, we can imagine a scenario where our service is started with the command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"lgtn -c /home/lgtn/.lightning/config.toml run\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Where the ",(0,i.jsx)(n.code,{children:"keystore"})," is placed under the parent directory ",(0,i.jsx)(n.code,{children:"/home/lgtn/.lightning/"}),". Resulting in the configuration file have the following settings for the hypothetical username ",(0,i.jsx)(n.code,{children:"lgtn"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["On the ",(0,i.jsx)(n.a,{href:"/docs/node/install",children:"install instructions"})," provided by the documentation, a ",(0,i.jsx)(n.a,{href:"/docs/node/install#systemd-service-setup",children:"Systemd service unit"})," is recommended to allow the user control the Lightning service via systemctl. The Systemd service unit file should contain the recommended usage of ",(0,i.jsx)(n.code,{children:"-c"})," configuration. If you have followed the recommendations it should be familiar."]})}),"\n",(0,i.jsx)(n.h2,{id:"restoring-the-keystore",children:"Restoring the keystore"}),"\n",(0,i.jsx)(o.ZP,{}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"We've walked through most basics of where the configuration file is located, the configuration settings we use to set up and run the node, the different configuration sections we have, and most importantly the identity section."}),"\n",(0,i.jsxs)(n.p,{children:["Additionally, a brief guide on the ",(0,i.jsx)(n.a,{href:"#identity",children:"identity"}),", more specifically an introduction to the ",(0,i.jsx)(n.a,{href:"#type-of-keys",children:"type of keys"})," and ",(0,i.jsx)(n.a,{href:"#key-privacy",children:"key privacy"}),", which we find important to understand for anyone seriously interested in running a node by hinting into some system administration and security principles."]}),"\n",(0,i.jsx)(n.p,{children:"Separately, at risk of oversimpliying provided a brief introduction into the backup of the keystore directory."}),"\n",(0,i.jsx)(n.p,{children:"In the future, we'll introduce more advanced topics that will help you improve the knowledge you get from this, but we are glad that you followed this guide and got some comprehension to help you manage the key store."}),"\n",(0,i.jsxs)(n.p,{children:["While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our ",(0,i.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"Discord"})," or by opening a ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network",children:"PR"})," in any of our repositories."]}),"\n",(0,i.jsxs)(n.p,{children:["Discover more about the project by ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"watching/contributing on Github"}),", following us on ",(0,i.jsx)(n.a,{href:"https://twitter.com/fleek_net",children:"Twitter"}),", and joining ",(0,i.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"our community Discord"})," for all the best updates!"]}),"\n",(0,i.jsx)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},5979:(e,n,t)=>{t.d(n,{ZP:()=>o});var i=t(5893),s=t(1151);function r(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["You can restore the keystore (Public Keys) by copying the directory to the ",(0,i.jsx)(n.code,{children:"~/.lightning"})," directory."]}),"\n",(0,i.jsx)(n.p,{children:"Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The keystore and files are located under the hypothetical location ",(0,i.jsx)(n.code,{children:"/my-keystore-backup"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The files in the ",(0,i.jsx)(n.code,{children:"/my-keystore-backup"})," are the following:"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"/my-keystore-backup\n\u251c\u2500\u2500 consensus.pem\n\u2514\u2500\u2500 node.pem\n\n1 directory, 2 files\n"})}),"\n",(0,i.jsx)(n.p,{children:"Considering the above for our example, you would have to run the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"mv /my-keystore-backup /home//.lightning/keystore\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Remember to replace the ",(0,i.jsx)(n.code,{children:""})," with the correct username for the setup. For example, if you have installed the Fleek Network with the username ",(0,i.jsx)(n.code,{children:"lgtn"})," that would be ",(0,i.jsx)(n.code,{children:"/home/lgtn/.lightning/keystore"}),"."]})}),"\n",(0,i.jsxs)(n.p,{children:["Once moved, remember to start the service, you can learn how to manage the service by reading the section ",(0,i.jsx)(n.a,{href:"/docs/node/systemd-service",children:"Systemd Service"}),"."]})]})}function o(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(r,{...e})}):r(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>s});t(7294);var i=t(5893);const s=e=>{let{image:n,name:t,title:s,url:r,communityMember:o=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:r,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:r,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:s}),(0,i.jsxs)("span",{className:"discord",children:[o?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},4110:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/managing-the-keystore-fe4cdb19d2f59c54bcf864b0e069b535.png"},4350:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/managing-the-keystore-fe4cdb19d2f59c54bcf864b0e069b535.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(7294);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5437f376.dd2a93da.js b/assets/js/5437f376.dd2a93da.js deleted file mode 100644 index f542e84ff..000000000 --- a/assets/js/5437f376.dd2a93da.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[909],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>m});var i=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=i.createContext({}),p=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},h=function(e){var t=p(e.components);return i.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},c=i.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),d=p(n),c=a,m=d["".concat(l,".").concat(c)]||d[c]||u[c]||o;return n?i.createElement(m,r(r({ref:t},h),{},{components:n})):i.createElement(m,r({ref:t},h))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:a,r[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>p,toc:()=>d});var i=n(7462),a=(n(7294),n(3905)),o=n(3872),r=n(8275);const s={title:"Managing the keystore",hide_title:!0,slug:"managing-the-keystore",date:new Date("2023-11-14T12:00:00.000Z"),image:"./assets/managing-the-keystore.png?202311181211",description:"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to",category:"Tutorial",tags:["guide","keystore","public keys","private keys","keys"]},l=void 0,p={unversionedId:"Node Operators/managing-the-keystore",id:"Node Operators/managing-the-keystore",title:"Managing the keystore",description:"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to",source:"@site/guides/Node Operators/managing-the-keystore.md",sourceDirName:"Node Operators",slug:"/Node Operators/managing-the-keystore",permalink:"/guides/Node Operators/managing-the-keystore",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/managing-the-keystore.md",tags:[{label:"guide",permalink:"/guides/tags/guide"},{label:"keystore",permalink:"/guides/tags/keystore"},{label:"public keys",permalink:"/guides/tags/public-keys"},{label:"private keys",permalink:"/guides/tags/private-keys"},{label:"keys",permalink:"/guides/tags/keys"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Managing the keystore",hide_title:!0,slug:"managing-the-keystore",date:"2023-11-14T12:00:00.000Z",image:"./assets/managing-the-keystore.png?202311181211",description:"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to",category:"Tutorial",tags:["guide","keystore","public keys","private keys","keys"]},sidebar:"defaultSidebar",previous:{title:"How to manage log files",permalink:"/guides/Node Operators/how-to-manage-log-files"},next:{title:"Running a node in Docker",permalink:"/guides/Node Operators/running-a-node-in-docker"}},h={image:n(4350).Z},d=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Configuration file",id:"configuration-file",level:2},{value:"Locating the file",id:"locating-the-file",level:3},{value:"Configuration sections",id:"configuration-sections",level:3},{value:"Type of keys",id:"type-of-keys",level:3},{value:"Key privacy",id:"key-privacy",level:3},{value:"Identity selection",id:"identity-selection",level:3},{value:"Backing up the keystore",id:"backing-up-the-keystore",level:2},{value:"Lower security",id:"lower-security",level:3},{value:"Higher security",id:"higher-security",level:3},{value:"Storage",id:"storage",level:3},{value:"Loading keys on runtime",id:"loading-keys-on-runtime",level:2},{value:"Restoring the keystore",id:"restoring-the-keystore",level:2},{value:"Conclusion",id:"conclusion",level:2}],u={toc:d},c="wrapper";function m(e){let{components:t,...s}=e;return(0,a.kt)(c,(0,i.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Managing the keystore",src:n(4350).Z,width:"1450",height:"816"})),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"Fleek Network incentivizes participation by rewarding its node providers. A node is identifiable by an identity, which the reward mechanism uses to identify the node to reward it."),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"At time of writing the rewards mechanism hasn't yet been introduced, read the ",(0,a.kt)("a",{parentName:"p",href:"https://blog.fleek.network/post/fleek-network-testnet-plans"},"testnet plans")," to get a high level perspective over the plans. A token and economics paper should be released in the future.")),(0,a.kt)("p",null,"We'll use the term identity to describe the key store declared in the configuration, in our case ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail"},"PEM")," files. The content of the PEM files and the file itself should be kept secret."),(0,a.kt)("p",null,"The key store is in the file system and the location is defined in the Fleek Network ",(0,a.kt)("inlineCode",{parentName:"p"},"~/.lightning/config.toml"),", as a private key stored in an identity named PEM file (by default ",(0,a.kt)("inlineCode",{parentName:"p"},"consensus.pem")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"node.pem"),"). It's essential to understand this, as you may want to copy the identity to a new server setup, to persist the identity accross to the new server setup."),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility.")),(0,a.kt)("p",null,"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"supported system")," you're migrating to."),(0,a.kt)("h2",{id:"pre-requisites"},"Pre-requisites"),(0,a.kt)("p",null,"To follow the guide, you will need the following:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Familiarity with the command-line interface"),(0,a.kt)("li",{parentName:"ul"},"A basic understanding of ",(0,a.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Public-key_cryptography"},"how public key cryptography works"))),(0,a.kt)("h2",{id:"configuration-file"},"Configuration file"),(0,a.kt)("h3",{id:"locating-the-file"},"Locating the file"),(0,a.kt)("p",null,"The Lightning CLI has a configuration file in the home directory of the user, which by default is located in the path ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"~/.lightning")," under the name ",(0,a.kt)("inlineCode",{parentName:"p"},"config.toml"),". It's generally described as ",(0,a.kt)("inlineCode",{parentName:"p"},"~/.lightning/config.toml"),"."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The tilde in ",(0,a.kt)("inlineCode",{parentName:"p"},"~/.lightning")," represents ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME")," which is simpler, but we'll use ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME")," to make it easy to follow.")),(0,a.kt)("p",null,"If you're following the install recommendations you should be logged in with a ",(0,a.kt)("strong",{parentName:"p"},"sudoer")," account. For our guide, let's imagine that the ",(0,a.kt)("strong",{parentName:"p"},"sudoer")," username we are logged in with is ",(0,a.kt)("strong",{parentName:"p"},"lgtn"),"."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The word ",(0,a.kt)("strong",{parentName:"p"},"sudo"),' is the abbreviation of the term "super user do". As the name suggests, it is the privilege that a super user, such as an administrator has to do whatever it wants in the system. A super user can be an administrator, like the ',(0,a.kt)("strong",{parentName:"p"},"root")," or what we described here as a user in the group ",(0,a.kt)("strong",{parentName:"p"},"sudo")," aka ",(0,a.kt)("strong",{parentName:"p"},"sudoer"),".")),(0,a.kt)("p",null,"If you are logged in with a username, that'd be:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"/home//.lightning/config.toml\n")),(0,a.kt)("p",null,"For our example for user ",(0,a.kt)("inlineCode",{parentName:"p"},"lgtn")," that is:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"/home/lgtn/.lightning/config.toml\n")),(0,a.kt)("p",null,"If you log in with another user, let's say ",(0,a.kt)("inlineCode",{parentName:"p"},"fleek")," it'd be:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"/home/fleek/.lightning/config.toml\n")),(0,a.kt)("p",null,"At any time, you can check which user you are logged in with by running the command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"whoami\n")),(0,a.kt)("p",null,"Here's an example of our user ",(0,a.kt)("inlineCode",{parentName:"p"},"lgtn"),", which for the command above outputs:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"To switch to a particular user, you can run the command ",(0,a.kt)("inlineCode",{parentName:"p"},"su ")," e.g. for the user ",(0,a.kt)("strong",{parentName:"p"},"lgtn")," we would execute the command ",(0,a.kt)("inlineCode",{parentName:"p"},"su lgtn"),".")),(0,a.kt)("p",null,"Now that you know where to locate the configuration file for any given user you are logged in with, learn about the ",(0,a.kt)("a",{parentName:"p",href:"#configuration-sections"},"Configuration sections"),"."),(0,a.kt)("h3",{id:"configuration-sections"},"Configuration sections"),(0,a.kt)("p",null,"The Fleek Network node configuration settings are located in the path ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/config.toml"),", and it's organized by configuration sections."),(0,a.kt)("p",null,"At the time of writing, we have a TOML file with sections. Here are some examples amongst others:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"application"),(0,a.kt)("li",{parentName:"ul"},"origin-ipfs"),(0,a.kt)("li",{parentName:"ul"},"rpc"),(0,a.kt)("li",{parentName:"ul"},"signer")),(0,a.kt)("p",null,"Each of the sections holds several property names and values. If you are accustomed to the ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/JSON"},"JSON")," or ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/YAML"},"YAML")," formats, you'll find the TOML format a bit similar (if you'd like to learn more about the TOML file format, read about it ",(0,a.kt)("a",{parentName:"p",href:"https://toml.io/en/"},"here"),")."),(0,a.kt)("p",null,"By default, and at time of writing the Lightning CLI configuration file (config.toml) is similar to:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'[BLANK]\n\n[application]\ndb_path = "/home/lgtn/.lightning/data/app_db"\nmode = "Prod"\nstorage = "RocksDb"\ntestnet = true\n\n[blockserver]\naddress = "0.0.0.0:4211"\n\n[broadcast]\naddress = "0.0.0.0:4200"\n\n[consensus]\nstore_path = "/home/lgtn/.lightning/data/narwhal_store"\n\n[dht]\naddress = "0.0.0.0:8101"\nbootstrappers = []\n\n[fetcher]\n\n[fsstore]\nroot = "/home/lgtn/.lightning/blockstore"\n\n[[handshake.transport]]\nsignal_address = "0.0.0.0:4210"\ntype = "WebRTC"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[handshake.worker]]\ntype = "AsyncWorker"\n\n[[origin-ipfs.gateways]]\nauthority = "ipfs.io"\nprotocol = "Https"\n\n[[origin-ipfs.gateways]]\nauthority = "fleek.ipfs.io"\nprotocol = "Https"\n\n[[origin-ipfs.gateways]]\nauthority = "ipfs.runfission.com"\nprotocol = "Https"\n\n[rep-collector]\nreporter_buffer_size = 5\n\n[resolver]\nstore_path = "/home/lgtn/.lightning/data/resolver_store"\n\n[rpc]\naddr = "0.0.0.0"\nport = 4230\n\n[service-executor]\nservices = [0, 1]\n\n[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n\n[topology]\ntesting_min_nodes = 9\ntesting_target_k = 8\n')),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Beware that the configuration file might look a bit different depending on the version you're running and the current development features in place by the Fleek Network core team. You shouldn't copy the example above and replace with yours, as this only servers for illustrative purposes.")),(0,a.kt)("p",null,"Some advanced use cases might require dealing with the host and port number binding, depending on the service provider's needs and customization. We'll keep things simple and assume the default settings."),(0,a.kt)("p",null,"In this guide, we are interested in the ",(0,a.kt)("inlineCode",{parentName:"p"},"[signer]")," section settings for the ",(0,a.kt)("inlineCode",{parentName:"p"},"consensus_key_path")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"node_key_path")," which by default is set to ",(0,a.kt)("inlineCode",{parentName:"p"},"~/.lightning/keystore"),"."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The identity is a text description for the Keystore and at the time of writing we have not yet implemented multiple identity management via the CLI. Thereupon, the identity value serves to find the filename match in the ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore_path"),". This might change as we progress with development. Check the ",(0,a.kt)("a",{parentName:"p",href:"#identity-selection"},"Identity selection")," to learn more about it!")),(0,a.kt)("h3",{id:"type-of-keys"},"Type of keys"),(0,a.kt)("p",null,"There are three types of keys related to the identity of a node and the account ownership. The keys are based in public-key cryptography, or asymmetric cryptography where each key pair consists of a public key and a corresponding private key. The keys are described in the section ",(0,a.kt)("a",{parentName:"p",href:"/docs/learn/the-network/#identity-on-the-fleek-network"},"identity on the Fleek Network")," as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"A Node key (ConsensusPublicKey) is ",(0,a.kt)("a",{parentName:"p",href:"https://electriccoin.co/blog/new-snark-curve/"},"BLS12-381")," which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"A Node Networking key (NodePublicKey) is ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/EdDSA"},"Ed25519")," used for the speed and performance of the network communications")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Account Owner keys are based on ",(0,a.kt)("a",{parentName:"p",href:"https://www.secg.org/sec2-v2.pdf"},"secp256k1"),", which corresponds to an Ethereum Address"))),(0,a.kt)("p",null,"For instance, a public key is open to anybody to see, and it represents a unique node identifier in the Fleek Network, a bit like a passport number. On the other hand, the private key is secret, and the operator is responsible to store it privately."),(0,a.kt)("p",null,"The Fleek Network relies on cryptography, thus the Fleek Network team and anybody can access, compromise or manipulate the secrets of an identity. On the other hand, the public key can be used by anyone, Fleek Network included, to identify a node or send rewards to the address without jeopardizing identity security."),(0,a.kt)("p",null,"To learn more about the identities on the Fleek Network ",(0,a.kt)("a",{parentName:"p",href:"/docs/learn/the-network/#identity-on-the-fleek-network"},"here"),"."),(0,a.kt)("h3",{id:"key-privacy"},"Key privacy"),(0,a.kt)("p",null,"If you don\u2019t keep your private keys secret, you'll have your node compromised."),(0,a.kt)("p",null,"Here are a few examples of what you should not do:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Share the ",(0,a.kt)("inlineCode",{parentName:"li"},"$HOME/.lightning/keystore")," directory file content publicly"),(0,a.kt)("li",{parentName:"ul"},"Track the ",(0,a.kt)("inlineCode",{parentName:"li"},"$HOME/.lightning/keystore")," directory files in a version control repository e.g. git"),(0,a.kt)("li",{parentName:"ul"},'Have poor "rights" permissions in UNIX systems e.g. everyone can read, delete, modify ',(0,a.kt)("inlineCode",{parentName:"li"},"$HOME/.lightning")),(0,a.kt)("li",{parentName:"ul"},"Allow anyone to access the node provider physically without any access control to the operating and file systems e.g. a VPS provider"),(0,a.kt)("li",{parentName:"ul"},"Get rid of a hard drive unformatted or blind erased by selling to somebody or dumping in the bin, which contains ",(0,a.kt)("inlineCode",{parentName:"li"},"$HOME/.lightning/keystore"))),(0,a.kt)("p",null,"There are many other ways of getting compromised, but hopefully, the ones put above give you a good starter into the subject."),(0,a.kt)("p",null,"Remember, the node provider is the only one responsible when managing the key store. Neither Fleek Network nor the most sophisticated AI system presently can compromise the cryptography in use to help you out. You are fully responsible for securing and retaining your private keys."),(0,a.kt)("h3",{id:"identity-selection"},"Identity selection"),(0,a.kt)("p",null,"Multiple identity management is yet to be implemented but in any case, some users might find it trivial to keep multiple identities and switch between them referencing them by name. The following section is not advocating this approach but sharing some approaches that can help certain use-cases."),(0,a.kt)("p",null,"Let's suppose that we've recently moved to a new server setup and copied our previous server keystore keys as ",(0,a.kt)("inlineCode",{parentName:"p"},"consensus.pem")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"node.pem")," and renamed the ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore/*.pem")," to ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore/new-*.pem"),"."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"We are using a wildcard ",(0,a.kt)("inlineCode",{parentName:"p"},"*")," to reduce verbosity. The wildcard means as replacement for all the filenames encountered in the path and extension without having to name them individually as we know they are ",(0,a.kt)("inlineCode",{parentName:"p"},"consensus.pem")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"node.pem"),".")),(0,a.kt)("p",null,"To illustrate this scenario, here's an example of how our ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore")," directory could look like:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},".\n\u251c\u2500\u2500 new-consensus.pem\n\u251c\u2500\u2500 new-node.pem\n\u2514\u2500\u2500 old-consensus.pem\n\u2514\u2500\u2500 old-node.pem\n\n0 directories, 4 file\n")),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"old-*.pem")," files are the original key store and ",(0,a.kt)("inlineCode",{parentName:"p"},"new-*.pem")," could correspond to the new identity created while setting up the node in the new server."),(0,a.kt)("p",null,"Since we have ",(0,a.kt)("inlineCode",{parentName:"p"},"[signer]")," set to the default values, in particular:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n')),(0,a.kt)("p",null,"We'd be required to change and switch to the preferred keys. The identity is switch to the provided values once the node is restarted. Thus, we can switch to any identity by changing the ",(0,a.kt)("inlineCode",{parentName:"p"},"[signer]")," ",(0,a.kt)("inlineCode",{parentName:"p"},"consensus_key_path")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"node_key_path")," pathname values anytime as long we restart the server successfully."),(0,a.kt)("p",null,"To verify which keys are loaded by the Lightning CLI run the command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn keys show\n")),(0,a.kt)("p",null,"You'd find the public keys in the output, which can be used for comparision and should be different everytime the configuration changes and reloaded. Here's an example of the output:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"Node Public Key: RwPpr35H5AAfWwSDFxwYuJv5TA8PWUd2pdBg+UKsORc=\nConsensus Public Key: s36g09qQzaaOJxi0UZDRCXj3HUUWjaGiYrQV6Ylo9Ih6jMvrnxM5s1OpBnsEj5R1AVYcuxlnVR+oyEjgJ3WpI5LOHSN1Q6Zur33vka3IachBEIKIbsiXMJW16vu4n4bG\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The PEM files can be named as you wish, but by default we like to keep it sound to avoid confusion and make it as clear as possible.")),(0,a.kt)("h2",{id:"backing-up-the-keystore"},"Backing up the keystore"),(0,a.kt)("p",null,"When dealing with Fleek Network it's crucial to always be aware of the identity. You should backup private keys in case the unexpected happens, as it's impossible to recover the identity in any other way, including the core team, any other person or system."),(0,a.kt)("p",null,"Backing up your keystore pem files are crucial to ensure the safety and accessibility of your identity on the Fleek Network. For example, if your ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning")," is deleted you'll still be able to restore it if you have backed it up properly."),(0,a.kt)("p",null,"There are many ways to make identity backups, each with its own benefits and drawbacks. At risk of oversimplifying, we'll focus on a simple manual approach to expose some principles you should have awareness."),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"The security is never stronger than its weakest link, and it is very likely that the weakest link is not the method itself. It's pointless to encrypt the backup archive with sophisticated methods when the passphrase is weak or of an easy guess.")),(0,a.kt)("p",null,"None of the methods described here are being endorsed by the Fleek Network team use the knowledge provided here for educational purposes only and at your own risk."),(0,a.kt)("h3",{id:"lower-security"},"Lower security"),(0,a.kt)("p",null,"If you opt for the lowest level of security, you can use zip and unzip. The man page of zip described the encryption algorithm used to be weaker than PGP."),(0,a.kt)("p",null,"To zip and encrypto the ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore")," directory run:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"# It'll prompt for password (remember)\nzip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore\n")),(0,a.kt)("p",null,"To unzip and decrypt the ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore.zip.enc"),", you'd run:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"# It'll prompt for password (recall)\nunzip keystore.zip.enc -d $HOME/.lightning/keystore\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"We provide the unzip destiny target to the flag ",(0,a.kt)("inlineCode",{parentName:"p"},"-d"),". The unzip process outputs the files onto the desired location ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/keystore"),", thus overriding any contents. If you have any files in the destiny target directory it'll be overriden, effectively replacing with the output of the unzipped directory content, so make sure you backup any files as required.")),(0,a.kt)("h3",{id:"higher-security"},"Higher security"),(0,a.kt)("p",null,"Create a ",(0,a.kt)("inlineCode",{parentName:"p"},"Tar")," archive, which will contain the target directory, files and the Tar stores all of the relative paths in the tarball itself."),(0,a.kt)("p",null,"Create a ",(0,a.kt)("inlineCode",{parentName:"p"},"tarbar")," by executing:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'tar -cf "keystore.tar" $HOME/.lightning/keystore\n')),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore.tar")," should be in the current work directory."),(0,a.kt)("p",null,"Use ",(0,a.kt)("inlineCode",{parentName:"p"},"gpg")," with the ",(0,a.kt)("a",{parentName:"p",href:"https://www.gnupg.org/gph/en/manual/x110.html"},"symmetric option"),", it creates the keys for that file and request a password to protect them. If you are familiar with asymmetric ",(0,a.kt)("inlineCode",{parentName:"p"},"gpg"),", it's similar, but it's not signed with your public key or such."),(0,a.kt)("p",null,"The encryption command is:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar\n")),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore.tar.asc")," should be in the current work directory."),(0,a.kt)("p",null,"To decrypt the ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore.tar.asc")," file, enter:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc\n")),(0,a.kt)("p",null,"To extract the ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore.tar")," is simple, but be aware that it unarchives with the original directory structure, which might be a bit confusing. So, we'll create a new temporary directory for our example that will use to extract to."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"mkdir $HOME/tar_keystore_extract\n")),(0,a.kt)("p",null,"Now, run the command to extract to the target directory, as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"tar -xf keystore.tar -C $HOME/tar_keystore_extract\n")),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"/home//.lightning/keystore")," should be in the ",(0,a.kt)("inlineCode",{parentName:"p"},"tar_keystore_extract")," directory where you'll find the PEM files."),(0,a.kt)("h3",{id:"storage"},"Storage"),(0,a.kt)("p",null,"The backup archive should only be accessible by yourself. If you decided to store it in a cloud storage provider, be aware of increased security risks. Cloud storage is convenient, but it ultimately puts data into the hands of others. If you're not particularly concerned, or have confidence about the encryption of the files, then that's at your own risk. But it's recommended to store in a physical hard drive that remains disconnected from computers and network devices."),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"If you use cloud storage to store your sensitive data, encryption should be your first line of defense. Encrypting files before uploading them to the cloud is crucial to reduce others from accessing information without your permissions and knowledge.")),(0,a.kt)("p",null,"Remember that the security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only."),(0,a.kt)("h2",{id:"loading-keys-on-runtime"},"Loading keys on runtime"),(0,a.kt)("p",null,"As described in the section ",(0,a.kt)("a",{parentName:"p",href:"#configuration-file"},"configuration files")," the default location of the ",(0,a.kt)("inlineCode",{parentName:"p"},".lightning")," system configuration directory is ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning"),"."),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/config.toml")," holds the information of where the Lightning CLI node process should pull the keystore pem files. The location of the pem files can be placed anywhere the node process has permissions to read."),(0,a.kt)("p",null,"When unarchiving the backup files, the keystore directory or pem files should be placed in the directory declared in the ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/config.toml"),". That is if the location is the one specified on the runtime\u2013the command declared to launch and run the lightning service, that has the optional ",(0,a.kt)("inlineCode",{parentName:"p"},"-c")," configuration flag that takes any custom location which overrides the default ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/config.toml"),"."),(0,a.kt)("admonition",{type:"caution"},(0,a.kt)("p",{parentName:"admonition"},"On runtime, the Lightning service can have specified a configuration file in any readable location. If a configuration pathname isn't passed, it'll default to the ",(0,a.kt)("inlineCode",{parentName:"p"},"$HOME/.lightning/config.toml"),". It's important to understand this to avoid confusion."),(0,a.kt)("p",{parentName:"admonition"},"The service that starts with:"),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn -c /root/custom-configuration.toml run\n")),(0,a.kt)("p",{parentName:"admonition"},"Can have complete different settings from any of the following:"),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn -c /home/lgtn/.lightning/config.toml run\n")),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn -c ~/.lightning/config.toml run\n")),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn run\n")),(0,a.kt)("p",{parentName:"admonition"},"Due to the fact that any of the fails above might contain different settings declared in the file body.")),(0,a.kt)("p",null,"For instance, we can imagine a scenario where our service is started with the command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn -c /home/lgtn/.lightning/config.toml run\n")),(0,a.kt)("p",null,"Where the ",(0,a.kt)("inlineCode",{parentName:"p"},"keystore")," is placed under the parent directory ",(0,a.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/"),". Resulting in the configuration file have the following settings for the hypothetical username ",(0,a.kt)("inlineCode",{parentName:"p"},"lgtn"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'[signer]\nconsensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"\nnode_key_path = "/home/lgtn/.lightning/keystore/node.pem"\n')),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"On the ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/install"},"install instructions")," provided by the documentation, a ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/install#systemd-service-setup"},"Systemd service unit")," is recommended to allow the user control the Lightning service via systemctl. The Systemd service unit file should contain the recommended usage of ",(0,a.kt)("inlineCode",{parentName:"p"},"-c")," configuration. If you have followed the recommendations it should be familiar.")),(0,a.kt)("h2",{id:"restoring-the-keystore"},"Restoring the keystore"),(0,a.kt)(r.ZP,{mdxType:"RestoreKeystore"}),(0,a.kt)("h2",{id:"conclusion"},"Conclusion"),(0,a.kt)("p",null,"We've walked through most basics of where the configuration file is located, the configuration settings we use to set up and run the node, the different configuration sections we have, and most importantly the identity section."),(0,a.kt)("p",null,"Additionally, a brief guide on the ",(0,a.kt)("a",{parentName:"p",href:"#identity"},"identity"),", more specifically an introduction to the ",(0,a.kt)("a",{parentName:"p",href:"#type-of-keys"},"type of keys")," and ",(0,a.kt)("a",{parentName:"p",href:"#key-privacy"},"key privacy"),", which we find important to understand for anyone seriously interested in running a node by hinting into some system administration and security principles."),(0,a.kt)("p",null,"Separately, at risk of oversimpliying provided a brief introduction into the backup of the keystore directory."),(0,a.kt)("p",null,"In the future, we'll introduce more advanced topics that will help you improve the knowledge you get from this, but we are glad that you followed this guide and got some comprehension to help you manage the key store."),(0,a.kt)("p",null,"While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our ",(0,a.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"Discord")," or by opening a ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fleek-network"},"PR")," in any of our repositories."),(0,a.kt)("p",null,"Discover more about the project by ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"watching/contributing on Github"),", following us on ",(0,a.kt)("a",{parentName:"p",href:"https://twitter.com/fleek_net"},"Twitter"),", and joining ",(0,a.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"our community Discord")," for all the best updates!"),(0,a.kt)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}m.isMDXComponent=!0},8275:(e,t,n)=>{n.d(t,{ZP:()=>s});var i=n(7462),a=(n(7294),n(3905));const o={toc:[]},r="wrapper";function s(e){let{components:t,...n}=e;return(0,a.kt)(r,(0,i.Z)({},o,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"You can restore the keystore (Public Keys) by copying the directory to the ",(0,a.kt)("inlineCode",{parentName:"p"},"~/.lightning")," directory."),(0,a.kt)("p",null,"Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:"),(0,a.kt)("p",null,"1) The keystore and files are located under the hypothetical location ",(0,a.kt)("inlineCode",{parentName:"p"},"/my-keystore-backup")),(0,a.kt)("p",null,"2) The files in the ",(0,a.kt)("inlineCode",{parentName:"p"},"/my-keystore-backup")," are the following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"/my-keystore-backup\n\u251c\u2500\u2500 consensus.pem\n\u2514\u2500\u2500 node.pem\n\n1 directory, 2 files\n")),(0,a.kt)("p",null,"Considering the above for our example, you would have to run the following command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},"mv /my-keystore-backup /home//.lightning/keystore\n")),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Remember to replace the ",(0,a.kt)("inlineCode",{parentName:"p"},"")," with the correct username for the setup. For example, if you have installed the Fleek Network with the username ",(0,a.kt)("inlineCode",{parentName:"p"},"lgtn")," that would be ",(0,a.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/keystore"),".")),(0,a.kt)("p",null,"Once moved, remember to start the service, you can learn how to manage the service by reading the section ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"Systemd Service"),"."))}s.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>a});var i=n(7294);const a=e=>{let{image:t,name:n,title:a,url:o,communityMember:r=!1}=e;return i.createElement("section",{className:"author_card"},i.createElement("div",null,i.createElement("span",{className:"avatar"},i.createElement("a",{href:o,target:"_blank",alt:n},i.createElement("img",{src:t,alt:n}))),i.createElement("div",null,i.createElement("span",{className:"name"},i.createElement("a",{href:o,target:"_blank",alt:n},n)),i.createElement("span",{className:"title"},a),i.createElement("span",{className:"discord"},r?"Join our community on":"Got questions? Find us on"," ",i.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},4350:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/managing-the-keystore-fe4cdb19d2f59c54bcf864b0e069b535.png"}}]); \ No newline at end of file diff --git a/assets/js/54436d06.aef64e50.js b/assets/js/54436d06.4d56aa06.js similarity index 95% rename from assets/js/54436d06.aef64e50.js rename to assets/js/54436d06.4d56aa06.js index 896b30a96..9ede672db 100644 --- a/assets/js/54436d06.aef64e50.js +++ b/assets/js/54436d06.4d56aa06.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4872],{4094:e=>{e.exports=JSON.parse('{"label":"cli","permalink":"/docs/tags/cli","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4872],{4094:e=>{e.exports=JSON.parse('{"label":"cli","permalink":"/docs/tags/cli","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/5559e604.2c5aa46d.js b/assets/js/5559e604.11d96201.js similarity index 88% rename from assets/js/5559e604.2c5aa46d.js rename to assets/js/5559e604.11d96201.js index 2269c8838..31733e042 100644 --- a/assets/js/5559e604.2c5aa46d.js +++ b/assets/js/5559e604.11d96201.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2501],{811:e=>{e.exports=JSON.parse('{"label":"systemd","permalink":"/docs/tags/systemd","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2501],{811:e=>{e.exports=JSON.parse('{"label":"systemd","permalink":"/docs/tags/systemd","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/564044f9.91e85ef3.js b/assets/js/564044f9.b5bab01d.js similarity index 92% rename from assets/js/564044f9.91e85ef3.js rename to assets/js/564044f9.b5bab01d.js index ede8ab825..c1c2fd3de 100644 --- a/assets/js/564044f9.91e85ef3.js +++ b/assets/js/564044f9.b5bab01d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1771],{4283:e=>{e.exports=JSON.parse('{"label":"public keys","permalink":"/guides/tags/public-keys","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1771],{4283:e=>{e.exports=JSON.parse('{"label":"public keys","permalink":"/guides/tags/public-keys","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/581d5240.4f96a3e4.js b/assets/js/581d5240.4f96a3e4.js new file mode 100644 index 000000000..b5b063436 --- /dev/null +++ b/assets/js/581d5240.4f96a3e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5318],{4798:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>h});var s=t(5893),a=t(1151),c=t(3872);const i={title:"Health check",slug:"health-check",hide_title:!0,tags:["healthcheck","verification","node status"]},l=void 0,o={id:"node/health-check",title:"Health check",description:"TL;DR: Run the command",source:"@site/docs/node/health-check.md",sourceDirName:"node",slug:"/node/health-check",permalink:"/docs/node/health-check",draft:!1,unlisted:!1,tags:[{label:"healthcheck",permalink:"/docs/tags/healthcheck"},{label:"verification",permalink:"/docs/tags/verification"},{label:"node status",permalink:"/docs/tags/node-status"}],version:"current",frontMatter:{title:"Health check",slug:"health-check",hide_title:!0,tags:["healthcheck","verification","node status"]},sidebar:"docs",previous:{title:"Install",permalink:"/docs/node/install"},next:{title:"Analyzing logs",permalink:"/docs/node/analyzing-logs"}},r={},h=[{value:"TL;DR: Run the command",id:"tldr-run-the-command",level:2},{value:"Overview",id:"overview",level:2},{value:"Quick health check",id:"quick-health-check",level:2},{value:"JSON-RPC Health check",id:"json-rpc-health-check",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"tldr-run-the-command",children:"TL;DR: Run the command"}),"\n",(0,s.jsx)(n.p,{children:"A script is available to do and provide a health check overview:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"curl -sS https://get.fleek.network/healthcheck | bash\n"})}),"\n",(0,s.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,s.jsx)(n.p,{children:"In network applications, a health check is a process of verifying the overall health and availability of a service. It usually involves sending a request to a specific endpoint of a service and receiving a response indicating the status. The response includes information about the status of the service, or any errors or warnings if not healthy. This helps developers, node operators, and system administrators identify and resolve issues that may affect the network, node performance and availability."}),"\n",(0,s.jsx)(n.p,{children:"A Node operator or system administrator can communicate with the node to confirm the status at any time."}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsx)(n.p,{children:"We're using cURL, for the examples, thus make sure that you have it installed on your operating system."})}),"\n",(0,s.jsx)(n.h2,{id:"quick-health-check",children:"Quick health check"}),"\n",(0,s.jsxs)(n.p,{children:["Run a quick health check by sending a GET request to ",(0,s.jsx)(n.code,{children:"/health"})," endpoint of RPC on ",(0,s.jsx)(n.a,{href:"/docs/node/requirements#ports",children:"port"})," 4230."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'curl -w "\\n" localhost:4230/health\n'})}),"\n",(0,s.jsxs)(n.p,{children:["If successful, you should get the response ",(0,s.jsx)(n.code,{children:"running and staked"}),", as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"running and staked\n"})}),"\n",(0,s.jsx)(n.p,{children:"If you get an error, then it means that your node is not healthy."}),"\n",(0,s.jsx)(n.h2,{id:"json-rpc-health-check",children:"JSON-RPC Health check"}),"\n",(0,s.jsxs)(n.p,{children:["We'll send a request to the JSON RPC ",(0,s.jsx)(n.code,{children:"flk_ping"})," method. Execute the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'curl -X POST -H "Content-Type: application/json" -d \'{\n "jsonrpc": "2.0",\n "method": "flk_ping",\n "params": [],\n "id": 1\n }\' localhost:4230/rpc/v0\n'})}),"\n",(0,s.jsxs)(n.p,{children:["If the request is successful, you should get the result ",(0,s.jsx)(n.code,{children:"pong"})," as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:'{\n "jsonrpc": "2.0",\n "result": "pong",\n "id": 1\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"Any other response, such as errors determine that the node is not healthy."}),"\n",(0,s.jsx)(c.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>a});t(7294);var s=t(5893);const a=e=>{let{image:n,name:t,title:a,url:c,communityMember:i=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:c,target:"_blank",alt:t,children:(0,s.jsx)("img",{src:n,alt:t})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:c,target:"_blank",alt:t,children:t})}),(0,s.jsx)("span",{className:"title",children:a}),(0,s.jsxs)("span",{className:"discord",children:[i?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>l,a:()=>i});var s=t(7294);const a={},c=s.createContext(a);function i(e){const n=s.useContext(c);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/581d5240.87a21bde.js b/assets/js/581d5240.87a21bde.js deleted file mode 100644 index e0fb2d317..000000000 --- a/assets/js/581d5240.87a21bde.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5318],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),s=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},h=function(e){var t=s(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,i=e.parentName,h=c(e,["components","mdxType","originalType","parentName"]),u=s(n),d=r,m=u["".concat(i,".").concat(d)]||u[d]||p[d]||l;return n?a.createElement(m,o(o({ref:t},h),{},{components:n})):a.createElement(m,o({ref:t},h))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=d;var c={};for(var i in t)hasOwnProperty.call(t,i)&&(c[i]=t[i]);c.originalType=e,c[u]="string"==typeof e?e:r,o[1]=c;for(var s=2;s{n.d(t,{Z:()=>r});var a=n(7294);const r=e=>{let{image:t,name:n,title:r,url:l,communityMember:o=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:l,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:l,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},r),a.createElement("span",{className:"discord"},o?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},3941:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>h});var a=n(7462),r=(n(7294),n(3905)),l=n(3872);const o={title:"Health check",slug:"health-check",hide_title:!0,tags:["healthcheck","verification","node status"]},c=void 0,i={unversionedId:"node/health-check",id:"node/health-check",title:"Health check",description:"TL;DR: Run the command",source:"@site/docs/node/health-check.md",sourceDirName:"node",slug:"/node/health-check",permalink:"/docs/node/health-check",draft:!1,tags:[{label:"healthcheck",permalink:"/docs/tags/healthcheck"},{label:"verification",permalink:"/docs/tags/verification"},{label:"node status",permalink:"/docs/tags/node-status"}],version:"current",frontMatter:{title:"Health check",slug:"health-check",hide_title:!0,tags:["healthcheck","verification","node status"]},sidebar:"docs",previous:{title:"Install",permalink:"/docs/node/install"},next:{title:"Analyzing logs",permalink:"/docs/node/analyzing-logs"}},s={},h=[{value:"TL;DR: Run the command",id:"tldr-run-the-command",level:2},{value:"Overview",id:"overview",level:2},{value:"Quick health check",id:"quick-health-check",level:2},{value:"JSON-RPC Health check",id:"json-rpc-health-check",level:2}],u={toc:h},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"tldr-run-the-command"},"TL;DR: Run the command"),(0,r.kt)("p",null,"A script is available to do and provide a health check overview:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl -sS https://get.fleek.network/healthcheck | bash\n")),(0,r.kt)("h2",{id:"overview"},"Overview"),(0,r.kt)("p",null,"In network applications, a health check is a process of verifying the overall health and availability of a service. It usually involves sending a request to a specific endpoint of a service and receiving a response indicating the status. The response includes information about the status of the service, or any errors or warnings if not healthy. This helps developers, node operators, and system administrators identify and resolve issues that may affect the network, node performance and availability."),(0,r.kt)("p",null,"A Node operator or system administrator can communicate with the node to confirm the status at any time."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"We're using cURL, for the examples, thus make sure that you have it installed on your operating system.")),(0,r.kt)("h2",{id:"quick-health-check"},"Quick health check"),(0,r.kt)("p",null,"Run a quick health check by sending a GET request to ",(0,r.kt)("inlineCode",{parentName:"p"},"/health")," endpoint of RPC on ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/requirements#ports"},"port")," 4230."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'curl -w "\\n" localhost:4230/health\n')),(0,r.kt)("p",null,"If successful, you should get the response ",(0,r.kt)("inlineCode",{parentName:"p"},"running and staked"),", as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"running and staked\n")),(0,r.kt)("p",null,"If you get an error, then it means that your node is not healthy."),(0,r.kt)("h2",{id:"json-rpc-health-check"},"JSON-RPC Health check"),(0,r.kt)("p",null,"We'll send a request to the JSON RPC ",(0,r.kt)("inlineCode",{parentName:"p"},"flk_ping")," method. Execute the following command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'curl -X POST -H "Content-Type: application/json" -d \'{\n "jsonrpc": "2.0",\n "method": "flk_ping",\n "params": [],\n "id": 1\n }\' localhost:4230/rpc/v0\n')),(0,r.kt)("p",null,"If the request is successful, you should get the result ",(0,r.kt)("inlineCode",{parentName:"p"},"pong")," as follows:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'{\n "jsonrpc": "2.0",\n "result": "pong",\n "id": 1\n}\n')),(0,r.kt)("p",null,"Any other response, such as errors determine that the node is not healthy."),(0,r.kt)(l.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5a9491fe.195d2f1b.js b/assets/js/5a9491fe.79d386e5.js similarity index 93% rename from assets/js/5a9491fe.195d2f1b.js rename to assets/js/5a9491fe.79d386e5.js index 6d15e5d91..52871eba9 100644 --- a/assets/js/5a9491fe.195d2f1b.js +++ b/assets/js/5a9491fe.79d386e5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6476],{5751:e=>{e.exports=JSON.parse('{"label":"keystore","permalink":"/guides/tags/keystore","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6476],{5751:e=>{e.exports=JSON.parse('{"label":"keystore","permalink":"/guides/tags/keystore","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/5b6134d1.4caed6d0.js b/assets/js/5b6134d1.4caed6d0.js new file mode 100644 index 000000000..1cbb1638e --- /dev/null +++ b/assets/js/5b6134d1.4caed6d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9752],{1586:(e,n,s)=>{s.d(n,{ZP:()=>o});var t=s(5893),i=s(1151);function r(e){const n={a:"a",admonition:"admonition",code:"code",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["In the ",(0,t.jsx)(n.code,{children:"/home//.lightning/config.toml"})," you'll find some and more of the following:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,t.jsx)(n.strong,{children:"configuration.toml"}),". We keep it short to make it easier to follow, do not copy and paste."]})}),"\n",(0,t.jsxs)(n.p,{children:["Find and replace all instances of ~ in the config file ",(0,t.jsx)(n.code,{children:"/home//.lightning/config.toml"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Here's an example of how to do it using ",(0,t.jsx)(n.strong,{children:"sed"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n'})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Replace the ",(0,t.jsx)(n.code,{children:""})," with your username. For example, if you have followed the recommendation to ",(0,t.jsx)(n.a,{href:"/docs/node/install#create-a-user",children:"create a user"})," it would look like ",(0,t.jsx)(n.code,{children:"/home/lgtn/.lightning/config.toml"})," for the username ",(0,t.jsx)(n.strong,{children:"lgtn"}),"."]})}),"\n",(0,t.jsxs)(n.p,{children:["For example, if your username is ",(0,t.jsx)(n.code,{children:"lgtn"})," that'd look like this:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Once modified, you can run a ",(0,t.jsx)(n.code,{children:"cat"})," to see the content of the files to confirm it has been updated."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"cat /home/lgtn/.lightning/config.toml\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For our example where we opted in for the username ",(0,t.jsx)(n.code,{children:"lgtn"})," that would look like:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-toml",children:'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n'})}),"\n",(0,t.jsx)(n.admonition,{title:"Warning",type:"caution",children:(0,t.jsx)(n.p,{children:"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here."})})]})}function o(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(r,{...e})}):r(e)}},2421:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>h,toc:()=>c});var t=s(5893),i=s(1151),r=s(3872),o=s(1586);const l={title:"File permissions and Ownership",slug:"file-permissions-and-ownership",hide_title:!0,tags:["ownership","file permissions","sudoer","root"]},a=void 0,h={id:"Lightning CLI/file-permissions-and-ownership",title:"File permissions and Ownership",description:"Ownership",source:"@site/references/Lightning CLI/file-permissions-and-ownership.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/file-permissions-and-ownership",permalink:"/references/Lightning CLI/file-permissions-and-ownership",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/file-permissions-and-ownership.md",tags:[{label:"ownership",permalink:"/references/tags/ownership"},{label:"file permissions",permalink:"/references/tags/file-permissions"},{label:"sudoer",permalink:"/references/tags/sudoer"},{label:"root",permalink:"/references/tags/root"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"File permissions and Ownership",slug:"file-permissions-and-ownership",hide_title:!0,tags:["ownership","file permissions","sudoer","root"]},sidebar:"defaultSidebar",previous:{title:"Error linking with cc",permalink:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},next:{title:"Frequently used commands for Native setup",permalink:"/references/Lightning CLI/frequently-used-commands-for-native-setup"}},d={},c=[{value:"Ownership",id:"ownership",level:2},{value:"Using sudo to delegate permissions",id:"using-sudo-to-delegate-permissions",level:2},{value:"User $HOME directory",id:"user-home-directory",level:2},{value:"Set the locations of the user paths",id:"set-the-locations-of-the-user-paths",level:2},{value:"Set the configuration flag -c on the service unit file",id:"set-the-configuration-flag--c-on-the-service-unit-file",level:2}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"ownership",children:"Ownership"}),"\n",(0,t.jsx)(n.p,{children:"The user who installs the Fleek Network Lightning CLI matters, as it can own or delegate ownership of the dependencies and applications being installed."}),"\n",(0,t.jsx)(n.p,{children:"For example, if you have followed the install document recommendations and have:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Created a user ",(0,t.jsx)(n.strong,{children:"lgtn"})]}),"\n",(0,t.jsxs)(n.li,{children:["Switched to the user ",(0,t.jsx)(n.strong,{children:"lgtn"})]}),"\n",(0,t.jsxs)(n.li,{children:["Executed the installation process as ",(0,t.jsx)(n.strong,{children:"lgtn"})]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsxs)(n.p,{children:["The username can be anything, we are using the term ",(0,t.jsx)(n.strong,{children:"lgtn"})," as the example provided throughout our documentation. Select your username in accordance to your preferences."]})}),"\n",(0,t.jsx)(n.p,{children:"You'll find that it owns the following directories under the user home (/home/lgtn):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"drwxr-x--- 6 lgtn lgtn 4096 Sep 12 10:27 .\ndrwxr-xr-x 3 root root 4096 Sep 11 12:28 ..\ndrwxrwxr-x 5 lgtn lgtn 4096 Sep 11 12:29 .cargo\ndrwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning\ndrwxrwxr-x 6 lgtn lgtn 4096 Sep 11 12:29 .rustup\ndrwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Above, we have the listing properties set as ",(0,t.jsx)(n.strong,{children:"drwxrwxr-x"})," and the ownership ",(0,t.jsxs)(n.strong,{children:["lgtn",":lgtn"]}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["On the other hand, if you have done the installation process as ",(0,t.jsx)(n.strong,{children:"root"})," superuser, you'll find that:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["The location of the directories and files goes under the ",(0,t.jsx)(n.code,{children:"/root"})," pathname"]}),"\n",(0,t.jsxs)(n.li,{children:["The ownership is set to ",(0,t.jsxs)(n.strong,{children:["root",":root"]})]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Learn more about ",(0,t.jsx)(n.a,{href:"https://www.linuxfoundation.org/blog/blog/classic-sysadmin-understanding-linux-file-permissions",children:"file permissions"})," from the ",(0,t.jsx)(n.a,{href:"https://www.linuxfoundation.org/",children:"Linux Foundation"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["To learn more about file permission on Linux, read the ",(0,t.jsx)(n.a,{href:"https://www.linuxfoundation.org/blog/blog/classic-sysadmin-understanding-linux-file-permissions",children:"Understanding Linux File Permissions"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"using-sudo-to-delegate-permissions",children:"Using sudo to delegate permissions"}),"\n",(0,t.jsxs)(n.p,{children:["Consider file ownership and permissions to understand where the keystore is located. Take close attention when executing commands as an admin\u2013with or without ",(0,t.jsx)(n.strong,{children:"super user"})," (root) or ",(0,t.jsx)(n.strong,{children:"sudo"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["If a command is executed without ",(0,t.jsx)(n.strong,{children:"sudo"})," then the generated output goes onto the ",(0,t.jsx)(n.strong,{children:"user"})," home."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"lgtn keys generate\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Resulting in having the ",(0,t.jsx)(n.strong,{children:"keystore"})," saved onto ",(0,t.jsx)(n.code,{children:"/home/username/.lightning/keystore"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["On the other hand, if a command is executed with ",(0,t.jsx)(n.strong,{children:"sudo"})," then the generated output is delegated to ",(0,t.jsx)(n.strong,{children:"root"})," directory."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo lgtn keys generate\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Resulting in having the ",(0,t.jsx)(n.strong,{children:"keystore"})," saved onto ",(0,t.jsx)(n.code,{children:"/root/.lightning/keystore"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"user-home-directory",children:"User $HOME directory"}),"\n",(0,t.jsxs)(n.p,{children:["The home directory is a directory that contains the personal files of a particular user of the system. On Linux, the ",(0,t.jsx)(n.code,{children:"$HOME"})," environment variable is set by the login program, which sets the user `$HOME`` accordingly. A user's home goes by the username, the user who's logged in."]}),"\n",(0,t.jsx)(n.p,{children:"For this reason, a user can change to the home directory by executing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"cd $HOME\n"})}),"\n",(0,t.jsxs)(n.p,{children:["A shorthand allows a user to refer to their home directory simply as ",(0,t.jsx)(n.code,{children:"~"})," (tilde), as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"cd ~\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["We can find that the HOME or ~ (tilde) is highly dependent on the user who's logged in. Since we know that the user might delegate to ",(0,t.jsx)(n.strong,{children:"root"})," by the usage of ",(0,t.jsx)(n.strong,{children:"sudo"}),", this can help troubleshoot and explain the location of our files e.g. the keystore. In the section ",(0,t.jsx)(n.a,{href:"#set-the-locations-of-the-user-paths",children:"Set the locations of the user paths"}),", we learn how to define the location of our user configuration paths to avoid confusion. By doing it we ensure that when running the service, the service picks the correct configuration paths for our user."]})}),"\n",(0,t.jsxs)(n.p,{children:["To learn more about the user $HOME directory read the wikipedia ",(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Home_directory",children:"Home directory"})," document."]}),"\n",(0,t.jsx)(n.h2,{id:"set-the-locations-of-the-user-paths",children:"Set the locations of the user paths"}),"\n",(0,t.jsx)(o.ZP,{}),"\n",(0,t.jsx)(n.h2,{id:"set-the-configuration-flag--c-on-the-service-unit-file",children:"Set the configuration flag -c on the service unit file"}),"\n",(0,t.jsxs)(n.p,{children:["The following section assumes that a System service unit has been declared, and you're using systemctl to control the service, as described in our ",(0,t.jsx)(n.a,{href:"/docs/node/install#systemd-service-setup",children:"Systemd Service Setup"})," install section."]}),"\n",(0,t.jsxs)(n.p,{children:["Open and edit the ",(0,t.jsx)(n.strong,{children:"/etc/systemd/system/lightning.service"})," file."]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Replace ",(0,t.jsx)(n.code,{children:""})," with YOUR username. For example, in the documentation we use the username ",(0,t.jsx)(n.strong,{children:"lgtn"}),", which means we'd replace ",(0,t.jsx)(n.code,{children:""})," with ",(0,t.jsx)(n.code,{children:"lgtn"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Make sure that the ExecStart is set correctly, including the ",(0,t.jsx)(n.code,{children:"-c"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home//.lightning/config.toml run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For our example, as the username ",(0,t.jsx)(n.strong,{children:"lgtn"})," it would look like:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,t.jsx)(n.p,{children:"When complete make sure the file is saved and the systemctl daemon is reloaded, as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Consequently, when a user manages the service via the systemctl, the Lightning CLI process will read the configuration file settings provided above. It includes the location of the user preferences, such as the keystore location amongst others, preventing confusion regardless of ",(0,t.jsx)(n.strong,{children:"root"})," delegation."]}),"\n",(0,t.jsx)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(g,{...e})}):g(e)}},3872:(e,n,s)=>{s.d(n,{Z:()=>i});s(7294);var t=s(5893);const i=e=>{let{image:n,name:s,title:i,url:r,communityMember:o=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:r,target:"_blank",alt:s,children:(0,t.jsx)("img",{src:n,alt:s})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:r,target:"_blank",alt:s,children:s})}),(0,t.jsx)("span",{className:"title",children:i}),(0,t.jsxs)("span",{className:"discord",children:[o?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,s)=>{s.d(n,{Z:()=>l,a:()=>o});var t=s(7294);const i={},r=t.createContext(i);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5b6134d1.a464da92.js b/assets/js/5b6134d1.a464da92.js deleted file mode 100644 index 35e987fe4..000000000 --- a/assets/js/5b6134d1.a464da92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9752],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},h=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},c=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),u=p(n),c=o,g=u["".concat(l,".").concat(c)]||u[c]||d[c]||a;return n?r.createElement(g,i(i({ref:t},h),{},{components:n})):r.createElement(g,i({ref:t},h))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=c;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var p=2;p{n.d(t,{ZP:()=>s});var r=n(7462),o=(n(7294),n(3905));const a={toc:[]},i="wrapper";function s(e){let{components:t,...n}=e;return(0,o.kt)(i,(0,r.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"In the ",(0,o.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml")," you'll find some and more of the following:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"The configuration properties and values presented above are a shorter version of what you'll find on your ",(0,o.kt)("strong",{parentName:"p"},"configuration.toml"),". We keep it short to make it easier to follow, do not copy and paste.")),(0,o.kt)("p",null,"Find and replace all instances of ~ in the config file ",(0,o.kt)("inlineCode",{parentName:"p"},"/home//.lightning/config.toml"),". "),(0,o.kt)("p",null,"Here's an example of how to do it using ",(0,o.kt)("strong",{parentName:"p"},"sed"),":"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home//.lightning|g" "/home//.lightning/config.toml"\n')),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Replace the ",(0,o.kt)("inlineCode",{parentName:"p"},"")," with your username. For example, if you have followed the recommendation to ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#create-a-user"},"create a user")," it would look like ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/lgtn/.lightning/config.toml")," for the username ",(0,o.kt)("strong",{parentName:"p"},"lgtn"),".")),(0,o.kt)("p",null,"For example, if your username is ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," that'd look like this:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},'sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"\n')),(0,o.kt)("p",null,"Once modified, you can run a ",(0,o.kt)("inlineCode",{parentName:"p"},"cat")," to see the content of the files to confirm it has been updated."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cat /home/lgtn/.lightning/config.toml\n")),(0,o.kt)("p",null,"For our example where we opted in for the username ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," that would look like:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-toml"},'[BLANK]\n\n[application]\ndb_path = "~/.lightning/data/app_db"\n\n[consensus]\nstore_path = "~/.lightning/data/narwhal_store"\n\n[fsstore]\nroot = "~/.lightning/blockstore"\n\n[resolver]\nstore_path = "~/.lightning/data/resolver_store"\n\n[signer]\nconsensus_key_path = "~/.lightning/keystore/consensus.pem"\nnode_key_path = "~/.lightning/keystore/node.pem"\n')),(0,o.kt)("admonition",{title:"Warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.")))}s.isMDXComponent=!0},5852:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>l,default:()=>g,frontMatter:()=>s,metadata:()=>p,toc:()=>u});var r=n(7462),o=(n(7294),n(3905)),a=n(3872),i=n(3242);const s={title:"File permissions and Ownership",slug:"file-permissions-and-ownership",hide_title:!0,tags:["ownership","file permissions","sudoer","root"]},l=void 0,p={unversionedId:"Lightning CLI/file-permissions-and-ownership",id:"Lightning CLI/file-permissions-and-ownership",title:"File permissions and Ownership",description:"Ownership",source:"@site/references/Lightning CLI/file-permissions-and-ownership.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/file-permissions-and-ownership",permalink:"/references/Lightning CLI/file-permissions-and-ownership",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/file-permissions-and-ownership.md",tags:[{label:"ownership",permalink:"/references/tags/ownership"},{label:"file permissions",permalink:"/references/tags/file-permissions"},{label:"sudoer",permalink:"/references/tags/sudoer"},{label:"root",permalink:"/references/tags/root"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"File permissions and Ownership",slug:"file-permissions-and-ownership",hide_title:!0,tags:["ownership","file permissions","sudoer","root"]},sidebar:"defaultSidebar",previous:{title:"Error linking with cc",permalink:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},next:{title:"Frequently used commands for Native setup",permalink:"/references/Lightning CLI/frequently-used-commands-for-native-setup"}},h={},u=[{value:"Ownership",id:"ownership",level:2},{value:"Using sudo to delegate permissions",id:"using-sudo-to-delegate-permissions",level:2},{value:"User $HOME directory",id:"user-home-directory",level:2},{value:"Set the locations of the user paths",id:"set-the-locations-of-the-user-paths",level:2},{value:"Set the configuration flag -c on the service unit file",id:"set-the-configuration-flag--c-on-the-service-unit-file",level:2}],d={toc:u},c="wrapper";function g(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"ownership"},"Ownership"),(0,o.kt)("p",null,"The user who installs the Fleek Network Lightning CLI matters, as it can own or delegate ownership of the dependencies and applications being installed."),(0,o.kt)("p",null,"For example, if you have followed the install document recommendations and have:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Created a user ",(0,o.kt)("strong",{parentName:"li"},"lgtn")),(0,o.kt)("li",{parentName:"ul"},"Switched to the user ",(0,o.kt)("strong",{parentName:"li"},"lgtn")),(0,o.kt)("li",{parentName:"ul"},"Executed the installation process as ",(0,o.kt)("strong",{parentName:"li"},"lgtn")," ")),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The username can be anything, we are using the term ",(0,o.kt)("strong",{parentName:"p"},"lgtn")," as the example provided throughout our documentation. Select your username in accordance to your preferences.")),(0,o.kt)("p",null,"You'll find that it owns the following directories under the user home (/home/lgtn):"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"drwxr-x--- 6 lgtn lgtn 4096 Sep 12 10:27 .\ndrwxr-xr-x 3 root root 4096 Sep 11 12:28 ..\ndrwxrwxr-x 5 lgtn lgtn 4096 Sep 11 12:29 .cargo\ndrwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning\ndrwxrwxr-x 6 lgtn lgtn 4096 Sep 11 12:29 .rustup\ndrwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network\n")),(0,o.kt)("p",null,"Above, we have the listing properties set as ",(0,o.kt)("strong",{parentName:"p"},"drwxrwxr-x")," and the ownership ",(0,o.kt)("strong",{parentName:"p"},"lgtn:lgtn"),"."),(0,o.kt)("p",null,"On the other hand, if you have done the installation process as ",(0,o.kt)("strong",{parentName:"p"},"root")," superuser, you'll find that:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The location of the directories and files goes under the ",(0,o.kt)("inlineCode",{parentName:"li"},"/root")," pathname"),(0,o.kt)("li",{parentName:"ul"},"The ownership is set to ",(0,o.kt)("strong",{parentName:"li"},"root:root"))),(0,o.kt)("p",null,"Learn more about ",(0,o.kt)("a",{parentName:"p",href:"https://www.linuxfoundation.org/blog/blog/classic-sysadmin-understanding-linux-file-permissions"},"file permissions")," from the ",(0,o.kt)("a",{parentName:"p",href:"https://www.linuxfoundation.org/"},"Linux Foundation"),"."),(0,o.kt)("p",null,"To learn more about file permission on Linux, read the ",(0,o.kt)("a",{parentName:"p",href:"https://www.linuxfoundation.org/blog/blog/classic-sysadmin-understanding-linux-file-permissions"},"Understanding Linux File Permissions"),"."),(0,o.kt)("h2",{id:"using-sudo-to-delegate-permissions"},"Using sudo to delegate permissions"),(0,o.kt)("p",null,"Consider file ownership and permissions to understand where the keystore is located. Take close attention when executing commands as an admin\u2013with or without ",(0,o.kt)("strong",{parentName:"p"},"super user")," (root) or ",(0,o.kt)("strong",{parentName:"p"},"sudo"),"."),(0,o.kt)("p",null,"If a command is executed without ",(0,o.kt)("strong",{parentName:"p"},"sudo")," then the generated output goes onto the ",(0,o.kt)("strong",{parentName:"p"},"user")," home."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn keys generate\n")),(0,o.kt)("p",null,"Resulting in having the ",(0,o.kt)("strong",{parentName:"p"},"keystore")," saved onto ",(0,o.kt)("inlineCode",{parentName:"p"},"/home/username/.lightning/keystore"),"."),(0,o.kt)("p",null,"On the other hand, if a command is executed with ",(0,o.kt)("strong",{parentName:"p"},"sudo")," then the generated output is delegated to ",(0,o.kt)("strong",{parentName:"p"},"root")," directory."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo lgtn keys generate\n")),(0,o.kt)("p",null,"Resulting in having the ",(0,o.kt)("strong",{parentName:"p"},"keystore")," saved onto ",(0,o.kt)("inlineCode",{parentName:"p"},"/root/.lightning/keystore"),"."),(0,o.kt)("h2",{id:"user-home-directory"},"User $HOME directory"),(0,o.kt)("p",null,"The home directory is a directory that contains the personal files of a particular user of the system. On Linux, the ",(0,o.kt)("inlineCode",{parentName:"p"},"$HOME")," environment variable is set by the login program, which sets the user `$HOME`` accordingly. A user's home goes by the username, the user who's logged in."),(0,o.kt)("p",null,"For this reason, a user can change to the home directory by executing:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cd $HOME\n")),(0,o.kt)("p",null,"A shorthand allows a user to refer to their home directory simply as ",(0,o.kt)("inlineCode",{parentName:"p"},"~")," (tilde), as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"We can find that the HOME or ~ (tilde) is highly dependent on the user who's logged in. Since we know that the user might delegate to ",(0,o.kt)("strong",{parentName:"p"},"root")," by the usage of ",(0,o.kt)("strong",{parentName:"p"},"sudo"),", this can help troubleshoot and explain the location of our files e.g. the keystore. In the section ",(0,o.kt)("a",{parentName:"p",href:"#set-the-locations-of-the-user-paths"},"Set the locations of the user paths"),", we learn how to define the location of our user configuration paths to avoid confusion. By doing it we ensure that when running the service, the service picks the correct configuration paths for our user.")),(0,o.kt)("p",null,"To learn more about the user $HOME directory read the wikipedia ",(0,o.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Home_directory"},"Home directory")," document."),(0,o.kt)("h2",{id:"set-the-locations-of-the-user-paths"},"Set the locations of the user paths"),(0,o.kt)(i.ZP,{mdxType:"FindAndReplaceConfigWithUserPaths"}),(0,o.kt)("h2",{id:"set-the-configuration-flag--c-on-the-service-unit-file"},"Set the configuration flag -c on the service unit file"),(0,o.kt)("p",null,"The following section assumes that a System service unit has been declared, and you're using systemctl to control the service, as described in our ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install#systemd-service-setup"},"Systemd Service Setup")," install section."),(0,o.kt)("p",null,"Open and edit the ",(0,o.kt)("strong",{parentName:"p"},"/etc/systemd/system/lightning.service")," file."),(0,o.kt)("p",null,"1) Replace ",(0,o.kt)("inlineCode",{parentName:"p"},"")," with YOUR username. For example, in the documentation we use the username ",(0,o.kt)("strong",{parentName:"p"},"lgtn"),", which means we'd replace ",(0,o.kt)("inlineCode",{parentName:"p"},"")," with ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn"),"."),(0,o.kt)("p",null,"2) Make sure that the ExecStart is set correctly, including the ",(0,o.kt)("inlineCode",{parentName:"p"},"-c")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home//.lightning/config.toml run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n")),(0,o.kt)("p",null,"For our example, as the username ",(0,o.kt)("strong",{parentName:"p"},"lgtn")," it would look like:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n")),(0,o.kt)("p",null,"When complete make sure the file is saved and the systemctl daemon is reloaded, as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,o.kt)("p",null,"Consequently, when a user manages the service via the systemctl, the Lightning CLI process will read the configuration file settings provided above. It includes the location of the user preferences, such as the keystore location amongst others, preventing confusion regardless of ",(0,o.kt)("strong",{parentName:"p"},"root")," delegation."),(0,o.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}g.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294);const o=e=>{let{image:t,name:n,title:o,url:a,communityMember:i=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:a,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:a,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},o),r.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/5bc389a1.9f343a0c.js b/assets/js/5bc389a1.9f343a0c.js deleted file mode 100644 index 6527e905d..000000000 --- a/assets/js/5bc389a1.9f343a0c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9829],{3905:(e,t,n)=>{n.d(t,{Zo:()=>h,kt:()=>g});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},h=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=i,g=u["".concat(s,".").concat(d)]||u[d]||p[d]||o;return n?a.createElement(g,r(r({ref:t},h),{},{components:n})):a.createElement(g,r({ref:t},h))}));function g(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,r=new Array(o);r[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:i,r[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>h,default:()=>k,frontMatter:()=>c,metadata:()=>u,toc:()=>d});var a=n(7462),i=(n(7294),n(3905)),o=n(3872);const r={toc:[]},l="wrapper";function s(e){let{components:t,...n}=e;return(0,i.kt)(l,(0,a.Z)({},r,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"During testnet phase, you have to checkout to the testnet branch. For example, the first testnet branch name was ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/tree/testnet-alpha-1"},"testnet-alpha-1")," that you would have to be checked in order to run a node successfully. A list of the active branches can be found at anytime in the GitHub repository ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/branches"},"active branches"),". While we try our best to update documentation, guides, instructions or any other written content during development, there might be breaking changes that might take some time to reflect in our documents. To avoid disappointment, check into the correct branch or contribute by getting in touch with us, or sending a PR in the relevant context, thank you!")))}s.isMDXComponent=!0;const c={title:"Updating Lightning",hide_title:!0,slug:"updating-lightning",date:new Date("2023-09-19T12:00:00.000Z"),image:"./assets/updating-lightning.png?202309191740",description:"A step-by-step guide to update the Lightning CLI from source code and Service setup",category:"Tutorial",tags:["update","rebuild","guide","setup","configuration"]},h=void 0,u={unversionedId:"Node Operators/updating-lightning",id:"Node Operators/updating-lightning",title:"Updating Lightning",description:"A step-by-step guide to update the Lightning CLI from source code and Service setup",source:"@site/guides/Node Operators/updating-lightning.md",sourceDirName:"Node Operators",slug:"/Node Operators/updating-lightning",permalink:"/guides/Node Operators/updating-lightning",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/updating-lightning.md",tags:[{label:"update",permalink:"/guides/tags/update"},{label:"rebuild",permalink:"/guides/tags/rebuild"},{label:"guide",permalink:"/guides/tags/guide"},{label:"setup",permalink:"/guides/tags/setup"},{label:"configuration",permalink:"/guides/tags/configuration"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Updating Lightning",hide_title:!0,slug:"updating-lightning",date:"2023-09-19T12:00:00.000Z",image:"./assets/updating-lightning.png?202309191740",description:"A step-by-step guide to update the Lightning CLI from source code and Service setup",category:"Tutorial",tags:["update","rebuild","guide","setup","configuration"]},sidebar:"defaultSidebar",previous:{title:"Transfering setup ownership",permalink:"/guides/Node Operators/transfering-setup-ownership"}},p={image:n(2913).Z},d=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Pulling the latest changes",id:"pulling-the-latest-changes",level:2},{value:"Switch to installer username",id:"switch-to-installer-username",level:3},{value:"Change directory to the source code",id:"change-directory-to-the-source-code",level:3},{value:"Checkout to branch",id:"checkout-to-branch",level:3},{value:"Pull the latest changes",id:"pull-the-latest-changes",level:3},{value:"Build the binary from the source code",id:"build-the-binary-from-the-source-code",level:2},{value:"Checkup the symlink setup",id:"checkup-the-symlink-setup",level:2},{value:"Systemd service",id:"systemd-service",level:2},{value:"Verify the setup",id:"verify-the-setup",level:3},{value:"Launching the node as a systemd service",id:"launching-the-node-as-a-systemd-service",level:3},{value:"Health check",id:"health-check",level:2},{value:"Conclusion",id:"conclusion",level:2}],g={toc:d},m="wrapper";function k(e){let{components:t,...r}=e;return(0,i.kt)(m,(0,a.Z)({},g,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Update Lightning",src:n(2913).Z,width:"1450",height:"816"})),(0,i.kt)("h2",{id:"introduction"},"Introduction"),(0,i.kt)("p",null,"Fleek Network's Lightning source code is updated frequently and thus keeping up with changes can be a bit of a chore and especially difficult for users who are trying to have it compiled for the first time, or updating the Lightning CLI binary for their operating systems. While we should have stable releases in the future, at the current phase of development, there's a requirement to follow the contributions directly in the repository: checking in and out, the commits you're interested in running."),(0,i.kt)("p",null,"In the following guide, we\u2019ll have a simple look into how to pull changes and update Lightning CLI on Linux, which we stick with Ubuntu for simplicity but should be easily transferrable to your ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"supported OS"),". "),(0,i.kt)("h2",{id:"pre-requisites"},"Pre-requisites"),(0,i.kt)("p",null,"To follow the guide, you will need the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Familiarity with the command-line interface"),(0,i.kt)("li",{parentName:"ul"},"Some experience with Git"),(0,i.kt)("li",{parentName:"ul"},"Have installed and set up the Lightning CLI and service")),(0,i.kt)("h2",{id:"pulling-the-latest-changes"},"Pulling the latest changes"),(0,i.kt)("p",null,"Check the latest contributions pushed to the Lightning CLI ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/commits/main"},"main branch"),", it'll give you clarity on what's been committed into the source code. Therefore, find out about new features, fixes, improvements, etc by looking directly into the repository history."),(0,i.kt)("h3",{id:"switch-to-installer-username"},"Switch to installer username"),(0,i.kt)("p",null,"First, switch to the username you've used to install and setup Fleek Network Lightning."),(0,i.kt)("p",null,"To switch to the username you've used throughout the installation process do:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"su \n")),(0,i.kt)("p",null,"For example, if you used the username ",(0,i.kt)("inlineCode",{parentName:"p"},"lgtn")," it'll look like the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"su lgtn\n")),(0,i.kt)("h3",{id:"change-directory-to-the-source-code"},"Change directory to the source code"),(0,i.kt)("p",null,"Next, ",(0,i.kt)("inlineCode",{parentName:"p"},"change directory")," to the Lightning directory in your file system. "),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"The tild ",(0,i.kt)("inlineCode",{parentName:"p"},"~")," means user $HOME, thus you have to be logged in with the correct user as requested in the ",(0,i.kt)("a",{parentName:"p",href:"#switch-to-installer-username"},"installer username")," step.")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cd \n")),(0,i.kt)("p",null,"If you have installed it via the recommended instructions, then the default location where the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"source code")," is stored should be ",(0,i.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning"),". Otherwise, if you opted-in for a custom location then look into your notes before proceeding."),(0,i.kt)("p",null,"For example, it'd look like the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~/fleek-network/lightning\n")),(0,i.kt)("h3",{id:"checkout-to-branch"},"Checkout to branch"),(0,i.kt)("p",null,"Make sure that you are checked in to the correct branch. For example, if that'd be the first testnet phase it'd be called ",(0,i.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout \n")),(0,i.kt)("p",null,"Here's an example of how the command would look like for the main default branch with corresponding name ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout main\n")),(0,i.kt)(s,{mdxType:"CheckoutCommitWarning"}),(0,i.kt)("p",null,"Here's an example of how the command would look like for the branch name ",(0,i.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout testnet-alpha-1\n")),(0,i.kt)("h3",{id:"pull-the-latest-changes"},"Pull the latest changes"),(0,i.kt)("p",null,"The syntax to pull the latest commits is the following:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git pull \n")),(0,i.kt)("p",null,"The git pull command is used to fetch and merge changes from the remote repository to the local repository. Here we're pulling from remote named ",(0,i.kt)("inlineCode",{parentName:"p"},"origin")," and branch ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". "),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git pull origin main\n")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"If you've made any changes in the local repository directory, clear them to prevent being blocked. As ",(0,i.kt)("inlineCode",{parentName:"p"},"git")," is a ",(0,i.kt)("inlineCode",{parentName:"p"},"version control")," program that looks for changes and will ask you to do something about it to prevent losing data. Most readers can disregard changes if not contributing to the development by simply ",(0,i.kt)("a",{parentName:"p",href:"https://git-scm.com/docs/git-stash"},"stashing")," or resetting the changes."),(0,i.kt)("p",{parentName:"admonition"},"A quick way to clean is to ",(0,i.kt)("inlineCode",{parentName:"p"},"stash")," the changes, for example:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git stash \n"))),(0,i.kt)("p",null,"You can check yourself, as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git remote -v\n")),(0,i.kt)("p",null,"Our output clearly describes what ",(0,i.kt)("inlineCode",{parentName:"p"},"origin")," is tracking."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"origin git@github.com:fleek-network/lightning.git (fetch)\norigin git@github.com:fleek-network/lightning.git (push)\n")),(0,i.kt)("p",null,"Alternatively, you can stash and pull, to reset the repository to the origin."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git fetch origin \ngit reset --hard origin/\ngit clean -f\n")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"With ",(0,i.kt)("inlineCode",{parentName:"p"},"git")," you can point to any point in the repository history, there might be lots of reasons you'd want to check into a certain commit or branch, e.g. if you encounter bugs and need to revert to a previous commit or version. That being said, we welcome all kinds of contributions, such as simply reporting bugs. To report issues in our repository visit the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/issues"},"issues")," page to help us improve.")),(0,i.kt)("p",null,"Here's the output we got after the git pull:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"remote: Enumerating objects: 437, done.\nremote: Counting objects: 100% (437/437), done.\nremote: Compressing objects: 100% (205/205), done.\nremote: Total 397 (delta 242), reused 334 (delta 181), pack-reused 0\nReceiving objects: 100% (397/397), 214.68 KiB | 4.77 MiB/s, done.\nResolving deltas: 100% (242/242), completed with 29 local objects.\nFrom https://github.com/fleek-network/lightning\n * branch main -> FETCH_HEAD\n 12b2647..998108d main -> origin/main\nUpdating 12b2647..998108d\nFast-forward\n .dockerignore | 6 -\n .gitignore | 2 +\n Cargo.lock | 782 +++++++----------------\n Cargo.toml | 2 +-\n core/application/src/state.rs | 12 +-\n core/cli/Cargo.toml | 47 ++\n core/cli/readme.md | 59 ++\n core/cli/src/args.rs | 63 ++\n core/cli/src/cli.rs | 136 ++++\n core/cli/src/commands/dev.rs | 112 ++++\n core/cli/src/commands/key.rs | 92 +++\n\n ...\n")),(0,i.kt)("p",null,"When your local version of the repository, is up-to-date with the remote repository, you'd get:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"From https://github.com/fleek-network/lightning\n * branch main -> FETCH_HEAD\nAlready up to date.\n")),(0,i.kt)("p",null,'A "already up to date" message means that you have the latest version of the source code and can proceed with compiling the binary process from the source code to override the ',(0,i.kt)("inlineCode",{parentName:"p"},"Lightning CLI")," version you're on. You can also make any other setup changes that might find necessary. Some changes might be related to the recommended setup of Systemd Service that helps control the Fleek Network Lightning Node binary process, etc."),(0,i.kt)("h2",{id:"build-the-binary-from-the-source-code"},"Build the binary from the source code"),(0,i.kt)("p",null,"We're assuming that your system setup hasn't changed, such as Rust toolchain still being installed and setup correctly in the system and any other required dependencies. If you have made changes to your system and need to revisit the setup instructions, check our install document ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/install"},"here"),"."),(0,i.kt)("p",null,"First, switch the user and change directory to the Lightning directory in your file system as described in ",(0,i.kt)("a",{parentName:"p",href:"#switch-to-installer-username"},"switch to installer username")," ",(0,i.kt)("a",{parentName:"p",href:"#change-directory-to-the-source-code"},"change directory to the source code")," sections."),(0,i.kt)("p",null,"Recall the command from our install document or getting started guide? As you probably guessed, you need to execute the rust cargo build command. But firstly, we are going to clean and update the Rust package manager, as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo clean\ncargo update\n")),(0,i.kt)("p",null,"Next, execute the build command to compile the Fleek Network Lightning CLI binary."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo +stable build --release\n")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable.")),(0,i.kt)("p",null,"Once the Rust compiler completes, the generated binary will be available in the source code project directory. "),(0,i.kt)("p",null,"If you have stick with the default recommendation, that'll be at ",(0,i.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning/target/release/lightning-node"),"."),(0,i.kt)("h2",{id:"checkup-the-symlink-setup"},"Checkup the symlink setup"),(0,i.kt)("p",null,"During the original install and setup process, a symbolic link (symlink) was created linking the generated binary file located in ",(0,i.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning/target/release/lightning-node")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"/usr/local/bin/lgtn"),". By placing the symlink in the the default installation location of the user, the executable application is available globally as ",(0,i.kt)("inlineCode",{parentName:"p"},"lgtn"),"."),(0,i.kt)("p",null,"You can see the full absolute path of the symlink and verify if setup correctly by running:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"readlink -f \n")),(0,i.kt)("p",null,"If you have followed the recommended name, the symbolic link should be called ",(0,i.kt)("inlineCode",{parentName:"p"},"lgtn"),", short version for ",(0,i.kt)("inlineCode",{parentName:"p"},"lightning"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"readlink -f lgtn\n")),(0,i.kt)("p",null,"Here's an example where we find the symlink ",(0,i.kt)("inlineCode",{parentName:"p"},"lgtn")," pointing to the absolute path where our source code and originated built binary is located, as described in the ",(0,i.kt)("a",{parentName:"p",href:"#build-the-binary-from-the-source-code"},"build the binary from the source code")," section."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"/home//fleek-network/lightning/target/release/lightning-node\n")),(0,i.kt)("p",null,"Alternatively, you can use the ",(0,i.kt)("inlineCode",{parentName:"p"},"ls")," command to identify the symlink."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"ls -la $(which lgtn)\n")),(0,i.kt)("p",null,"If you find an error, it's very likely that a symlink is not setup. You can revisit the ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/install"},"installation")," to learn, or execute the command to link the build binary to the user default install location:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'sudo ln -s "~/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn\n')),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Make sure that the paths provided to the command ",(0,i.kt)("inlineCode",{parentName:"p"},"ln")," are correct. If you are using customized pathnames or switched to a different username other than the one used for installation it has to change accordingly.")),(0,i.kt)("h2",{id:"systemd-service"},"Systemd service"),(0,i.kt)("p",null,"It's highly recommended to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions."),(0,i.kt)("h3",{id:"verify-the-setup"},"Verify the setup"),(0,i.kt)("p",null,"The recommended setup is to wrap the Lightning binary process as a Systemd service, as instructed in the ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/install"},"install")," section."),(0,i.kt)("p",null,"If you have followed the recommendations, you should have the service file called ",(0,i.kt)("inlineCode",{parentName:"p"},"ligthning.service")," in the path ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/systemd/system/lightning.service"),"."),(0,i.kt)("p",null,"The content of ",(0,i.kt)("inlineCode",{parentName:"p"},"lightning.service")," should have some or more of the following properties and values:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n")),(0,i.kt)("p",null,"Every time the file is modified, the Systemd process should be reloaded. You can do this by executing:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,i.kt)("p",null,"To learn more about how to create a Systemd service read the ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/install#manual-installation"},"manual installation")," document that illustrates the steps required in greater detail."),(0,i.kt)("h3",{id:"launching-the-node-as-a-systemd-service"},"Launching the node as a systemd service"),(0,i.kt)("p",null,"After completing all the steps and checkups mentioned throughout the guide, you should have the Fleek Network Lightning Service ready to go."),(0,i.kt)("p",null,"To launch the service, execute the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning.service\n")),(0,i.kt)("p",null,"To learn more about how to use Systemctl to manage the Lightning service, read the document ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/install#use-systemctl-to-manage-systemd-service"},"here"),"."),(0,i.kt)("h2",{id:"health-check"},"Health check"),(0,i.kt)("p",null,"First, complete all the steps and checkups mentioned throught the guide and once the Node process is running perform a health check."),(0,i.kt)("p",null,"To run a quick health checkup, send a GET request to ",(0,i.kt)("inlineCode",{parentName:"p"},"/health")," endpoint of the RPC on ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/requirements#ports"},"port")," 4230."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'curl -w "\\n" localhost:4230/health\n')),(0,i.kt)("p",null,"If successful, you should get the response ",(0,i.kt)("inlineCode",{parentName:"p"},"running and staked"),", as follows:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"running and staked\n")),(0,i.kt)("p",null,"If you'd like to learn more about health check, visit the section ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/health-check"},"health check")," of our documentation."),(0,i.kt)("h2",{id:"conclusion"},"Conclusion"),(0,i.kt)("p",null,"The Fleek Network's Ursa CLI is in constant development, there are frequent changes that can introduce features, fixes, and performance improvements, but also breaking changes that in some cases require you to add, including new libraries or packages in your operating system."),(0,i.kt)("p",null,"In the current phase of development, a proper software release cycle for the updates is still in development, thus we pick changes from the source repository to build the Lightning application."),(0,i.kt)("p",null,"We have looked into how to pull the changes via Git, and discussed that contributions can introduce new requirements to the host operating system that leads to updates or changes in the documentation\u2013mentioning how hard it is to keep in sync. Explained how to look into the contributions to understand the nature of the change and get hints about new features."),(0,i.kt)("p",null,"To complete, provided a step-by-step walkthrough the installation and setup process for the Fleek Network Lightning CLI and Systemd service."),(0,i.kt)("p",null,"Discover more about the project by ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"watching/contributing on GitHub"),", following us on ",(0,i.kt)("a",{parentName:"p",href:"https://twitter.com/fleek_net"},"Twitter"),", and joining ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"our community Discord")," for any updates."),(0,i.kt)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}k.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(7294);const i=e=>{let{image:t,name:n,title:i,url:o,communityMember:r=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:o,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:o,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},i),a.createElement("span",{className:"discord"},r?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},2913:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/updating-lightning-e5c2633345bdcc0db715dd87b269b25b.png"}}]); \ No newline at end of file diff --git a/assets/js/5bc389a1.a5e2deb7.js b/assets/js/5bc389a1.a5e2deb7.js new file mode 100644 index 000000000..1b29f58be --- /dev/null +++ b/assets/js/5bc389a1.a5e2deb7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9829],{7631:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>h,toc:()=>u});var i=t(5893),s=t(1151),o=t(3872);function r(e){const n={a:"a",admonition:"admonition",p:"p",...(0,s.a)(),...e.components};return(0,i.jsx)(n.admonition,{type:"warning",children:(0,i.jsxs)(n.p,{children:["During testnet phase, you have to checkout to the testnet branch. For example, the first testnet branch name was ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/tree/testnet-alpha-1",children:"testnet-alpha-1"})," that you would have to be checked in order to run a node successfully. A list of the active branches can be found at anytime in the GitHub repository ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/branches",children:"active branches"}),". While we try our best to update documentation, guides, instructions or any other written content during development, there might be breaking changes that might take some time to reflect in our documents. To avoid disappointment, check into the correct branch or contribute by getting in touch with us, or sending a PR in the relevant context, thank you!"]})})}function a(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(r,{...e})}):r(e)}const l={title:"Updating Lightning",hide_title:!0,slug:"updating-lightning",date:new Date("2023-09-19T12:00:00.000Z"),image:"./assets/updating-lightning.png?202309191740",description:"A step-by-step guide to update the Lightning CLI from source code and Service setup",category:"Tutorial",tags:["update","rebuild","guide","setup","configuration"]},c=void 0,h={id:"Node Operators/updating-lightning",title:"Updating Lightning",description:"A step-by-step guide to update the Lightning CLI from source code and Service setup",source:"@site/guides/Node Operators/updating-lightning.md",sourceDirName:"Node Operators",slug:"/Node Operators/updating-lightning",permalink:"/guides/Node Operators/updating-lightning",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/guides/Node Operators/updating-lightning.md",tags:[{label:"update",permalink:"/guides/tags/update"},{label:"rebuild",permalink:"/guides/tags/rebuild"},{label:"guide",permalink:"/guides/tags/guide"},{label:"setup",permalink:"/guides/tags/setup"},{label:"configuration",permalink:"/guides/tags/configuration"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Updating Lightning",hide_title:!0,slug:"updating-lightning",date:"2023-09-19T12:00:00.000Z",image:"./assets/updating-lightning.png?202309191740",description:"A step-by-step guide to update the Lightning CLI from source code and Service setup",category:"Tutorial",tags:["update","rebuild","guide","setup","configuration"]},sidebar:"defaultSidebar",previous:{title:"Transfering setup ownership",permalink:"/guides/Node Operators/transfering-setup-ownership"}},d={image:t(1506).Z},u=[{value:"Introduction",id:"introduction",level:2},{value:"Pre-requisites",id:"pre-requisites",level:2},{value:"Pulling the latest changes",id:"pulling-the-latest-changes",level:2},{value:"Switch to installer username",id:"switch-to-installer-username",level:3},{value:"Change directory to the source code",id:"change-directory-to-the-source-code",level:3},{value:"Checkout to branch",id:"checkout-to-branch",level:3},{value:"Pull the latest changes",id:"pull-the-latest-changes",level:3},{value:"Build the binary from the source code",id:"build-the-binary-from-the-source-code",level:2},{value:"Checkup the symlink setup",id:"checkup-the-symlink-setup",level:2},{value:"Systemd service",id:"systemd-service",level:2},{value:"Verify the setup",id:"verify-the-setup",level:3},{value:"Launching the node as a systemd service",id:"launching-the-node-as-a-systemd-service",level:3},{value:"Health check",id:"health-check",level:2},{value:"Conclusion",id:"conclusion",level:2}];function g(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Update Lightning",src:t(2913).Z+"",width:"1450",height:"816"})}),"\n","\n","\n",(0,i.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,i.jsx)(n.p,{children:"Fleek Network's Lightning source code is updated frequently and thus keeping up with changes can be a bit of a chore and especially difficult for users who are trying to have it compiled for the first time, or updating the Lightning CLI binary for their operating systems. While we should have stable releases in the future, at the current phase of development, there's a requirement to follow the contributions directly in the repository: checking in and out, the commits you're interested in running."}),"\n",(0,i.jsxs)(n.p,{children:["In the following guide, we\u2019ll have a simple look into how to pull changes and update Lightning CLI on Linux, which we stick with Ubuntu for simplicity but should be easily transferrable to your ",(0,i.jsx)(n.a,{href:"/docs/node/requirements#server",children:"supported OS"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"pre-requisites",children:"Pre-requisites"}),"\n",(0,i.jsx)(n.p,{children:"To follow the guide, you will need the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Familiarity with the command-line interface"}),"\n",(0,i.jsx)(n.li,{children:"Some experience with Git"}),"\n",(0,i.jsx)(n.li,{children:"Have installed and set up the Lightning CLI and service"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"pulling-the-latest-changes",children:"Pulling the latest changes"}),"\n",(0,i.jsxs)(n.p,{children:["Check the latest contributions pushed to the Lightning CLI ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/commits/main",children:"main branch"}),", it'll give you clarity on what's been committed into the source code. Therefore, find out about new features, fixes, improvements, etc by looking directly into the repository history."]}),"\n",(0,i.jsx)(n.h3,{id:"switch-to-installer-username",children:"Switch to installer username"}),"\n",(0,i.jsx)(n.p,{children:"First, switch to the username you've used to install and setup Fleek Network Lightning."}),"\n",(0,i.jsx)(n.p,{children:"To switch to the username you've used throughout the installation process do:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"su \n"})}),"\n",(0,i.jsxs)(n.p,{children:["For example, if you used the username ",(0,i.jsx)(n.code,{children:"lgtn"})," it'll look like the following command:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"su lgtn\n"})}),"\n",(0,i.jsx)(n.h3,{id:"change-directory-to-the-source-code",children:"Change directory to the source code"}),"\n",(0,i.jsxs)(n.p,{children:["Next, ",(0,i.jsx)(n.code,{children:"change directory"})," to the Lightning directory in your file system."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["The tild ",(0,i.jsx)(n.code,{children:"~"})," means user $HOME, thus you have to be logged in with the correct user as requested in the ",(0,i.jsx)(n.a,{href:"#switch-to-installer-username",children:"installer username"})," step."]})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cd \n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you have installed it via the recommended instructions, then the default location where the ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"source code"})," is stored should be ",(0,i.jsx)(n.code,{children:"~/fleek-network/lightning"}),". Otherwise, if you opted-in for a custom location then look into your notes before proceeding."]}),"\n",(0,i.jsx)(n.p,{children:"For example, it'd look like the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cd ~/fleek-network/lightning\n"})}),"\n",(0,i.jsx)(n.h3,{id:"checkout-to-branch",children:"Checkout to branch"}),"\n",(0,i.jsxs)(n.p,{children:["Make sure that you are checked in to the correct branch. For example, if that'd be the first testnet phase it'd be called ",(0,i.jsx)(n.code,{children:"testnet-alpha-1"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git checkout \n"})}),"\n",(0,i.jsxs)(n.p,{children:["Here's an example of how the command would look like for the main default branch with corresponding name ",(0,i.jsx)(n.code,{children:"main"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git checkout main\n"})}),"\n",(0,i.jsx)(a,{}),"\n",(0,i.jsxs)(n.p,{children:["Here's an example of how the command would look like for the branch name ",(0,i.jsx)(n.code,{children:"testnet-alpha-1"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git checkout testnet-alpha-1\n"})}),"\n",(0,i.jsx)(n.h3,{id:"pull-the-latest-changes",children:"Pull the latest changes"}),"\n",(0,i.jsx)(n.p,{children:"The syntax to pull the latest commits is the following:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git pull \n"})}),"\n",(0,i.jsxs)(n.p,{children:["The git pull command is used to fetch and merge changes from the remote repository to the local repository. Here we're pulling from remote named ",(0,i.jsx)(n.code,{children:"origin"})," and branch ",(0,i.jsx)(n.code,{children:"main"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git pull origin main\n"})}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsxs)(n.p,{children:["If you've made any changes in the local repository directory, clear them to prevent being blocked. As ",(0,i.jsx)(n.code,{children:"git"})," is a ",(0,i.jsx)(n.code,{children:"version control"})," program that looks for changes and will ask you to do something about it to prevent losing data. Most readers can disregard changes if not contributing to the development by simply ",(0,i.jsx)(n.a,{href:"https://git-scm.com/docs/git-stash",children:"stashing"})," or resetting the changes."]}),(0,i.jsxs)(n.p,{children:["A quick way to clean is to ",(0,i.jsx)(n.code,{children:"stash"})," the changes, for example:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git stash \n"})})]}),"\n",(0,i.jsx)(n.p,{children:"You can check yourself, as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git remote -v\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Our output clearly describes what ",(0,i.jsx)(n.code,{children:"origin"})," is tracking."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"origin\tgit@github.com:fleek-network/lightning.git (fetch)\norigin\tgit@github.com:fleek-network/lightning.git (push)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Alternatively, you can stash and pull, to reset the repository to the origin."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"git fetch origin \ngit reset --hard origin/\ngit clean -f\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["With ",(0,i.jsx)(n.code,{children:"git"})," you can point to any point in the repository history, there might be lots of reasons you'd want to check into a certain commit or branch, e.g. if you encounter bugs and need to revert to a previous commit or version. That being said, we welcome all kinds of contributions, such as simply reporting bugs. To report issues in our repository visit the ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/issues",children:"issues"})," page to help us improve."]})}),"\n",(0,i.jsx)(n.p,{children:"Here's the output we got after the git pull:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"remote: Enumerating objects: 437, done.\nremote: Counting objects: 100% (437/437), done.\nremote: Compressing objects: 100% (205/205), done.\nremote: Total 397 (delta 242), reused 334 (delta 181), pack-reused 0\nReceiving objects: 100% (397/397), 214.68 KiB | 4.77 MiB/s, done.\nResolving deltas: 100% (242/242), completed with 29 local objects.\nFrom https://github.com/fleek-network/lightning\n * branch main -> FETCH_HEAD\n 12b2647..998108d main -> origin/main\nUpdating 12b2647..998108d\nFast-forward\n .dockerignore | 6 -\n .gitignore | 2 +\n Cargo.lock | 782 +++++++----------------\n Cargo.toml | 2 +-\n core/application/src/state.rs | 12 +-\n core/cli/Cargo.toml | 47 ++\n core/cli/readme.md | 59 ++\n core/cli/src/args.rs | 63 ++\n core/cli/src/cli.rs | 136 ++++\n core/cli/src/commands/dev.rs | 112 ++++\n core/cli/src/commands/key.rs | 92 +++\n\n ...\n"})}),"\n",(0,i.jsx)(n.p,{children:"When your local version of the repository, is up-to-date with the remote repository, you'd get:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"From https://github.com/fleek-network/lightning\n * branch main -> FETCH_HEAD\nAlready up to date.\n"})}),"\n",(0,i.jsxs)(n.p,{children:['A "already up to date" message means that you have the latest version of the source code and can proceed with compiling the binary process from the source code to override the ',(0,i.jsx)(n.code,{children:"Lightning CLI"})," version you're on. You can also make any other setup changes that might find necessary. Some changes might be related to the recommended setup of Systemd Service that helps control the Fleek Network Lightning Node binary process, etc."]}),"\n",(0,i.jsx)(n.h2,{id:"build-the-binary-from-the-source-code",children:"Build the binary from the source code"}),"\n",(0,i.jsxs)(n.p,{children:["We're assuming that your system setup hasn't changed, such as Rust toolchain still being installed and setup correctly in the system and any other required dependencies. If you have made changes to your system and need to revisit the setup instructions, check our install document ",(0,i.jsx)(n.a,{href:"/docs/node/install",children:"here"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["First, switch the user and change directory to the Lightning directory in your file system as described in ",(0,i.jsx)(n.a,{href:"#switch-to-installer-username",children:"switch to installer username"})," ",(0,i.jsx)(n.a,{href:"#change-directory-to-the-source-code",children:"change directory to the source code"})," sections."]}),"\n",(0,i.jsx)(n.p,{children:"Recall the command from our install document or getting started guide? As you probably guessed, you need to execute the rust cargo build command. But firstly, we are going to clean and update the Rust package manager, as follows:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cargo clean\ncargo update\n"})}),"\n",(0,i.jsx)(n.p,{children:"Next, execute the build command to compile the Fleek Network Lightning CLI binary."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"cargo +stable build --release\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable."})}),"\n",(0,i.jsx)(n.p,{children:"Once the Rust compiler completes, the generated binary will be available in the source code project directory."}),"\n",(0,i.jsxs)(n.p,{children:["If you have stick with the default recommendation, that'll be at ",(0,i.jsx)(n.code,{children:"~/fleek-network/lightning/target/release/lightning-node"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"checkup-the-symlink-setup",children:"Checkup the symlink setup"}),"\n",(0,i.jsxs)(n.p,{children:["During the original install and setup process, a symbolic link (symlink) was created linking the generated binary file located in ",(0,i.jsx)(n.code,{children:"~/fleek-network/lightning/target/release/lightning-node"})," to ",(0,i.jsx)(n.code,{children:"/usr/local/bin/lgtn"}),". By placing the symlink in the the default installation location of the user, the executable application is available globally as ",(0,i.jsx)(n.code,{children:"lgtn"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"You can see the full absolute path of the symlink and verify if setup correctly by running:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"readlink -f \n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you have followed the recommended name, the symbolic link should be called ",(0,i.jsx)(n.code,{children:"lgtn"}),", short version for ",(0,i.jsx)(n.code,{children:"lightning"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"readlink -f lgtn\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Here's an example where we find the symlink ",(0,i.jsx)(n.code,{children:"lgtn"})," pointing to the absolute path where our source code and originated built binary is located, as described in the ",(0,i.jsx)(n.a,{href:"#build-the-binary-from-the-source-code",children:"build the binary from the source code"})," section."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"/home//fleek-network/lightning/target/release/lightning-node\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, you can use the ",(0,i.jsx)(n.code,{children:"ls"})," command to identify the symlink."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"ls -la $(which lgtn)\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you find an error, it's very likely that a symlink is not setup. You can revisit the ",(0,i.jsx)(n.a,{href:"/docs/node/install",children:"installation"})," to learn, or execute the command to link the build binary to the user default install location:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'sudo ln -s "~/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn\n'})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Make sure that the paths provided to the command ",(0,i.jsx)(n.code,{children:"ln"})," are correct. If you are using customized pathnames or switched to a different username other than the one used for installation it has to change accordingly."]})}),"\n",(0,i.jsx)(n.h2,{id:"systemd-service",children:"Systemd service"}),"\n",(0,i.jsx)(n.p,{children:"It's highly recommended to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions."}),"\n",(0,i.jsx)(n.h3,{id:"verify-the-setup",children:"Verify the setup"}),"\n",(0,i.jsxs)(n.p,{children:["The recommended setup is to wrap the Lightning binary process as a Systemd service, as instructed in the ",(0,i.jsx)(n.a,{href:"/docs/node/install",children:"install"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["If you have followed the recommendations, you should have the service file called ",(0,i.jsx)(n.code,{children:"ligthning.service"})," in the path ",(0,i.jsx)(n.code,{children:"/etc/systemd/system/lightning.service"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The content of ",(0,i.jsx)(n.code,{children:"lightning.service"})," should have some or more of the following properties and values:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[Unit]\nDescription=Fleek Network Node lightning service\n\n[Service]\nType=simple\nMemoryHigh=32G\nRestartSec=15s\nRestart=always\nExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run\nStandardOutput=append:/var/log/lightning/output.log\nStandardError=append:/var/log/lightning/diagnostic.log\nEnvironment=TMPDIR=/var/tmp\n\n[Install]\nWantedBy=multi-user.target\n"})}),"\n",(0,i.jsx)(n.p,{children:"Every time the file is modified, the Systemd process should be reloaded. You can do this by executing:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To learn more about how to create a Systemd service read the ",(0,i.jsx)(n.a,{href:"/docs/node/install#manual-installation",children:"manual installation"})," document that illustrates the steps required in greater detail."]}),"\n",(0,i.jsx)(n.h3,{id:"launching-the-node-as-a-systemd-service",children:"Launching the node as a systemd service"}),"\n",(0,i.jsx)(n.p,{children:"After completing all the steps and checkups mentioned throughout the guide, you should have the Fleek Network Lightning Service ready to go."}),"\n",(0,i.jsx)(n.p,{children:"To launch the service, execute the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo systemctl start lightning.service\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To learn more about how to use Systemctl to manage the Lightning service, read the document ",(0,i.jsx)(n.a,{href:"/docs/node/install#use-systemctl-to-manage-systemd-service",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"health-check",children:"Health check"}),"\n",(0,i.jsx)(n.p,{children:"First, complete all the steps and checkups mentioned throught the guide and once the Node process is running perform a health check."}),"\n",(0,i.jsxs)(n.p,{children:["To run a quick health checkup, send a GET request to ",(0,i.jsx)(n.code,{children:"/health"})," endpoint of the RPC on ",(0,i.jsx)(n.a,{href:"/docs/node/requirements#ports",children:"port"})," 4230."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:'curl -w "\\n" localhost:4230/health\n'})}),"\n",(0,i.jsxs)(n.p,{children:["If successful, you should get the response ",(0,i.jsx)(n.code,{children:"running and staked"}),", as follows:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"running and staked\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you'd like to learn more about health check, visit the section ",(0,i.jsx)(n.a,{href:"/docs/node/health-check",children:"health check"})," of our documentation."]}),"\n",(0,i.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network's Ursa CLI is in constant development, there are frequent changes that can introduce features, fixes, and performance improvements, but also breaking changes that in some cases require you to add, including new libraries or packages in your operating system."}),"\n",(0,i.jsx)(n.p,{children:"In the current phase of development, a proper software release cycle for the updates is still in development, thus we pick changes from the source repository to build the Lightning application."}),"\n",(0,i.jsx)(n.p,{children:"We have looked into how to pull the changes via Git, and discussed that contributions can introduce new requirements to the host operating system that leads to updates or changes in the documentation\u2013mentioning how hard it is to keep in sync. Explained how to look into the contributions to understand the nature of the change and get hints about new features."}),"\n",(0,i.jsx)(n.p,{children:"To complete, provided a step-by-step walkthrough the installation and setup process for the Fleek Network Lightning CLI and Systemd service."}),"\n",(0,i.jsxs)(n.p,{children:["Discover more about the project by ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"watching/contributing on GitHub"}),", following us on ",(0,i.jsx)(n.a,{href:"https://twitter.com/fleek_net",children:"Twitter"}),", and joining ",(0,i.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"our community Discord"})," for any updates."]}),"\n",(0,i.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(g,{...e})}):g(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>s});t(7294);var i=t(5893);const s=e=>{let{image:n,name:t,title:s,url:o,communityMember:r=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:o,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:o,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:s}),(0,i.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1506:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/updating-lightning-e5c2633345bdcc0db715dd87b269b25b.png"},2913:(e,n,t)=>{t.d(n,{Z:()=>i});const i=t.p+"assets/images/updating-lightning-e5c2633345bdcc0db715dd87b269b25b.png"},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>r});var i=t(7294);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d08f08d.ecec00ba.js b/assets/js/5d08f08d.5c7abe18.js similarity index 98% rename from assets/js/5d08f08d.ecec00ba.js rename to assets/js/5d08f08d.5c7abe18.js index 1fbf6ef3b..2a0b55f7a 100644 --- a/assets/js/5d08f08d.ecec00ba.js +++ b/assets/js/5d08f08d.5c7abe18.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[659],{340:e=>{e.exports=JSON.parse('{"label":"Guide","permalink":"/guides/tags/guide","allTagsPath":"/guides/tags","count":6,"items":[{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","permalink":"/guides/Node Operators/getting-started"},{"id":"Node Operators/how-to-manage-logfiles","title":"How to manage log files","description":"Learn how to rotate, compress the log files","permalink":"/guides/Node Operators/how-to-manage-log-files"},{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"},{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","permalink":"/guides/Node Operators/running-a-node-in-docker"},{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"},{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[659],{340:e=>{e.exports=JSON.parse('{"label":"Guide","permalink":"/guides/tags/guide","allTagsPath":"/guides/tags","count":6,"items":[{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","permalink":"/guides/Node Operators/getting-started"},{"id":"Node Operators/how-to-manage-logfiles","title":"How to manage log files","description":"Learn how to rotate, compress the log files","permalink":"/guides/Node Operators/how-to-manage-log-files"},{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"},{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","permalink":"/guides/Node Operators/running-a-node-in-docker"},{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"},{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/5d38c936.8764d96d.js b/assets/js/5d38c936.01ab4afd.js similarity index 80% rename from assets/js/5d38c936.8764d96d.js rename to assets/js/5d38c936.01ab4afd.js index 5eea375c2..995bacb03 100644 --- a/assets/js/5d38c936.8764d96d.js +++ b/assets/js/5d38c936.01ab4afd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9804],{9797:e=>{e.exports=JSON.parse('{"label":"Rust dependencies","permalink":"/docs/tags/rust-dependencies","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9804],{9797:e=>{e.exports=JSON.parse('{"label":"Rust dependencies","permalink":"/docs/tags/rust-dependencies","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.3e88c822.js b/assets/js/5e95c892.3e88c822.js new file mode 100644 index 000000000..e82e5161c --- /dev/null +++ b/assets/js/5e95c892.3e88c822.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9661],{1892:(e,s,r)=>{r.r(s),r.d(s,{default:()=>l});r(7294);var a=r(4334),c=r(833),t=r(5281),u=r(8790),d=r(8888),n=r(5893);function l(e){return(0,n.jsx)(c.FG,{className:(0,a.Z)(t.k.wrapper.docsPages),children:(0,n.jsx)(d.Z,{children:(0,u.H)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5ec90731.f6a49b70.js b/assets/js/5ec90731.4eab081d.js similarity index 87% rename from assets/js/5ec90731.f6a49b70.js rename to assets/js/5ec90731.4eab081d.js index 6a069edc4..02762009c 100644 --- a/assets/js/5ec90731.f6a49b70.js +++ b/assets/js/5ec90731.4eab081d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8942],{5440:e=>{e.exports=JSON.parse('{"label":"transfer","permalink":"/guides/tags/transfer","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8942],{5440:e=>{e.exports=JSON.parse('{"label":"transfer","permalink":"/guides/tags/transfer","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/5ef0bdde.fbb18141.js b/assets/js/5ef0bdde.da8175a7.js similarity index 80% rename from assets/js/5ef0bdde.fbb18141.js rename to assets/js/5ef0bdde.da8175a7.js index 9c0a17543..d44bc1aab 100644 --- a/assets/js/5ef0bdde.fbb18141.js +++ b/assets/js/5ef0bdde.da8175a7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8567],{7778:t=>{t.exports=JSON.parse('{"label":"content routing","permalink":"/blog/tags/content-routing","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8567],{7778:t=>{t.exports=JSON.parse('{"label":"content routing","permalink":"/blog/tags/content-routing","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/6048.a0d2f860.js b/assets/js/6048.a0d2f860.js deleted file mode 100644 index a0cca3410..000000000 --- a/assets/js/6048.a0d2f860.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6048],{9058:(e,t,a)=>{a.d(t,{Z:()=>h});var l=a(7294),r=a(6010),n=a(8888),o=a(7524),s=a(9960),i=a(5999);const m={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};function c(e){let{sidebar:t}=e;return l.createElement("aside",{className:"col col--3"},l.createElement("nav",{className:(0,r.Z)(m.sidebar,"thin-scrollbar"),"aria-label":(0,i.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},l.createElement("div",{className:(0,r.Z)(m.sidebarItemTitle,"margin-bottom--md")},t.title),l.createElement("ul",{className:(0,r.Z)(m.sidebarItemList,"clean-list")},t.items.map((e=>l.createElement("li",{key:e.permalink,className:m.sidebarItem},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:m.sidebarItemLink,activeClassName:m.sidebarItemLinkActive},e.title)))))))}var u=a(3102);function d(e){let{sidebar:t}=e;return l.createElement("ul",{className:"menu__list"},t.items.map((e=>l.createElement("li",{key:e.permalink,className:"menu__list-item"},l.createElement(s.Z,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active"},e.title)))))}function g(e){return l.createElement(u.Zo,{component:d,props:e})}function p(e){let{sidebar:t}=e;const a=(0,o.i)();return t?.items.length?"mobile"===a?l.createElement(g,{sidebar:t}):l.createElement(c,{sidebar:t}):null}function h(e){const{sidebar:t,toc:a,children:o,...s}=e,i=t&&t.items.length>0;return l.createElement(n.Z,s,l.createElement("div",{className:"container margin-vert--lg"},l.createElement("div",{className:"row"},l.createElement(p,{sidebar:t}),l.createElement("main",{className:(0,r.Z)("col",{"col--7":i,"col--9 col--offset-1":!i}),itemScope:!0,itemType:"http://schema.org/Blog"},o),a&&l.createElement("div",{className:"col col--2"},a))))}},390:(e,t,a)=>{a.d(t,{Z:()=>A});var l=a(7294),r=a(6010),n=a(9460),o=a(4996);function s(e){let{children:t,className:a}=e;const{frontMatter:r,assets:s}=(0,n.C)(),{withBaseUrl:i}=(0,o.C)(),m=s.image??r.image;return l.createElement("article",{className:a,itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},m&&l.createElement("meta",{itemProp:"image",content:i(m,{absolute:!0})}),t)}var i=a(9960);const m={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:o}=(0,n.C)(),{permalink:s,title:c}=a,u=o?"h1":"h2";return l.createElement(u,{className:(0,r.Z)(m.title,t),itemProp:"headline"},o?c:l.createElement(i.Z,{itemProp:"url",to:s},c))}var u=a(5999),d=a(8824);const g={container:"container_mt6G"};function p(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,d.c)();return t=>{const a=Math.ceil(t);return e(a,(0,u.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return l.createElement(l.Fragment,null,a(t))}function h(e){let{date:t,formattedDate:a}=e;return l.createElement("time",{dateTime:t,itemProp:"datePublished"},a)}function E(){return l.createElement(l.Fragment,null," \xb7 ")}function b(e){let{className:t}=e;const{metadata:a}=(0,n.C)(),{date:o,formattedDate:s,readingTime:i}=a;return l.createElement("div",{className:(0,r.Z)(g.container,"margin-vert--md",t)},l.createElement(h,{date:o,formattedDate:s}),void 0!==i&&l.createElement(l.Fragment,null,l.createElement(E,null),l.createElement(p,{readingTime:i})))}function f(e){return e.href?l.createElement(i.Z,e):l.createElement(l.Fragment,null,e.children)}function v(e){let{author:t,className:a}=e;const{name:n,title:o,url:s,imageURL:i,email:m}=t,c=s||m&&`mailto:${m}`||void 0;return l.createElement("div",{className:(0,r.Z)("avatar margin-bottom--sm",a)},i&&l.createElement(f,{href:c,className:"avatar__photo-link"},l.createElement("img",{className:"avatar__photo",src:i,alt:n})),n&&l.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},l.createElement("div",{className:"avatar__name"},l.createElement(f,{href:c,itemProp:"url"},l.createElement("span",{itemProp:"name"},n))),o&&l.createElement("small",{className:"avatar__subtitle",itemProp:"description"},o)))}const P={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function N(e){let{className:t}=e;const{metadata:{authors:a},assets:o}=(0,n.C)();if(0===a.length)return null;const s=a.every((e=>{let{name:t}=e;return!t}));return l.createElement("div",{className:(0,r.Z)("margin-top--md margin-bottom--sm",s?P.imageOnlyAuthorRow:"row",t)},a.map(((e,t)=>l.createElement("div",{className:(0,r.Z)(!s&&"col col--6",s?P.imageOnlyAuthorCol:P.authorCol),key:t},l.createElement(v,{author:{...e,imageURL:o.authorsImageUrls[t]??e.imageURL}})))))}function _(){return l.createElement("header",null,l.createElement(c,null),l.createElement(b,null),l.createElement(N,null))}var Z=a(8780),k=a(8718);function I(e){let{children:t,className:a}=e;const{isBlogPostPage:o}=(0,n.C)();return l.createElement("div",{id:o?Z.blogPostContainerID:void 0,className:(0,r.Z)("markdown",a),itemProp:"articleBody"},l.createElement(k.Z,null,t))}var C=a(4881),w=a(1526),T=a(7462);function y(){return l.createElement("b",null,l.createElement(u.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))}function F(e){const{blogPostTitle:t,...a}=e;return l.createElement(i.Z,(0,T.Z)({"aria-label":(0,u.I)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t})},a),l.createElement(y,null))}const L={blogPostFooterDetailsFull:"blogPostFooterDetailsFull_mRVl"};function B(){const{metadata:e,isBlogPostPage:t}=(0,n.C)(),{tags:a,title:o,editUrl:s,hasTruncateMarker:i}=e,m=!t&&i,c=a.length>0;return c||m||s?l.createElement("footer",{className:(0,r.Z)("row docusaurus-mt-lg",t&&L.blogPostFooterDetailsFull)},c&&l.createElement("div",{className:(0,r.Z)("col",{"col--9":m})},l.createElement(w.Z,{tags:a})),t&&s&&l.createElement("div",{className:"col margin-top--sm"},l.createElement(C.Z,{editUrl:s})),m&&l.createElement("div",{className:(0,r.Z)("col text--right",{"col--3":c})},l.createElement(F,{blogPostTitle:o,to:e.permalink}))):null}function A(e){let{children:t,className:a}=e;const o=function(){const{isBlogPostPage:e}=(0,n.C)();return e?void 0:"margin-bottom--xl"}();return l.createElement(s,{className:(0,r.Z)(o,a)},l.createElement(_,null),l.createElement(I,null,t),l.createElement(B,null))}},9460:(e,t,a)=>{a.d(t,{C:()=>s,n:()=>o});var l=a(7294),r=a(902);const n=l.createContext(null);function o(e){let{children:t,content:a,isBlogPostPage:r=!1}=e;const o=function(e){let{content:t,isBlogPostPage:a}=e;return(0,l.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:r});return l.createElement(n.Provider,{value:o},t)}function s(){const e=(0,l.useContext)(n);if(null===e)throw new r.i6("BlogPostProvider");return e}},8824:(e,t,a)=>{a.d(t,{c:()=>m});var l=a(7294),r=a(2263);const n=["zero","one","two","few","many","other"];function o(e){return n.filter((t=>e.includes(t)))}const s={locale:"en",pluralForms:o(["one","other"]),select:e=>1===e?"one":"other"};function i(){const{i18n:{currentLocale:e}}=(0,r.Z)();return(0,l.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:o(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),s}}),[e])}function m(){const e=i();return{selectMessage:(t,a)=>function(e,t,a){const l=e.split("|");if(1===l.length)return l[0];l.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${l.length}: ${e}`);const r=a.select(t),n=a.pluralForms.indexOf(r);return l[Math.min(n,l.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/616ee580.e30472b0.js b/assets/js/616ee580.6ddee81a.js similarity index 90% rename from assets/js/616ee580.e30472b0.js rename to assets/js/616ee580.6ddee81a.js index d8ba808c0..9d56eec5a 100644 --- a/assets/js/616ee580.e30472b0.js +++ b/assets/js/616ee580.6ddee81a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4749],{5736:e=>{e.exports=JSON.parse('{"label":"Remove","permalink":"/references/tags/remove","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4749],{5736:e=>{e.exports=JSON.parse('{"label":"Remove","permalink":"/references/tags/remove","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/631037e5.85b42d25.js b/assets/js/631037e5.adb20c2c.js similarity index 59% rename from assets/js/631037e5.85b42d25.js rename to assets/js/631037e5.adb20c2c.js index bf35dbf81..487cd10a5 100644 --- a/assets/js/631037e5.85b42d25.js +++ b/assets/js/631037e5.adb20c2c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[801],{7064:a=>{a.exports=JSON.parse('{"label":"blog","permalink":"/blog/tags/blog","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[801],{7064:a=>{a.exports=JSON.parse('{"label":"blog","permalink":"/blog/tags/blog","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/64d03520.0c257146.js b/assets/js/64d03520.6f24231a.js similarity index 84% rename from assets/js/64d03520.0c257146.js rename to assets/js/64d03520.6f24231a.js index ad154d656..e87633a6f 100644 --- a/assets/js/64d03520.0c257146.js +++ b/assets/js/64d03520.6f24231a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1138],{2217:e=>{e.exports=JSON.parse('{"label":"requirements","permalink":"/docs/tags/requirements","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/requirements","title":"Requirements","description":"The requirements for the server specifications on which the Fleek Network Node can be installed and run.","permalink":"/docs/node/requirements"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1138],{2217:e=>{e.exports=JSON.parse('{"label":"requirements","permalink":"/docs/tags/requirements","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/requirements","title":"Requirements","description":"The requirements for the server specifications on which the Fleek Network Node can be installed and run.","permalink":"/docs/node/requirements"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/665f164c.493e219b.js b/assets/js/665f164c.493e219b.js new file mode 100644 index 000000000..9a8916e11 --- /dev/null +++ b/assets/js/665f164c.493e219b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9320],{3566:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>l,toc:()=>h});var s=n(5893),o=n(1151),i=n(3872);const r={title:"Testnet onboarding",slug:"testnet-onboarding",hide_title:!0,description:"Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.",tags:["testnet","onboarding","phases","getting started"],sidebarCollapsible:!1},a=void 0,l={id:"node/testnet-onboarding",title:"Testnet onboarding",description:"Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.",source:"@site/docs/node/testnet-onboarding.md",sourceDirName:"node",slug:"/node/testnet-onboarding",permalink:"/docs/node/testnet-onboarding",draft:!1,unlisted:!1,tags:[{label:"testnet",permalink:"/docs/tags/testnet"},{label:"onboarding",permalink:"/docs/tags/onboarding"},{label:"phases",permalink:"/docs/tags/phases"},{label:"getting started",permalink:"/docs/tags/getting-started"}],version:"current",frontMatter:{title:"Testnet onboarding",slug:"testnet-onboarding",hide_title:!0,description:"Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.",tags:["testnet","onboarding","phases","getting started"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"Requirements",permalink:"/docs/node/requirements"},next:{title:"Install",permalink:"/docs/node/install"}},d={},h=[{value:"Testnet Phase 1:",id:"testnet-phase-1",level:2},{value:"Prerequesites",id:"prerequesites",level:3},{value:"1) Install the Fleek Network Lightning CLI latest version",id:"1-install-the-fleek-network-lightning-cli-latest-version",level:3},{value:"2) Set up the Metamask browser extension",id:"2-set-up-the-metamask-browser-extension",level:3},{value:"3) Visit the faucet website",id:"3-visit-the-faucet-website",level:3},{value:"4) Connect wallet",id:"4-connect-wallet",level:3},{value:"5) Mint tFLK",id:"5-mint-tflk",level:3},{value:"6) Stake tFLK",id:"6-stake-tflk",level:3},{value:"7) Confirm the transaction on metamask",id:"7-confirm-the-transaction-on-metamask",level:3},{value:"8) Start the Node",id:"8-start-the-node",level:3},{value:"9) Confirm Node Stake",id:"9-confirm-node-stake",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"The Node fails to run after successfully stake and run? Or the Core team network restart announcement?",id:"the-node-fails-to-run-after-successfully-stake-and-run-or-the-core-team-network-restart-announcement",level:3},{value:"Node details don't show staked amount?",id:"node-details-dont-show-staked-amount",level:3}];function c(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.admonition,{title:"Important",type:"info",children:(0,s.jsxs)(t.p,{children:["The Testnet Phase ",1," has finished on Thursday, Oct. 26th. Expect to see a detailed ",(0,s.jsx)(t.a,{href:"https://blog.fleek.network",children:"blog"})," on all the results and findings from Phase ",1," the following week, as well as some info on what comes next for Fleek Network on the Road to Mainnet."]})}),"\n",(0,s.jsxs)(t.h2,{id:"testnet-phase-1",children:["Testnet Phase ",1,":"]}),"\n",(0,s.jsxs)(t.p,{children:["Following the successful completion of Fleek Network Testnet Phase ",0,", the core development team has been actively implementing the next set of core protocol functionalities, which include services, the reward's system, the broadcaster/synchronizer, as well as all identified improvements and fixes found during that phase."]}),"\n",(0,s.jsx)(t.h3,{id:"prerequesites",children:"Prerequesites"}),"\n",(0,s.jsxs)(t.p,{children:["The Testnet Phase ",1," is open to everybody. Everyone's free to join the Testnet Phase ",1,", regardless of whether they have participated in any prior testnet phase, filled any forms or whitelisting."]}),"\n",(0,s.jsxs)(t.p,{children:["The Fleek team cares about user experience and provides documentation and tools (whichever's your preference) to onboard easily and quickly. However, the Node operator's server should have the ",(0,s.jsx)(t.a,{href:"/docs/node/requirements",children:"minimum requirements"})," to set up and run a Fleek Network node."]}),"\n",(0,s.jsx)(t.p,{children:"To join, you will have to follow the steps below:"}),"\n",(0,s.jsx)(t.h3,{id:"1-install-the-fleek-network-lightning-cli-latest-version",children:"1) Install the Fleek Network Lightning CLI latest version"}),"\n",(0,s.jsxs)(t.p,{children:["Once Fleek launches the Testnet Phase ",1,", you have to install or update the Lightning CLI binary to the latest version. The instructions are available ",(0,s.jsx)(t.a,{href:"/docs/node/install",children:"here"})," where you can use an assisted installer or install it manually by following the documentation. If you already have it installed, use the update reference provided ",(0,s.jsx)(t.a,{href:"/references/Lightning%20CLI/update-cli-from-source-code",children:"here"})," or if you prefer a more step-by-step approach use the provided ",(0,s.jsx)(t.a,{href:"/guides/Node%20Operators/updating-lightning",children:"guide"}),"."]}),"\n",(0,s.jsx)(t.admonition,{title:"Warning",type:"caution",children:(0,s.jsxs)(t.p,{children:["The Testnet Phase ",1," version should only be available after the Testnet Phase ",1," is ready and announced. Since we work transparently (open-source) some users rush to install things on their own assumptions, misaligned, which causes them confusion. The Fleek Network core team is required to provide all the changes, features and tests before announcing publicly that the testnet phase is ready. Otherwise, you'll be running the process prematurely, be patient to avoid disappointment please!"]})}),"\n",(0,s.jsx)(t.h3,{id:"2-set-up-the-metamask-browser-extension",children:"2) Set up the Metamask browser extension"}),"\n",(0,s.jsxs)(t.p,{children:["Open the Metamask ",(0,s.jsx)(t.code,{children:"settings"}),", located in the drop-down (top-right menu options). Set the following property values:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["Network Name: ",(0,s.jsx)(t.code,{children:"Fleek Network Testnet"})]}),"\n",(0,s.jsxs)(t.li,{children:["RPC URL: ",(0,s.jsx)(t.code,{children:"https://rpc.testnet.fleek.network/rpc/v0"})]}),"\n",(0,s.jsxs)(t.li,{children:["Chain ID: ",(0,s.jsx)(t.code,{children:"59330"})]}),"\n",(0,s.jsxs)(t.li,{children:["Currency symbol: ",(0,s.jsx)(t.code,{children:"tFLK"})]}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Testnet FLK"})," on testnets are supposed to have no real value. Since you need Testnet ",(0,s.jsx)(t.code,{children:"FLK"})," to actually interact with Fleek Network, users get ",(0,s.jsx)(t.code,{children:"Testnet FLK"})," for free from the faucet. For clarity and simplicity we'll refer to ",(0,s.jsx)(t.code,{children:"Testnet FLK"})," as ",(0,s.jsx)(t.code,{children:"tFLK"}),"."]})}),"\n",(0,s.jsx)(t.h3,{id:"3-visit-the-faucet-website",children:"3) Visit the faucet website"}),"\n",(0,s.jsxs)(t.p,{children:["Before proceeding, make sure to have the Fleek Network selected as the metamask network. Once confirmed, visit the ",(0,s.jsx)(t.a,{href:"https://faucet.testnet.fleek.network/",children:"Faucet website"})]}),"\n",(0,s.jsx)(t.h3,{id:"4-connect-wallet",children:"4) Connect wallet"}),"\n",(0,s.jsxs)(t.p,{children:["In the ",(0,s.jsx)(t.a,{href:"https://faucet.testnet.fleek.network/",children:"Faucet website"}),", you have to click the ",(0,s.jsx)(t.code,{children:"Connect Wallet"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"5-mint-tflk",children:"5) Mint tFLK"}),"\n",(0,s.jsxs)(t.p,{children:["Once ",(0,s.jsx)(t.code,{children:"Connect Wallet"})," is ready, proceed to ",(0,s.jsx)(t.code,{children:"Mint tFLK"})," and wait until the balance of the account in your Metamask increases. You need to have ",(0,s.jsx)(t.code,{children:"tFLK"})," before proceeding. Be patient."]}),"\n",(0,s.jsx)(t.h3,{id:"6-stake-tflk",children:"6) Stake tFLK"}),"\n",(0,s.jsxs)(t.p,{children:["Once ",(0,s.jsx)(t.code,{children:"tFLK"})," balance is available, click in the ",(0,s.jsx)(t.code,{children:"Stake"})," button. You'll be required to provided the following details from your node:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Node Public Key"}),"\n",(0,s.jsx)(t.li,{children:"Consensus Public Key"}),"\n",(0,s.jsx)(t.li,{children:"Server IP Address"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["You can get the details quickly by running the ",(0,s.jsx)(t.strong,{children:"node details"})," script in the terminal connected to your machine or server where the node is set up and running, as follows:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sh",children:"curl https://get.fleek.network/node_details | bash\n"})}),"\n",(0,s.jsx)(t.p,{children:"The response should include the following details:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"\ud83e\udd16 Your server details are the following\n\nThe Node Public Key is \nThe Consensus Public Key is \nThe Node Server IP address is \n"})}),"\n",(0,s.jsx)(t.admonition,{title:"warning",type:"caution",children:(0,s.jsxs)(t.p,{children:["The output above is an example, you'll not find the actual text ",(0,s.jsx)(t.code,{children:""}),", ",(0,s.jsx)(t.code,{children:""})," but the text values (string of bits), or ",(0,s.jsx)(t.code,{children:""})," where instead you'll find a numerical ip address.\nMake sure that you copy and paste the correct values otherwise the transaction will fail!"]})}),"\n",(0,s.jsx)(t.h3,{id:"7-confirm-the-transaction-on-metamask",children:"7) Confirm the transaction on metamask"}),"\n",(0,s.jsx)(t.p,{children:"It is important to note that when transacting through Metamask, a warning message might pop up regarding gas costs, but rest assured that there won't be any deductions from your wallet balance."}),"\n",(0,s.jsx)(t.p,{children:"You'll have to wait for Metamask to confirm the transaction, which Metamask should take about 10 seconds to confirm. Although, the transaction takes under a second."}),"\n",(0,s.jsxs)(t.p,{children:["Important to note that in Testnet Phase ",1," the Epoch is set to about 30 minutes. This is the average period you'll have to wait to see any meaningful logs."]}),"\n",(0,s.jsx)(t.h3,{id:"8-start-the-node",children:"8) Start the Node"}),"\n",(0,s.jsxs)(t.p,{children:["Visit the section ",(0,s.jsx)(t.a,{href:"/docs/node/systemd-service",children:"Systemd Service"})," to learn how to enable, disable, start, stop the Systemd Service."]}),"\n",(0,s.jsx)(t.admonition,{type:"note",children:(0,s.jsxs)(t.p,{children:["The Systemd Service is setup automatically by the assisted installer, manually if you have followed the instructions provided, or the docker install. If you have a custom set up, you'll have to do the equivalent to start the node as described in the section ",(0,s.jsx)(t.a,{href:"/docs/node/systemd-service",children:"Systemd Service"}),"."]})}),"\n",(0,s.jsx)(t.p,{children:"Make sure you do a quick healthcheck:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{children:"curl https://get.fleek.network/healthcheck | bash\n"})}),"\n",(0,s.jsxs)(t.p,{children:["To learn more about healchecks read the section ",(0,s.jsx)(t.a,{href:"/docs/node/health-check",children:"here"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"9-confirm-node-stake",children:"9) Confirm Node Stake"}),"\n",(0,s.jsxs)(t.p,{children:["To confirm the Node Staked amount, you can run the ",(0,s.jsx)(t.strong,{children:"node details"})," script to get the information. The ",(0,s.jsx)(t.strong,{children:"node details"})," output will only show staked information if available, if it doesn't show staked information it means that your Node is not properly staked."]}),"\n",(0,s.jsx)(t.p,{children:"Check the Node stake by running the following command in the machine or server where the node is set up:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sh",children:"curl https://get.fleek.network/node_details | bash\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Alternatively, the Stake amount can be verified by querying the ",(0,s.jsx)(t.a,{href:"/docs/learn/the-network/#json-rpc-interface",children:"RPC-JSON API"})," method ",(0,s.jsx)(t.code,{children:"flk_get_node_info"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,s.jsx)(t.h3,{id:"the-node-fails-to-run-after-successfully-stake-and-run-or-the-core-team-network-restart-announcement",children:"The Node fails to run after successfully stake and run? Or the Core team network restart announcement?"}),"\n",(0,s.jsxs)(t.p,{children:["The Fleek Network core team might have to restart the network, for any development purposes or required updates during the Testnet Phase ",1,". If you've done this process before and is running into issues, you'll have to go into the Metamask advance settings (Metamask \u2192 Settings \u2192 Advanced) and click ",(0,s.jsx)(t.code,{children:"Clear activity and nonce data"})," or ",(0,s.jsx)(t.code,{children:"Clear Local data"}),". After doing this Metamask will clear the cache."]}),"\n",(0,s.jsx)(t.h3,{id:"node-details-dont-show-staked-amount",children:"Node details don't show staked amount?"}),"\n",(0,s.jsxs)(t.p,{children:["If you have staked successfully and the transaction details in the Metamask wallet is confirmed, but the ",(0,s.jsx)(t.strong,{children:"node details"})," script or the ",(0,s.jsx)(t.a,{href:"/docs/learn/the-network/#json-rpc-interface",children:"RPC-JSON API"})," method ",(0,s.jsx)(t.code,{children:"flk_get_node_info"})," shows an empty result, do the following:"]}),"\n",(0,s.jsx)(t.p,{children:"Metamask:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Copy the Account address at the very top of your Metamask home"}),"\n",(0,s.jsx)(t.li,{children:"Copy the Transaction ID by clicking in the tFLK transaction \u2192 Copy Transaction ID at the very top"}),"\n",(0,s.jsx)(t.li,{children:"Copy the Activity log details of the transaction"}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Server where the Node is set up:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Copy the Node Public Key"}),"\n",(0,s.jsx)(t.li,{children:"Copy the Server IP Address"}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["You can get the Node Public Key and Server IP Address quick by using the ",(0,s.jsx)(t.a,{href:"#6-stake-tflk",children:"node details"})," script described in the section."]})}),"\n",(0,s.jsxs)(t.p,{children:["Report to us by sharing the details about via our ",(0,s.jsx)(t.a,{href:"https://discord.gg/fleekxyz",children:"discord"})," troubleshooting channel."]}),"\n",(0,s.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},3872:(e,t,n)=>{n.d(t,{Z:()=>o});n(7294);var s=n(5893);const o=e=>{let{image:t,name:n,title:o,url:i,communityMember:r=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:i,target:"_blank",alt:n,children:(0,s.jsx)("img",{src:t,alt:n})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:i,target:"_blank",alt:n,children:n})}),(0,s.jsx)("span",{className:"title",children:o}),(0,s.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var s=n(7294);const o={},i=s.createContext(o);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/665f164c.eb74b7a6.js b/assets/js/665f164c.eb74b7a6.js deleted file mode 100644 index 223fbb802..000000000 --- a/assets/js/665f164c.eb74b7a6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9320],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=d(n),h=o,m=c["".concat(l,".").concat(h)]||c[h]||p[h]||r;return n?a.createElement(m,i(i({ref:t},u),{},{components:n})):a.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:o,i[1]=s;for(var d=2;d{n.d(t,{Z:()=>o});var a=n(7294);const o=e=>{let{image:t,name:n,title:o,url:r,communityMember:i=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:r,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:r,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},o),a.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},2760:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var a=n(7462),o=(n(7294),n(3905)),r=n(3872);const i={title:"Testnet onboarding",slug:"testnet-onboarding",hide_title:!0,description:"Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.",tags:["testnet","onboarding","phases","getting started"],sidebarCollapsible:!1},s=void 0,l={unversionedId:"node/testnet-onboarding",id:"node/testnet-onboarding",title:"Testnet onboarding",description:"Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.",source:"@site/docs/node/testnet-onboarding.md",sourceDirName:"node",slug:"/node/testnet-onboarding",permalink:"/docs/node/testnet-onboarding",draft:!1,tags:[{label:"testnet",permalink:"/docs/tags/testnet"},{label:"onboarding",permalink:"/docs/tags/onboarding"},{label:"phases",permalink:"/docs/tags/phases"},{label:"getting started",permalink:"/docs/tags/getting-started"}],version:"current",frontMatter:{title:"Testnet onboarding",slug:"testnet-onboarding",hide_title:!0,description:"Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.",tags:["testnet","onboarding","phases","getting started"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"Requirements",permalink:"/docs/node/requirements"},next:{title:"Install",permalink:"/docs/node/install"}},d={},u=[{value:"Testnet Phase {1}:",id:"testnet-phase-1",level:2},{value:"Prerequesites",id:"prerequesites",level:3},{value:"1) Install the Fleek Network Lightning CLI latest version",id:"1-install-the-fleek-network-lightning-cli-latest-version",level:3},{value:"2) Set up the Metamask browser extension",id:"2-set-up-the-metamask-browser-extension",level:3},{value:"3) Visit the faucet website",id:"3-visit-the-faucet-website",level:3},{value:"4) Connect wallet",id:"4-connect-wallet",level:3},{value:"5) Mint tFLK",id:"5-mint-tflk",level:3},{value:"6) Stake tFLK",id:"6-stake-tflk",level:3},{value:"7) Confirm the transaction on metamask",id:"7-confirm-the-transaction-on-metamask",level:3},{value:"8) Start the Node",id:"8-start-the-node",level:3},{value:"9) Confirm Node Stake",id:"9-confirm-node-stake",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"The Node fails to run after successfully stake and run? Or the Core team network restart announcement?",id:"the-node-fails-to-run-after-successfully-stake-and-run-or-the-core-team-network-restart-announcement",level:3},{value:"Node details don't show staked amount?",id:"node-details-dont-show-staked-amount",level:3}],c={toc:u},p="wrapper";function h(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{title:"Important",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The Testnet Phase {1} has finished on Thursday, Oct. 26th. Expect to see a detailed ",(0,o.kt)("a",{parentName:"p",href:"https://blog.fleek.network"},"blog")," on all the results and findings from Phase {1} the following week, as well as some info on what comes next for Fleek Network on the Road to Mainnet.")),(0,o.kt)("h2",{id:"testnet-phase-1"},"Testnet Phase {1}:"),(0,o.kt)("p",null,"Following the successful completion of Fleek Network Testnet Phase {0}, the core development team has been actively implementing the next set of core protocol functionalities, which include services, the reward's system, the broadcaster/synchronizer, as well as all identified improvements and fixes found during that phase."),(0,o.kt)("h3",{id:"prerequesites"},"Prerequesites"),(0,o.kt)("p",null,"The Testnet Phase {1} is open to everybody. Everyone's free to join the Testnet Phase {1}, regardless of whether they have participated in any prior testnet phase, filled any forms or whitelisting."),(0,o.kt)("p",null,"The Fleek team cares about user experience and provides documentation and tools (whichever's your preference) to onboard easily and quickly. However, the Node operator's server should have the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"minimum requirements")," to set up and run a Fleek Network node."),(0,o.kt)("p",null,"To join, you will have to follow the steps below:"),(0,o.kt)("h3",{id:"1-install-the-fleek-network-lightning-cli-latest-version"},"1) Install the Fleek Network Lightning CLI latest version"),(0,o.kt)("p",null,"Once Fleek launches the Testnet Phase {1}, you have to install or update the Lightning CLI binary to the latest version. The instructions are available ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install"},"here")," where you can use an assisted installer or install it manually by following the documentation. If you already have it installed, use the update reference provided ",(0,o.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/update-cli-from-source-code"},"here")," or if you prefer a more step-by-step approach use the provided ",(0,o.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/updating-lightning"},"guide"),"."),(0,o.kt)("admonition",{title:"Warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The Testnet Phase {1} version should only be available after the Testnet Phase {1} is ready and announced. Since we work transparently (open-source) some users rush to install things on their own assumptions, misaligned, which causes them confusion. The Fleek Network core team is required to provide all the changes, features and tests before announcing publicly that the testnet phase is ready. Otherwise, you'll be running the process prematurely, be patient to avoid disappointment please!")),(0,o.kt)("h3",{id:"2-set-up-the-metamask-browser-extension"},"2) Set up the Metamask browser extension"),(0,o.kt)("p",null,"Open the Metamask ",(0,o.kt)("inlineCode",{parentName:"p"},"settings"),", located in the drop-down (top-right menu options). Set the following property values:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Network Name: ",(0,o.kt)("inlineCode",{parentName:"li"},"Fleek Network Testnet")),(0,o.kt)("li",{parentName:"ul"},"RPC URL: ",(0,o.kt)("inlineCode",{parentName:"li"},"https://rpc.testnet.fleek.network/rpc/v0")),(0,o.kt)("li",{parentName:"ul"},"Chain ID: ",(0,o.kt)("inlineCode",{parentName:"li"},"59330")),(0,o.kt)("li",{parentName:"ul"},"Currency symbol: ",(0,o.kt)("inlineCode",{parentName:"li"},"tFLK"))),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"Testnet FLK")," on testnets are supposed to have no real value. Since you need Testnet ",(0,o.kt)("inlineCode",{parentName:"p"},"FLK")," to actually interact with Fleek Network, users get ",(0,o.kt)("inlineCode",{parentName:"p"},"Testnet FLK")," for free from the faucet. For clarity and simplicity we'll refer to ",(0,o.kt)("inlineCode",{parentName:"p"},"Testnet FLK")," as ",(0,o.kt)("inlineCode",{parentName:"p"},"tFLK"),".")),(0,o.kt)("h3",{id:"3-visit-the-faucet-website"},"3) Visit the faucet website"),(0,o.kt)("p",null,"Before proceeding, make sure to have the Fleek Network selected as the metamask network. Once confirmed, visit the ",(0,o.kt)("a",{parentName:"p",href:"https://faucet.testnet.fleek.network/"},"Faucet website")),(0,o.kt)("h3",{id:"4-connect-wallet"},"4) Connect wallet"),(0,o.kt)("p",null,"In the ",(0,o.kt)("a",{parentName:"p",href:"https://faucet.testnet.fleek.network/"},"Faucet website"),", you have to click the ",(0,o.kt)("inlineCode",{parentName:"p"},"Connect Wallet"),"."),(0,o.kt)("h3",{id:"5-mint-tflk"},"5) Mint tFLK"),(0,o.kt)("p",null,"Once ",(0,o.kt)("inlineCode",{parentName:"p"},"Connect Wallet")," is ready, proceed to ",(0,o.kt)("inlineCode",{parentName:"p"},"Mint tFLK")," and wait until the balance of the account in your Metamask increases. You need to have ",(0,o.kt)("inlineCode",{parentName:"p"},"tFLK")," before proceeding. Be patient."),(0,o.kt)("h3",{id:"6-stake-tflk"},"6) Stake tFLK"),(0,o.kt)("p",null,"Once ",(0,o.kt)("inlineCode",{parentName:"p"},"tFLK")," balance is available, click in the ",(0,o.kt)("inlineCode",{parentName:"p"},"Stake")," button. You'll be required to provided the following details from your node:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Node Public Key"),(0,o.kt)("li",{parentName:"ul"},"Consensus Public Key"),(0,o.kt)("li",{parentName:"ul"},"Server IP Address")),(0,o.kt)("p",null,"You can get the details quickly by running the ",(0,o.kt)("strong",{parentName:"p"},"node details")," script in the terminal connected to your machine or server where the node is set up and running, as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://get.fleek.network/node_details | bash\n")),(0,o.kt)("p",null,"The response should include the following details:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"\ud83e\udd16 Your server details are the following\n\nThe Node Public Key is \nThe Consensus Public Key is \nThe Node Server IP address is \n")),(0,o.kt)("admonition",{title:"warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The output above is an example, you'll not find the actual text ",(0,o.kt)("inlineCode",{parentName:"p"},""),", ",(0,o.kt)("inlineCode",{parentName:"p"},"")," but the text values (string of bits), or ",(0,o.kt)("inlineCode",{parentName:"p"},"")," where instead you'll find a numerical ip address.\nMake sure that you copy and paste the correct values otherwise the transaction will fail!")),(0,o.kt)("h3",{id:"7-confirm-the-transaction-on-metamask"},"7) Confirm the transaction on metamask"),(0,o.kt)("p",null,"It is important to note that when transacting through Metamask, a warning message might pop up regarding gas costs, but rest assured that there won't be any deductions from your wallet balance."),(0,o.kt)("p",null,"You'll have to wait for Metamask to confirm the transaction, which Metamask should take about 10 seconds to confirm. Although, the transaction takes under a second."),(0,o.kt)("p",null,"Important to note that in Testnet Phase {1} the Epoch is set to about 30 minutes. This is the average period you'll have to wait to see any meaningful logs."),(0,o.kt)("h3",{id:"8-start-the-node"},"8) Start the Node"),(0,o.kt)("p",null,"Visit the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"Systemd Service")," to learn how to enable, disable, start, stop the Systemd Service."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The Systemd Service is setup automatically by the assisted installer, manually if you have followed the instructions provided, or the docker install. If you have a custom set up, you'll have to do the equivalent to start the node as described in the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"Systemd Service"),".")),(0,o.kt)("p",null,"Make sure you do a quick healthcheck:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"curl https://get.fleek.network/healthcheck | bash\n")),(0,o.kt)("p",null,"To learn more about healchecks read the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/health-check"},"here"),"."),(0,o.kt)("h3",{id:"9-confirm-node-stake"},"9) Confirm Node Stake"),(0,o.kt)("p",null,"To confirm the Node Staked amount, you can run the ",(0,o.kt)("strong",{parentName:"p"},"node details")," script to get the information. The ",(0,o.kt)("strong",{parentName:"p"},"node details")," output will only show staked information if available, if it doesn't show staked information it means that your Node is not properly staked."),(0,o.kt)("p",null,"Check the Node stake by running the following command in the machine or server where the node is set up:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://get.fleek.network/node_details | bash\n")),(0,o.kt)("p",null,"Alternatively, the Stake amount can be verified by querying the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn/the-network/#json-rpc-interface"},"RPC-JSON API")," method ",(0,o.kt)("inlineCode",{parentName:"p"},"flk_get_node_info"),". "),(0,o.kt)("h2",{id:"troubleshooting"},"Troubleshooting"),(0,o.kt)("h3",{id:"the-node-fails-to-run-after-successfully-stake-and-run-or-the-core-team-network-restart-announcement"},"The Node fails to run after successfully stake and run? Or the Core team network restart announcement?"),(0,o.kt)("p",null,"The Fleek Network core team might have to restart the network, for any development purposes or required updates during the Testnet Phase {1}. If you've done this process before and is running into issues, you'll have to go into the Metamask advance settings (Metamask \u2192 Settings \u2192 Advanced) and click ",(0,o.kt)("inlineCode",{parentName:"p"},"Clear activity and nonce data")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"Clear Local data"),". After doing this Metamask will clear the cache."),(0,o.kt)("h3",{id:"node-details-dont-show-staked-amount"},"Node details don't show staked amount?"),(0,o.kt)("p",null,"If you have staked successfully and the transaction details in the Metamask wallet is confirmed, but the ",(0,o.kt)("strong",{parentName:"p"},"node details")," script or the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn/the-network/#json-rpc-interface"},"RPC-JSON API")," method ",(0,o.kt)("inlineCode",{parentName:"p"},"flk_get_node_info")," shows an empty result, do the following:"),(0,o.kt)("p",null,"Metamask:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Copy the Account address at the very top of your Metamask home"),(0,o.kt)("li",{parentName:"ul"},"Copy the Transaction ID by clicking in the tFLK transaction \u2192 Copy Transaction ID at the very top"),(0,o.kt)("li",{parentName:"ul"},"Copy the Activity log details of the transaction")),(0,o.kt)("p",null,"Server where the Node is set up:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Copy the Node Public Key"),(0,o.kt)("li",{parentName:"ul"},"Copy the Server IP Address")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You can get the Node Public Key and Server IP Address quick by using the ",(0,o.kt)("a",{parentName:"p",href:"#6-stake-tflk"},"node details")," script described in the section.")),(0,o.kt)("p",null,"Report to us by sharing the details about via our ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"discord")," troubleshooting channel."),(0,o.kt)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6875c492.463ee9a3.js b/assets/js/6875c492.463ee9a3.js new file mode 100644 index 000000000..8a5bd860b --- /dev/null +++ b/assets/js/6875c492.463ee9a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8610],{9703:(e,t,n)=>{n.d(t,{Z:()=>l});n(7294);var s=n(5999),a=n(2244),i=n(5893);function l(e){const{metadata:t}=e,{previousPage:n,nextPage:l}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.Z,{permalink:n,title:(0,i.jsx)(s.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),l&&(0,i.jsx)(a.Z,{permalink:l,title:(0,i.jsx)(s.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},9985:(e,t,n)=>{n.d(t,{Z:()=>l});n(7294);var s=n(9460),a=n(390),i=n(5893);function l(e){let{items:t,component:n=a.Z}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.n,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},1714:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});n(7294);var s=n(4334),a=n(5999),i=n(8824),l=n(833),r=n(5281),o=n(9960),c=n(1460),d=n(9703),g=n(197),u=n(9985),h=n(2212),p=n(2503),m=n(5893);function x(e){const t=function(){const{selectMessage:e}=(0,i.c)();return t=>e(t,(0,a.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(l.d,{title:n}),(0,m.jsx)(g.Z,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const l=x(t);return(0,m.jsxs)(c.Z,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(h.Z,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(p.Z,{as:"h1",children:l}),(0,m.jsx)(o.Z,{href:t.allTagsPath,children:(0,m.jsx)(a.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.Z,{items:n}),(0,m.jsx)(d.Z,{metadata:i})]})}function f(e){return(0,m.jsxs)(l.FG,{className:(0,s.Z)(r.k.wrapper.blogPages,r.k.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},2212:(e,t,n)=>{n.d(t,{Z:()=>h});n(7294);var s=n(4334),a=n(5999),i=n(5742),l=n(5893);function r(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,l.jsx)(a.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(i.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(5281),g=n(9047);function u(e){let{className:t}=e;return(0,l.jsx)(g.Z,{type:"caution",title:(0,l.jsx)(r,{}),className:(0,s.Z)(t,d.k.common.unlistedBanner),children:(0,l.jsx)(o,{})})}function h(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.bfbc1fdc.js b/assets/js/6875c492.bfbc1fdc.js deleted file mode 100644 index 6a72f7c50..000000000 --- a/assets/js/6875c492.bfbc1fdc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8610],{9703:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(5999),r=a(2244);function s(e){const{metadata:t}=e,{previousPage:a,nextPage:s}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,l.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(r.Z,{permalink:a,title:n.createElement(l.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),s&&n.createElement(r.Z,{permalink:s,title:n.createElement(l.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(7294),l=a(9460),r=a(390);function s(e){let{items:t,component:a=r.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(l.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},1714:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var n=a(7294),l=a(6010),r=a(5999),s=a(8824),o=a(833),i=a(5281),g=a(9960),c=a(9058),m=a(9703),p=a(197),u=a(9985);function d(e){const t=function(){const{selectMessage:e}=(0,s.c)();return t=>e(t,(0,r.I)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,r.I)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function h(e){let{tag:t}=e;const a=d(t);return n.createElement(n.Fragment,null,n.createElement(o.d,{title:a}),n.createElement(p.Z,{tag:"blog_tags_posts"}))}function b(e){let{tag:t,items:a,sidebar:l,listMetadata:s}=e;const o=d(t);return n.createElement(c.Z,{sidebar:l},n.createElement("header",{className:"margin-bottom--xl"},n.createElement("h1",null,o),n.createElement(g.Z,{href:t.allTagsPath},n.createElement(r.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),n.createElement(u.Z,{items:a}),n.createElement(m.Z,{metadata:s}))}function E(e){return n.createElement(o.FG,{className:(0,l.Z)(i.k.wrapper.blogPages,i.k.page.blogTagPostListPage)},n.createElement(h,e),n.createElement(b,e))}}}]); \ No newline at end of file diff --git a/assets/js/68b99ecd.3b517092.js b/assets/js/68b99ecd.9b719a2d.js similarity index 79% rename from assets/js/68b99ecd.3b517092.js rename to assets/js/68b99ecd.9b719a2d.js index 7fc28db8a..ce349445d 100644 --- a/assets/js/68b99ecd.3b517092.js +++ b/assets/js/68b99ecd.9b719a2d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4556],{1407:o=>{o.exports=JSON.parse('{"label":"standards","permalink":"/docs/tags/standards","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4556],{1407:o=>{o.exports=JSON.parse('{"label":"standards","permalink":"/docs/tags/standards","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/6be32138.8a943ec7.js b/assets/js/6be32138.8a943ec7.js new file mode 100644 index 000000000..a0b8883cb --- /dev/null +++ b/assets/js/6be32138.8a943ec7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3396],{3103:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var n=i(5893),o=i(1151);const r={title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]},s=void 0,a={permalink:"/blog/bloom-and-cuckoo-filters-for-cache-summarization",source:"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md",title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",date:"2023-11-01T18:03:13.000Z",formattedDate:"November 1, 2023",tags:[{label:"fleek network",permalink:"/blog/tags/fleek-network"},{label:"blog",permalink:"/blog/tags/blog"},{label:"engineering",permalink:"/blog/tags/engineering"},{label:"content routing",permalink:"/blog/tags/content-routing"}],readingTime:10.37,hasTruncateMarker:!0,authors:[{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"}],frontMatter:{title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]},unlisted:!1},l={image:i(9969).Z,authorsImageUrls:[void 0]},c=[{value:"Background",id:"background",level:2},{value:"Bloom Filters",id:"bloom-filters",level:2},{value:"Cuckoo Filters",id:"cuckoo-filters",level:2},{value:"Benchmarking",id:"benchmarking",level:2},{value:"Experimental Setup",id:"experimental-setup",level:2},{value:"Memory Footprint",id:"memory-footprint",level:2},{value:"Lookup Performance",id:"lookup-performance",level:2},{value:"Insertion Performance",id:"insertion-performance",level:2},{value:"Capacity and Scaling",id:"capacity-and-scaling",level:2},{value:"Other Filters",id:"other-filters",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"References",id:"references",level:3}];function h(e){const t={a:"a",blockquote:"blockquote",br:"br",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case."}),"\n",(0,n.jsx)(t.h2,{id:"background",children:"Background"}),"\n",(0,n.jsx)(t.p,{children:"Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing."}),"\n",(0,n.jsx)(t.p,{children:"If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content."}),"\n",(0,n.jsx)(t.p,{children:"We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction."}),"\n",(0,n.jsx)(t.h2,{id:"bloom-filters",children:"Bloom Filters"}),"\n",(0,n.jsxs)(t.p,{children:["A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries.\nThe answer to an approximate set membership query is not ",(0,n.jsx)(t.code,{children:"no"})," or ",(0,n.jsx)(t.code,{children:"yes,"})," but rather ",(0,n.jsx)(t.code,{children:"no"})," or ",(0,n.jsx)(t.code,{children:"probably."})," This ",(0,n.jsx)(t.code,{children:"probably"})," is quantified with the false positive rate."]}),"\n",(0,n.jsxs)(t.p,{children:["One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate.\nOf course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: ",(0,n.jsx)(t.code,{children:"insert"})," and ",(0,n.jsx)(t.code,{children:"contains."})]}),"\n",(0,n.jsxs)(t.p,{children:["A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions.\nThe resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren't already 1).",(0,n.jsx)(t.br,{}),"\n","To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions."]}),"\n",(0,n.jsx)(t.p,{children:"If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set."}),"\n",(0,n.jsx)(t.p,{children:"However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play."}),"\n",(0,n.jsxs)(t.p,{children:["Since we also need a ",(0,n.jsx)(t.code,{children:"remove"})," operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters.\nCounting Bloom filters retain most of the properties that regular Bloom filters have. The ",(0,n.jsx)(t.code,{children:"remove"})," operation comes at the cost of an increased memory footprint."]}),"\n",(0,n.jsx)(t.p,{children:"Each position in the array is no longer a single bit but a group of bits representing a counter.\nWhenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters."}),"\n",(0,n.jsx)(t.h2,{id:"cuckoo-filters",children:"Cuckoo Filters"}),"\n",(0,n.jsx)(t.p,{children:"Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters).\nA relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters."}),"\n",(0,n.jsxs)(t.p,{children:["They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations ",(0,n.jsx)(t.code,{children:"insert,"})," ",(0,n.jsx)(t.code,{children:"contains,"})," and ",(0,n.jsx)(t.code,{children:"remove,"})," and have configurable false positive rates."]}),"\n",(0,n.jsx)(t.p,{children:"Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets.\nWe determine two candidate buckets for each element using two different hash functions, h1 and h2."}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"contains"})," operation will check if either bucket contains the element.\nFor insertion, if either bucket is empty, the element will be inserted into the empty bucket."]}),"\n",(0,n.jsx)(t.p,{children:"If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location.\nThis may trigger another relocation if the alternate location is not empty."}),"\n",(0,n.jsx)(t.p,{children:"Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1)."}),"\n",(0,n.jsx)(t.p,{children:"Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3]."}),"\n",(0,n.jsx)(t.p,{children:"For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs."}),"\n",(0,n.jsxs)(t.p,{children:["The fingerprint size is derived from the desired false positive rate.",(0,n.jsx)(t.br,{}),"\n","A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived."]}),"\n",(0,n.jsx)(t.p,{children:"Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter."}),"\n",(0,n.jsxs)(t.p,{children:["The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.",(0,n.jsx)(t.br,{}),"\n","For a given element x, the two candidate buckets are computed as follows:"]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{src:i(9440).Z+"",width:"1324",height:"194"})}),"\n",(0,n.jsx)(t.p,{children:"An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint."}),"\n",(0,n.jsx)(t.h2,{id:"benchmarking",children:"Benchmarking"}),"\n",(0,n.jsx)(t.p,{children:"As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters."}),"\n",(0,n.jsx)(t.p,{children:"Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance."}),"\n",(0,n.jsx)(t.p,{children:"Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible."}),"\n",(0,n.jsx)(t.p,{children:"Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck."}),"\n",(0,n.jsx)(t.h2,{id:"experimental-setup",children:"Experimental Setup"}),"\n",(0,n.jsxs)(t.p,{children:["We are using our own Counting Bloom filter ",(0,n.jsx)(t.a,{href:"https://github.com/fleek-network/ursa/blob/483f4d56cbaa5e83182454d2c1db6f6af7c54912/crates/ursa-network/src/utils/bloom_filter.rs#L11",children:"implementation"})," and ",(0,n.jsx)(t.a,{href:"https://github.com/sile/scalable_cuckoo_filter?gh",children:"scalable cuckoo filter"})," Cuckoo filter implementation in Rust, the ",(0,n.jsx)(t.a,{href:"https://github.com/efficient/cuckoofilter?gh",children:"original cuckoofilter"})," implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation."]}),"\n",(0,n.jsx)(t.h2,{id:"memory-footprint",children:"Memory Footprint"}),"\n",(0,n.jsx)(t.p,{children:"For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that\nthese factors have on the memory footprint."}),"\n",(0,n.jsx)(t.p,{children:"To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1.\nThe size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1]."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{src:i(5441).Z+"",width:"640",height:"480"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient."}),"\n",(0,n.jsx)(t.p,{children:"The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1]."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{src:i(9844).Z+"",width:"640",height:"480"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"lookup-performance",children:"Lookup Performance"}),"\n",(0,n.jsx)(t.p,{children:"We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups."}),"\n",(0,n.jsx)(t.p,{children:"A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation."}),"\n",(0,n.jsx)(t.p,{children:"Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1],\nwhere Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy."}),"\n",(0,n.jsx)(t.p,{children:"However, the performance difference is negligible."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{src:i(8915).Z+"",width:"640",height:"480"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative.\nThe shaded region indicates the standard deviation."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"insertion-performance",children:"Insertion Performance"}),"\n",(0,n.jsx)(t.p,{children:"Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels.\nFig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters."}),"\n",(0,n.jsx)(t.p,{children:"For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{src:i(989).Z+"",width:"640",height:"480"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"capacity-and-scaling",children:"Capacity and Scaling"}),"\n",(0,n.jsx)(t.p,{children:"We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded.\nBloom filters and Cuckoo filters behave differently in this scenario."}),"\n",(0,n.jsxs)(t.p,{children:["For Bloom filters, the ",(0,n.jsx)(t.code,{children:"insertion"})," operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of\nrelocations that will be performed for an insertion. The ",(0,n.jsx)(t.code,{children:"insertion"})," operation will return an error if more relocations are required."]}),"\n",(0,n.jsx)(t.p,{children:"For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter."}),"\n",(0,n.jsx)(t.p,{children:"Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes."}),"\n",(0,n.jsx)(t.p,{children:"Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate."}),"\n",(0,n.jsx)(t.p,{children:"The proposed technique is also applicable to Cuckoo filters."}),"\n",(0,n.jsx)(t.h2,{id:"other-filters",children:"Other Filters"}),"\n",(0,n.jsx)(t.p,{children:"While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters."}),"\n"]}),"\n",(0,n.jsxs)(t.li,{children:["\n",(0,n.jsx)(t.p,{children:"XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(t.p,{children:"We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested."}),"\n",(0,n.jsx)(t.p,{children:"Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case."}),"\n",(0,n.jsx)(t.h3,{id:"references",children:"References"}),"\n",(0,n.jsx)(t.p,{children:"[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom.\nIn Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014."}),"\n",(0,n.jsx)(t.p,{children:"[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004."}),"\n",(0,n.jsx)(t.p,{children:"[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007."}),"\n",(0,n.jsx)(t.p,{children:"[4] Paulo S. Almeida, Carlos Baquero, Nuno Pregui\xe7a, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007."}),"\n",(0,n.jsx)(t.p,{children:"[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984."}),"\n",(0,n.jsx)(t.p,{children:"[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005."}),"\n",(0,n.jsx)(t.p,{children:"[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020."})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9969:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/bloom-79da0db687b4fb2060758838b9c44513.png"},5441:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/capacity-size-5c2576bd69db0e5b510781e7cc1c5257.png"},9844:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/fp-rate-size-fbb54b2450b4a91e28c97d8adf0253e8.png"},989:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/insert-3ff48d4c63724adcf399f81b29607691.png"},8915:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/lookup-e36011237d8602b5f6c36fe5dd145bf5.png"},9440:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/math-formul-a247d4df475b26b1e7cbb2acfc0ab8c2.png"},1151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>s});var n=i(7294);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6be32138.e604e6f4.js b/assets/js/6be32138.e604e6f4.js deleted file mode 100644 index f2b7cd040..000000000 --- a/assets/js/6be32138.e604e6f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3396],{3905:(e,t,i)=>{i.d(t,{Zo:()=>h,kt:()=>f});var o=i(7294);function n(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function r(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,o)}return i}function a(e){for(var t=1;t=0||(n[i]=e[i]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var s=o.createContext({}),c=function(e){var t=o.useContext(s),i=t;return e&&(i="function"==typeof e?e(t):a(a({},t),e)),i},h=function(e){var t=c(e.components);return o.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var i=e.components,n=e.mdxType,r=e.originalType,s=e.parentName,h=l(e,["components","mdxType","originalType","parentName"]),p=c(i),u=n,f=p["".concat(s,".").concat(u)]||p[u]||m[u]||r;return i?o.createElement(f,a(a({ref:t},h),{},{components:i})):o.createElement(f,a({ref:t},h))}));function f(e,t){var i=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=i.length,a=new Array(r);a[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,a[1]=l;for(var c=2;c{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var o=i(7462),n=(i(7294),i(3905));const r={title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]},a=void 0,l={permalink:"/blog/bloom-and-cuckoo-filters-for-cache-summarization",source:"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md",title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",date:"2023-10-31T18:15:43.000Z",formattedDate:"October 31, 2023",tags:[{label:"fleek network",permalink:"/blog/tags/fleek-network"},{label:"blog",permalink:"/blog/tags/blog"},{label:"engineering",permalink:"/blog/tags/engineering"},{label:"content routing",permalink:"/blog/tags/content-routing"}],readingTime:10.37,hasTruncateMarker:!0,authors:[{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"}],frontMatter:{title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]}},s={image:i(4221).Z,authorsImageUrls:[void 0]},c=[{value:"Background",id:"background",level:2},{value:"Bloom Filters",id:"bloom-filters",level:2},{value:"Cuckoo Filters",id:"cuckoo-filters",level:2},{value:"Benchmarking",id:"benchmarking",level:2},{value:"Experimental Setup",id:"experimental-setup",level:2},{value:"Memory Footprint",id:"memory-footprint",level:2},{value:"Lookup Performance",id:"lookup-performance",level:2},{value:"Insertion Performance",id:"insertion-performance",level:2},{value:"Capacity and Scaling",id:"capacity-and-scaling",level:2},{value:"Other Filters",id:"other-filters",level:2},{value:"Conclusion",id:"conclusion",level:2},{value:"References",id:"references",level:3}],h={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,o.Z)({},h,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case."),(0,n.kt)("h2",{id:"background"},"Background"),(0,n.kt)("p",null,"Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing."),(0,n.kt)("p",null,"If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content."),(0,n.kt)("p",null,"We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction."),(0,n.kt)("h2",{id:"bloom-filters"},"Bloom Filters"),(0,n.kt)("p",null,"A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries.\nThe answer to an approximate set membership query is not ",(0,n.kt)("inlineCode",{parentName:"p"},"no")," or ",(0,n.kt)("inlineCode",{parentName:"p"},"yes,")," but rather ",(0,n.kt)("inlineCode",{parentName:"p"},"no")," or ",(0,n.kt)("inlineCode",{parentName:"p"},"probably.")," This ",(0,n.kt)("inlineCode",{parentName:"p"},"probably")," is quantified with the false positive rate. "),(0,n.kt)("p",null,"One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate.\nOf course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: ",(0,n.kt)("inlineCode",{parentName:"p"},"insert")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"contains.")," "),(0,n.kt)("p",null,"A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions.\nThe resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren't already 1).",(0,n.kt)("br",{parentName:"p"}),"\n","To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions."),(0,n.kt)("p",null,"If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set."),(0,n.kt)("p",null,"However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play. "),(0,n.kt)("p",null,"Since we also need a ",(0,n.kt)("inlineCode",{parentName:"p"},"remove")," operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters.\nCounting Bloom filters retain most of the properties that regular Bloom filters have. The ",(0,n.kt)("inlineCode",{parentName:"p"},"remove")," operation comes at the cost of an increased memory footprint."),(0,n.kt)("p",null,"Each position in the array is no longer a single bit but a group of bits representing a counter.\nWhenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters."),(0,n.kt)("h2",{id:"cuckoo-filters"},"Cuckoo Filters"),(0,n.kt)("p",null,"Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters).\nA relatively recent addition to this class is the Cuckoo filter ","[1]",". Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters."),(0,n.kt)("p",null,"They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations ",(0,n.kt)("inlineCode",{parentName:"p"},"insert,")," ",(0,n.kt)("inlineCode",{parentName:"p"},"contains,")," and ",(0,n.kt)("inlineCode",{parentName:"p"},"remove,")," and have configurable false positive rates. "),(0,n.kt)("p",null,"Cuckoo filters are based on Cuckoo hash tables ","[2]"," and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets.\nWe determine two candidate buckets for each element using two different hash functions, h1 and h2. "),(0,n.kt)("p",null,"The ",(0,n.kt)("inlineCode",{parentName:"p"},"contains")," operation will check if either bucket contains the element.\nFor insertion, if either bucket is empty, the element will be inserted into the empty bucket."),(0,n.kt)("p",null,"If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location.\nThis may trigger another relocation if the alternate location is not empty. "),(0,n.kt)("p",null,"Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1). "),(0,n.kt)("p",null,"Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in ","[3]","."),(0,n.kt)("p",null,"For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs."),(0,n.kt)("p",null,"The fingerprint size is derived from the desired false positive rate.",(0,n.kt)("br",{parentName:"p"}),"\n","A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived."),(0,n.kt)("p",null,"Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter."),(0,n.kt)("p",null,"The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.",(0,n.kt)("br",{parentName:"p"}),"\n","For a given element x, the two candidate buckets are computed as follows: "),(0,n.kt)("p",null,(0,n.kt)("img",{src:i(9440).Z,width:"1324",height:"194"})),(0,n.kt)("p",null,"An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint."),(0,n.kt)("h2",{id:"benchmarking"},"Benchmarking"),(0,n.kt)("p",null,"As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters."),(0,n.kt)("p",null,"Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance. "),(0,n.kt)("p",null,"Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible."),(0,n.kt)("p",null,"Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck. "),(0,n.kt)("h2",{id:"experimental-setup"},"Experimental Setup"),(0,n.kt)("p",null,"We are using our own Counting Bloom filter ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/ursa/blob/483f4d56cbaa5e83182454d2c1db6f6af7c54912/crates/ursa-network/src/utils/bloom_filter.rs#L11"},"implementation")," and ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/sile/scalable_cuckoo_filter?gh"},"scalable cuckoo filter")," Cuckoo filter implementation in Rust, the ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/efficient/cuckoofilter?gh"},"original cuckoofilter")," implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation."),(0,n.kt)("h2",{id:"memory-footprint"},"Memory Footprint"),(0,n.kt)("p",null,"For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that\nthese factors have on the memory footprint. "),(0,n.kt)("p",null,"To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1.\nThe size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in ","[1]","."),(0,n.kt)("p",null,(0,n.kt)("img",{src:i(5441).Z,width:"640",height:"480"})),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.")),(0,n.kt)("p",null,"Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient."),(0,n.kt)("p",null,"The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in ","[1]","."),(0,n.kt)("p",null,(0,n.kt)("img",{src:i(9844).Z,width:"640",height:"480"})),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.")),(0,n.kt)("h2",{id:"lookup-performance"},"Lookup Performance"),(0,n.kt)("p",null,"We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups."),(0,n.kt)("p",null,"A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation. "),(0,n.kt)("p",null,"Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with ","[1]",",\nwhere Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in ","[1]"," use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy."),(0,n.kt)("p",null,"However, the performance difference is negligible."),(0,n.kt)("p",null,(0,n.kt)("img",{src:i(8915).Z,width:"640",height:"480"})),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative.\nThe shaded region indicates the standard deviation.")),(0,n.kt)("h2",{id:"insertion-performance"},"Insertion Performance"),(0,n.kt)("p",null,"Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels.\nFig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters."),(0,n.kt)("p",null,"For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching. "),(0,n.kt)("p",null,(0,n.kt)("img",{src:i(989).Z,width:"640",height:"480"})),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.")),(0,n.kt)("h2",{id:"capacity-and-scaling"},"Capacity and Scaling"),(0,n.kt)("p",null,"We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded.\nBloom filters and Cuckoo filters behave differently in this scenario."),(0,n.kt)("p",null,"For Bloom filters, the ",(0,n.kt)("inlineCode",{parentName:"p"},"insertion")," operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of\nrelocations that will be performed for an insertion. The ",(0,n.kt)("inlineCode",{parentName:"p"},"insertion")," operation will return an error if more relocations are required. "),(0,n.kt)("p",null,"For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter."),(0,n.kt)("p",null,"Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes. "),(0,n.kt)("p",null,"Fortunately, a variant of Bloom filters called Scalable Bloom Filters ","[4]"," can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate."),(0,n.kt)("p",null,"The proposed technique is also applicable to Cuckoo filters."),(0,n.kt)("h2",{id:"other-filters"},"Other Filters"),(0,n.kt)("p",null,"While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Quotient filters ","[5, 6]",": Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters. ")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"XOR filters ","[7]",": More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added. "))),(0,n.kt)("h2",{id:"conclusion"},"Conclusion"),(0,n.kt)("p",null,"We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested."),(0,n.kt)("p",null,"Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case. "),(0,n.kt)("h3",{id:"references"},"References"),(0,n.kt)("p",null,"[1]"," Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom.\nIn Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014. "),(0,n.kt)("p",null,"[2]"," Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004. "),(0,n.kt)("p",null,"[3]"," Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007. "),(0,n.kt)("p",null,"[4]"," Paulo S. Almeida, Carlos Baquero, Nuno Pregui\xe7a, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007. "),(0,n.kt)("p",null,"[5]"," John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984. "),(0,n.kt)("p",null,"[6]"," Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005. "),(0,n.kt)("p",null,"[7]"," Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020."))}m.isMDXComponent=!0},4221:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/bloom-79da0db687b4fb2060758838b9c44513.png"},5441:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/capacity-size-5c2576bd69db0e5b510781e7cc1c5257.png"},9844:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/fp-rate-size-fbb54b2450b4a91e28c97d8adf0253e8.png"},989:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/insert-3ff48d4c63724adcf399f81b29607691.png"},8915:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/lookup-e36011237d8602b5f6c36fe5dd145bf5.png"},9440:(e,t,i)=>{i.d(t,{Z:()=>o});const o=i.p+"assets/images/math-formul-a247d4df475b26b1e7cbb2acfc0ab8c2.png"}}]); \ No newline at end of file diff --git a/assets/js/6ccb158e.71a0d814.js b/assets/js/6ccb158e.5162cfe7.js similarity index 98% rename from assets/js/6ccb158e.71a0d814.js rename to assets/js/6ccb158e.5162cfe7.js index 19c2e76f3..71833f300 100644 --- a/assets/js/6ccb158e.71a0d814.js +++ b/assets/js/6ccb158e.5162cfe7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3218],{4391:e=>{e.exports=JSON.parse('{"label":"keystore","permalink":"/references/tags/keystore","allTagsPath":"/references/tags","count":4,"items":[{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3218],{4391:e=>{e.exports=JSON.parse('{"label":"keystore","permalink":"/references/tags/keystore","allTagsPath":"/references/tags","count":4,"items":[{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/6e965365.0fc782cb.js b/assets/js/6e965365.33a8784c.js similarity index 99% rename from assets/js/6e965365.0fc782cb.js rename to assets/js/6e965365.33a8784c.js index 8c4538ea1..8a8188025 100644 --- a/assets/js/6e965365.0fc782cb.js +++ b/assets/js/6e965365.33a8784c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4679],{8472:e=>{e.exports=JSON.parse('{"label":"references","permalink":"/references/tags/references","allTagsPath":"/references/tags","count":10,"items":[{"id":"index","title":"About references","description":"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.","permalink":"/references/"},{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","permalink":"/references/Lightning CLI/error-building-on-arm64"},{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"},{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4679],{8472:e=>{e.exports=JSON.parse('{"label":"references","permalink":"/references/tags/references","allTagsPath":"/references/tags","count":10,"items":[{"id":"index","title":"About references","description":"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.","permalink":"/references/"},{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","permalink":"/references/Lightning CLI/error-building-on-arm64"},{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"},{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/6f8964f3.0f47a8ee.js b/assets/js/6f8964f3.a1c6e6fd.js similarity index 93% rename from assets/js/6f8964f3.0f47a8ee.js rename to assets/js/6f8964f3.a1c6e6fd.js index 32327fa92..9bed61653 100644 --- a/assets/js/6f8964f3.0f47a8ee.js +++ b/assets/js/6f8964f3.a1c6e6fd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7536],{9430:e=>{e.exports=JSON.parse('{"label":"Fleek Network","permalink":"/guides/tags/fleek-network","allTagsPath":"/guides/tags","count":1,"items":[{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","permalink":"/guides/"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7536],{9430:e=>{e.exports=JSON.parse('{"label":"Fleek Network","permalink":"/guides/tags/fleek-network","allTagsPath":"/guides/tags","count":1,"items":[{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","permalink":"/guides/"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/719c0fd7.9b552829.js b/assets/js/719c0fd7.6c3d8003.js similarity index 82% rename from assets/js/719c0fd7.9b552829.js rename to assets/js/719c0fd7.6c3d8003.js index c255ca36a..e964b4bef 100644 --- a/assets/js/719c0fd7.9b552829.js +++ b/assets/js/719c0fd7.6c3d8003.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[706],{6419:e=>{e.exports=JSON.parse('{"label":"permissions","permalink":"/references/tags/permissions","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/permission-denied-os-error-13","title":"Permission denied (os error 13)","description":"Ownership and file permissions","permalink":"/references/Lightning CLI/permission-denied-os-error-13"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[706],{6419:e=>{e.exports=JSON.parse('{"label":"permissions","permalink":"/references/tags/permissions","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/permission-denied-os-error-13","title":"Permission denied (os error 13)","description":"Ownership and file permissions","permalink":"/references/Lightning CLI/permission-denied-os-error-13"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/749619b5.778e9505.js b/assets/js/749619b5.eabd0923.js similarity index 94% rename from assets/js/749619b5.778e9505.js rename to assets/js/749619b5.eabd0923.js index a9ce43754..e70765dab 100644 --- a/assets/js/749619b5.778e9505.js +++ b/assets/js/749619b5.eabd0923.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6362],{5294:e=>{e.exports=JSON.parse('{"label":"ownership","permalink":"/references/tags/ownership","allTagsPath":"/references/tags","count":3,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"},{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6362],{5294:e=>{e.exports=JSON.parse('{"label":"ownership","permalink":"/references/tags/ownership","allTagsPath":"/references/tags","count":3,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"},{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/74ec46b4.45c490ed.js b/assets/js/74ec46b4.5a8f5ef0.js similarity index 84% rename from assets/js/74ec46b4.45c490ed.js rename to assets/js/74ec46b4.5a8f5ef0.js index d287deb0d..086e07416 100644 --- a/assets/js/74ec46b4.45c490ed.js +++ b/assets/js/74ec46b4.5a8f5ef0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1263],{1337:a=>{a.exports=JSON.parse('{"label":"wizard","permalink":"/docs/tags/wizard","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1263],{1337:a=>{a.exports=JSON.parse('{"label":"wizard","permalink":"/docs/tags/wizard","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/75d8af72.de071f8d.js b/assets/js/75d8af72.0db0b71a.js similarity index 70% rename from assets/js/75d8af72.de071f8d.js rename to assets/js/75d8af72.0db0b71a.js index 90bf217e1..17581ed16 100644 --- a/assets/js/75d8af72.de071f8d.js +++ b/assets/js/75d8af72.0db0b71a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1474],{1187:a=>{a.exports=JSON.parse('{"label":"diagnostic","permalink":"/docs/tags/diagnostic","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/analyzing-logs","title":"Analyzing logs","description":"Analyzing Logs","permalink":"/docs/node/analyzing-logs"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1474],{1187:s=>{s.exports=JSON.parse('{"label":"diagnostic","permalink":"/docs/tags/diagnostic","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/analyzing-logs","title":"Analyzing logs","description":"Analyzing Logs","permalink":"/docs/node/analyzing-logs"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/763344b9.ca82c87e.js b/assets/js/763344b9.3fc871db.js similarity index 85% rename from assets/js/763344b9.ca82c87e.js rename to assets/js/763344b9.3fc871db.js index f172d58df..b28ecec09 100644 --- a/assets/js/763344b9.ca82c87e.js +++ b/assets/js/763344b9.3fc871db.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5094],{5772:e=>{e.exports=JSON.parse('{"label":"toolkit","permalink":"/docs/tags/toolkit","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5094],{5772:e=>{e.exports=JSON.parse('{"label":"toolkit","permalink":"/docs/tags/toolkit","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/779cc1e8.bbdd63a1.js b/assets/js/779cc1e8.b5e33d5d.js similarity index 91% rename from assets/js/779cc1e8.bbdd63a1.js rename to assets/js/779cc1e8.b5e33d5d.js index 210170fcb..aed0aa349 100644 --- a/assets/js/779cc1e8.bbdd63a1.js +++ b/assets/js/779cc1e8.b5e33d5d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4],{761:e=>{e.exports=JSON.parse('{"label":"update","permalink":"/references/tags/update","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4],{761:e=>{e.exports=JSON.parse('{"label":"update","permalink":"/references/tags/update","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7874.f6f729a5.js b/assets/js/7874.f6f729a5.js new file mode 100644 index 000000000..4890dc338 --- /dev/null +++ b/assets/js/7874.f6f729a5.js @@ -0,0 +1 @@ +(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7874],{9047:(e,t,n)=>{"use strict";n.d(t,{Z:()=>E});var s=n(7294),o=n(5893);function a(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:a.length>0?(0,o.jsx)(o.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}var c=n(4334),i=n(5999),r=n(5281);const l={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:t,className:n,children:s}=e;return(0,o.jsx)("div",{className:(0,c.Z)(r.k.common.admonition,r.k.common.admonitionType(t),l.admonition,n),children:s})}function u(e){let{icon:t,title:n}=e;return(0,o.jsxs)("div",{className:l.admonitionHeading,children:[(0,o.jsx)("span",{className:l.admonitionIcon,children:t}),n]})}function m(e){let{children:t}=e;return t?(0,o.jsx)("div",{className:l.admonitionContent,children:t}):null}function h(e){const{type:t,icon:n,title:s,children:a,className:c}=e;return(0,o.jsxs)(d,{type:t,className:c,children:[(0,o.jsx)(u,{title:s,icon:n}),(0,o.jsx)(m,{children:a})]})}function p(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const f={icon:(0,o.jsx)(p,{}),title:(0,o.jsx)(i.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,o.jsx)(h,{...f,...e,className:(0,c.Z)("alert alert--secondary",e.className),children:e.children})}function x(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const j={icon:(0,o.jsx)(x,{}),title:(0,o.jsx)(i.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function b(e){return(0,o.jsx)(h,{...j,...e,className:(0,c.Z)("alert alert--success",e.className),children:e.children})}function v(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,o.jsx)(v,{}),title:(0,o.jsx)(i.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function k(e){return(0,o.jsx)(h,{...N,...e,className:(0,c.Z)("alert alert--info",e.className),children:e.children})}function y(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const C={icon:(0,o.jsx)(y,{}),title:(0,o.jsx)(i.Z,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function B(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const w={icon:(0,o.jsx)(B,{}),title:(0,o.jsx)(i.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const Z={icon:(0,o.jsx)(y,{}),title:(0,o.jsx)(i.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const L={...{note:g,tip:b,info:k,warning:function(e){return(0,o.jsx)(h,{...C,...e,className:(0,c.Z)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(h,{...w,...e,className:(0,c.Z)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(g,{title:"secondary",...e}),important:e=>(0,o.jsx)(k,{title:"important",...e}),success:e=>(0,o.jsx)(b,{title:"success",...e}),caution:function(e){return(0,o.jsx)(h,{...Z,...e,className:(0,c.Z)("alert alert--warning",e.className),children:e.children})}}};function E(e){const t=a(e),n=(s=t.type,L[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),L.info));var s;return(0,o.jsx)(n,{...t})}},4881:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});n(7294);var s=n(5999),o=n(5281),a=n(9960),c=n(4334);const i={iconEdit:"iconEdit_Z9Sw"};var r=n(5893);function l(e){let{className:t,...n}=e;return(0,r.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,c.Z)(i.iconEdit,t),"aria-hidden":"true",...n,children:(0,r.jsx)("g",{children:(0,r.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,r.jsxs)(a.Z,{to:t,className:o.k.common.editThisPage,children:[(0,r.jsx)(l,{}),(0,r.jsx)(s.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}},2459:(e,t,n)=>{"use strict";n.d(t,{Z:()=>oe});var s=n(7294),o=n(1151),a=n(5742),c=n(2389),i=n(4334),r=n(2949),l=n(6668);function d(){const{prism:e}=(0,l.L)(),{colorMode:t}=(0,r.I)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(5281),m=n(7594),h=n.n(m);const p=/title=(?["'])(?.*?)\1/,f=/\{(?<range>[\d,-]+)\}/,g={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"},lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""}};function x(e,t){const n=e.map((e=>{const{start:n,end:s}=g[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function j(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:o,metastring:a}=t;if(a&&f.test(a)){const e=a.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return x(["js","jsBlock"],t);case"jsx":case"tsx":return x(["js","jsBlock","jsx"],t);case"html":return x(["js","jsBlock","html"],t);case"python":case"py":case"bash":return x(["bash"],t);case"markdown":case"md":return x(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return x(["tex"],t);case"lua":case"haskell":case"sql":return x(["lua"],t);case"wasm":return x(["wasm"],t);default:return x(Object.keys(g).filter((e=>!["lua","wasm","tex","latex","matlab"].includes(e))),t)}}(s,o),i=n.split("\n"),r=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<i.length;){const e=i[h].match(c);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));l[t]?r[l[t]].range+=`${h},`:d[t]?r[d[t]].start=h:u[t]&&(r[u[t]].range+=`${r[u[t]].start}-${h-1},`),i.splice(h,1)}n=i.join("\n");const m={};return Object.entries(r).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const b={codeBlockContainer:"codeBlockContainer_Ckt0"};var v=n(5893);function N(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,o]=e;const a=t[s];a&&"string"==typeof o&&(n[a]=o)})),n}(d());return(0,v.jsx)(t,{...n,style:s,className:(0,i.Z)(n.className,b.codeBlockContainer,u.k.common.codeBlock)})}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function y(e){let{children:t,className:n}=e;return(0,v.jsx)(N,{as:"pre",tabIndex:0,className:(0,i.Z)(k.codeBlockStandalone,"thin-scrollbar",n),children:(0,v.jsx)("code",{className:k.codeBlockLines,children:t})})}var C=n(902);const B={attributes:!0,characterData:!0,childList:!0,subtree:!0};function w(e,t){const[n,o]=(0,s.useState)(),a=(0,s.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,s.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=B);const o=(0,C.zX)(t),a=(0,C.Ql)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,a),()=>t.disconnect()}),[e,o,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var Z=n(204);const L={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function E(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:o,getTokenProps:a}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=o({line:t,className:(0,i.Z)(n,s&&L.codeLine)}),r=t.map(((e,t)=>(0,v.jsx)("span",{...a({token:e,key:t})},t)));return(0,v.jsxs)("span",{...c,children:[s?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)("span",{className:L.codeLineNumber}),(0,v.jsx)("span",{className:L.codeLineContent,children:r})]}):r,(0,v.jsx)("br",{})]})}var _=n(5999);function T(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function S(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[o,a]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),r=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),o=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let i=!1;try{i=document.execCommand("copy")}catch{}s.remove(),c&&(a.removeAllRanges(),a.addRange(c)),o&&o.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,v.jsx)("button",{type:"button","aria-label":o?(0,_.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,_.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,_.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,z.copyButton,o&&z.copyButtonCopied),onClick:r,children:(0,v.jsxs)("span",{className:z.copyButtonIcons,"aria-hidden":"true",children:[(0,v.jsx)(T,{className:z.copyButtonIcon}),(0,v.jsx)(S,{className:z.copyButtonSuccessIcon})]})})}function A(e){return(0,v.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,v.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const M={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function H(e){let{className:t,onClick:n,isEnabled:s}=e;const o=(0,_.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,v.jsx)("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,s&&M.wordWrapButtonEnabled),"aria-label":o,title:o,children:(0,v.jsx)(A,{className:M.wordWrapButtonIcon,"aria-hidden":"true"})})}function R(e){let{children:t,className:n="",metastring:o,title:a,showLineNumbers:c,language:r}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.L)(),h=function(e){return e?.toLowerCase()}(r??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),g=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),a=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),i=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");o(n)}),[a]);return w(a,i),(0,s.useEffect)((()=>{i()}),[e,i]),(0,s.useEffect)((()=>(window.addEventListener("resize",i,{passive:!0}),()=>{window.removeEventListener("resize",i)})),[i]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),x=function(e){return e?.match(p)?.groups.title??""}(o)||a,{lineClassNames:b,code:y}=j(t,{metastring:o,language:h,magicComments:m}),C=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return(0,v.jsxs)(N,{as:"div",className:(0,i.Z)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[x&&(0,v.jsx)("div",{className:k.codeBlockTitle,children:x}),(0,v.jsxs)("div",{className:k.codeBlockContent,children:[(0,v.jsx)(Z.y$,{theme:f,code:y,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:o,getTokenProps:a}=e;return(0,v.jsx)("pre",{tabIndex:0,ref:g.codeBlockRef,className:(0,i.Z)(t,k.codeBlock,"thin-scrollbar"),style:n,children:(0,v.jsx)("code",{className:(0,i.Z)(k.codeBlockLines,C&&k.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,v.jsx)(E,{line:e,getLineProps:o,getTokenProps:a,classNames:b[t],showLineNumbers:C},t)))})})}}),(0,v.jsxs)("div",{className:k.buttonGroup,children:[(g.isEnabled||g.isCodeScrollable)&&(0,v.jsx)(H,{className:k.codeButton,onClick:()=>g.toggle(),isEnabled:g.isEnabled}),(0,v.jsx)(I,{className:k.codeButton,code:y})]})]})]})}function V(e){let{children:t,...n}=e;const o=(0,c.Z)(),a=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof a?R:y;return(0,v.jsx)(i,{...n,children:a},String(o))}var W=n(9960);var $=n(7459),P=n(6043);const q={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function D(e){return!!e&&("SUMMARY"===e.tagName||D(e.parentElement))}function O(e,t){return!!e&&(e===t||O(e.parentElement,t))}function F(e){let{summary:t,children:n,...o}=e;const a=(0,c.Z)(),i=(0,s.useRef)(null),{collapsed:r,setCollapsed:l}=(0,P.u)({initialState:!o.open}),[d,u]=(0,s.useState)(o.open),m=s.isValidElement(t)?t:(0,v.jsx)("summary",{children:t??"Details"});return(0,v.jsxs)("details",{...o,ref:i,open:d,"data-collapsed":r,className:(0,$.Z)(q.details,a&&q.isBrowser,o.className),onMouseDown:e=>{D(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;D(t)&&O(t,i.current)&&(e.preventDefault(),r?(l(!1),u(!0)):l(!0))},children:[m,(0,v.jsx)(P.z,{lazy:!1,collapsed:r,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{l(e),u(!e)},children:(0,v.jsx)("div",{className:q.collapsibleContent,children:n})})]})}const G={details:"details_b_Ee"},U="alert alert--info";function J(e){let{...t}=e;return(0,v.jsx)(F,{...t,className:(0,i.Z)(U,G.details,t.className)})}function Q(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),o=(0,v.jsx)(v.Fragment,{children:t.filter((e=>e!==n))});return(0,v.jsx)(J,{...e,summary:n,children:o})}var X=n(2503);function Y(e){return(0,v.jsx)(X.Z,{...e})}const K={containsTaskList:"containsTaskList_mC6p"};function ee(e){if(void 0!==e)return(0,i.Z)(e,e?.includes("contains-task-list")&&K.containsTaskList)}const te={img:"img_ev3q"};var ne=n(9047);const se={Head:a.Z,details:Q,Details:Q,code:function(e){return s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))?(0,v.jsx)("code",{...e}):(0,v.jsx)(V,{...e})},a:function(e){return(0,v.jsx)(W.Z,{...e})},pre:function(e){return(0,v.jsx)(v.Fragment,{children:e.children})},ul:function(e){return(0,v.jsx)("ul",{...e,className:ee(e.className)})},img:function(e){return(0,v.jsx)("img",{loading:"lazy",...e,className:(t=e.className,(0,i.Z)(t,te.img))});var t},h1:e=>(0,v.jsx)(Y,{as:"h1",...e}),h2:e=>(0,v.jsx)(Y,{as:"h2",...e}),h3:e=>(0,v.jsx)(Y,{as:"h3",...e}),h4:e=>(0,v.jsx)(Y,{as:"h4",...e}),h5:e=>(0,v.jsx)(Y,{as:"h5",...e}),h6:e=>(0,v.jsx)(Y,{as:"h6",...e}),admonition:ne.Z,mermaid:()=>null};function oe(e){let{children:t}=e;return(0,v.jsx)(o.Z,{components:se,children:t})}},2244:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(7294);var s=n(4334),o=n(9960),a=n(5893);function c(e){const{permalink:t,title:n,subLabel:c,isNext:i}=e;return(0,a.jsxs)(o.Z,{className:(0,s.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[c&&(0,a.jsx)("div",{className:"pagination-nav__sublabel",children:c}),(0,a.jsx)("div",{className:"pagination-nav__label",children:n})]})}},3008:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});n(7294);var s=n(4334),o=n(9960);const a={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var c=n(5893);function i(e){let{permalink:t,label:n,count:i}=e;return(0,c.jsxs)(o.Z,{href:t,className:(0,s.Z)(a.tag,i?a.tagWithCount:a.tagRegular),children:[n,i&&(0,c.jsx)("span",{children:i})]})}},1526:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});n(7294);var s=n(4334),o=n(5999),a=n(3008);const c={tags:"tags_jXut",tag:"tag_QGVx"};var i=n(5893);function r(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(o.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.Z)(c.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:n}=e;return(0,i.jsx)("li",{className:c.tag,children:(0,i.jsx)(a.Z,{label:t,permalink:n})},n)}))})]})}},7594:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,o,a]=t;if(s&&a){s=parseInt(s),a=parseInt(a);const e=s<a?1:-1;"-"!==o&&".."!==o&&"\u2025"!==o||(a+=e);for(let t=s;t!==a;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},1151:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i,a:()=>c});var s=n(7294);const o={},a=s.createContext(o);function c(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/79055aff.6c794010.js b/assets/js/79055aff.33b2b3c8.js similarity index 91% rename from assets/js/79055aff.6c794010.js rename to assets/js/79055aff.33b2b3c8.js index e21639753..dcd1a36b1 100644 --- a/assets/js/79055aff.6c794010.js +++ b/assets/js/79055aff.33b2b3c8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8256],{92:s=>{s.exports=JSON.parse('{"label":"logs","permalink":"/docs/tags/logs","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/analyzing-logs","title":"Analyzing logs","description":"Analyzing Logs","permalink":"/docs/node/analyzing-logs"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8256],{92:s=>{s.exports=JSON.parse('{"label":"logs","permalink":"/docs/tags/logs","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/analyzing-logs","title":"Analyzing logs","description":"Analyzing Logs","permalink":"/docs/node/analyzing-logs"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7aba1839.091e2e6b.js b/assets/js/7aba1839.8f38c854.js similarity index 84% rename from assets/js/7aba1839.091e2e6b.js rename to assets/js/7aba1839.8f38c854.js index 7745afedd..8c9117c4d 100644 --- a/assets/js/7aba1839.091e2e6b.js +++ b/assets/js/7aba1839.8f38c854.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[554],{7177:e=>{e.exports=JSON.parse('{"label":"ports","permalink":"/docs/tags/ports","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[554],{7177:e=>{e.exports=JSON.parse('{"label":"ports","permalink":"/docs/tags/ports","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7aefc753.cdd60b24.js b/assets/js/7aefc753.cdd60b24.js new file mode 100644 index 000000000..92d1d5267 --- /dev/null +++ b/assets/js/7aefc753.cdd60b24.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1251],{8717:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>g,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=t(5893),s=t(1151),l=t(3872);const r={title:"Uninstall Lightning Node",slug:"uninstall-lightning-node",hide_title:!0,tags:["References","Help","Uninstall","Remove","Delete","Clear","Clean"]},a=void 0,o={id:"Lightning CLI/uninstall-lightning-node",title:"Uninstall Lightning Node",description:"Remove symLink",source:"@site/references/Lightning CLI/uninstall-lightning-node.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/uninstall-lightning-node",permalink:"/references/Lightning CLI/uninstall-lightning-node",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/uninstall-lightning-node.md",tags:[{label:"References",permalink:"/references/tags/references"},{label:"Help",permalink:"/references/tags/help"},{label:"Uninstall",permalink:"/references/tags/uninstall"},{label:"Remove",permalink:"/references/tags/remove"},{label:"Delete",permalink:"/references/tags/delete"},{label:"Clear",permalink:"/references/tags/clear"},{label:"Clean",permalink:"/references/tags/clean"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Uninstall Lightning Node",slug:"uninstall-lightning-node",hide_title:!0,tags:["References","Help","Uninstall","Remove","Delete","Clear","Clean"]},sidebar:"defaultSidebar",previous:{title:"Restore the keystore",permalink:"/references/Lightning CLI/restore-the-keystore"},next:{title:"Update CLI from source code",permalink:"/references/Lightning CLI/update-cli-from-source-code"}},c={},d=[{value:"Remove symLink",id:"remove-symlink",level:2},{value:"Delete the local source code",id:"delete-the-local-source-code",level:2},{value:"Disable the systemd service",id:"disable-the-systemd-service",level:2},{value:"Clear the lightning config directory",id:"clear-the-lightning-config-directory",level:2},{value:"Uninstall Cargo and Rust",id:"uninstall-cargo-and-rust",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"remove-symlink",children:"Remove symLink"}),"\n",(0,i.jsxs)(n.p,{children:["To remove a symbolic link, use either the rm or unlink command followed by the name of the symlink as an argument. Here's an example with ",(0,i.jsx)(n.code,{children:"unlink"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"unlink /usr/local/bin/lgtn\n"})}),"\n",(0,i.jsx)(n.h2,{id:"delete-the-local-source-code",children:"Delete the local source code"}),"\n",(0,i.jsxs)(n.p,{children:["Delete the local source code which was copied from the remote ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"repository"}),". You can delete it recursively by:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"rm -r ~/fleek-network/lightning\n"})}),"\n",(0,i.jsxs)(n.p,{children:["\ud83d\udca1 Use the flag ",(0,i.jsx)(n.code,{children:"f"})," to force remove by skipping any prompts, e.g. ",(0,i.jsx)(n.code,{children:"rm -rf <PATHNAME>"})]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["The default install location is ",(0,i.jsx)(n.code,{children:"$HOME/fleek-network/lightning"}),". If you have selected a different location to store the repository, change the target path."]})}),"\n",(0,i.jsx)(n.h2,{id:"disable-the-systemd-service",children:"Disable the systemd service"}),"\n",(0,i.jsx)(n.p,{children:"To disable the Fleek Network Lightning Systemd's service, start by stopping the service."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo systemctl stop lightning.service\n"})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["You can replace ",(0,i.jsx)(n.code,{children:"lightning.service"})," by ",(0,i.jsx)(n.code,{children:"lightning"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Disable the lightning service"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo systemctl disable lightning.service\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If you have used the recommended procedures in the ",(0,i.jsx)(n.a,{href:"/docs/node/install",children:"install"})," documentation you'll have to remove the Systemd unit (file that defines the service)."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"rm /etc/systemd/system/lightning.service\n"})}),"\n",(0,i.jsx)(n.p,{children:"Reload the Systemd service daemon"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,i.jsx)(n.h2,{id:"clear-the-lightning-config-directory",children:"Clear the lightning config directory"}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network lightning config directory is where the configuration, keystore\u2013the location where your private key is hosted\u2013and other system files are stored."}),"\n",(0,i.jsx)(n.admonition,{title:"WARNING",type:"caution",children:(0,i.jsx)(n.p,{children:"Make sure to back up any sensitive data, such as the keystore (private keys), as you won't be able to recover the keys by any other means. If you have any funds associated with it, it'll be lost forever. The Fleek Network team or anyone else will not be able to help recover keys. Your keys, your responsibility."})}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, instead of deleting you can move the files to a custom directory name such as",(0,i.jsx)(n.code,{children:".lightning.backupDATESTAMP"}),", e.g. the example below we've used the date ",(0,i.jsx)(n.code,{children:"2023-09-06-1205"})," as that was the time this text was written:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"mv ~/.lightning ~/.lightning.backup202309061205\n"})}),"\n",(0,i.jsx)(n.p,{children:"To clear the lightning config directory remove any files recursively by running the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"rm -r ~/.lightning/*\n"})}),"\n",(0,i.jsxs)(n.p,{children:["\ud83d\udca1 Use the flag ",(0,i.jsx)(n.code,{children:"f"})," to force remove by skipping any prompts, e.g. ",(0,i.jsx)(n.code,{children:"rm -rf <PATHNAME>/*"})]}),"\n",(0,i.jsxs)(n.p,{children:["Alternatively, delete the ",(0,i.jsx)(n.code,{children:"~/.lightning"})," directory:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"rm -r ~/.lightning\n"})}),"\n",(0,i.jsx)(n.h2,{id:"uninstall-cargo-and-rust",children:"Uninstall Cargo and Rust"}),"\n",(0,i.jsx)(n.p,{children:"To uninstall rustc, rustup and cargo run the following command:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-sh",children:"rustup self uninstall\n"})}),"\n",(0,i.jsx)(l.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function g(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>s});t(7294);var i=t(5893);const s=e=>{let{image:n,name:t,title:s,url:l,communityMember:r=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:l,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:l,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:s}),(0,i.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>r});var i=t(7294);const s={},l=i.createContext(s);function r(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7aefc753.f5cd3448.js b/assets/js/7aefc753.f5cd3448.js deleted file mode 100644 index 72ee33ea9..000000000 --- a/assets/js/7aefc753.f5cd3448.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1251],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(7294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){l(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,l=function(e,t){if(null==e)return{};var n,r,l={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},m="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),m=c(n),d=l,g=m["".concat(s,".").concat(d)]||m[d]||u[d]||a;return n?r.createElement(g,i(i({ref:t},p),{},{components:n})):r.createElement(g,i({ref:t},p))}));function g(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var a=n.length,i=new Array(a);i[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[m]="string"==typeof e?e:l,i[1]=o;for(var c=2;c<a;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},7707:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),l=(n(7294),n(3905)),a=n(3872);const i={title:"Uninstall Lightning Node",slug:"uninstall-lightning-node",hide_title:!0,tags:["References","Help","Uninstall","Remove","Delete","Clear","Clean"]},o=void 0,s={unversionedId:"Lightning CLI/uninstall-lightning-node",id:"Lightning CLI/uninstall-lightning-node",title:"Uninstall Lightning Node",description:"Remove symLink",source:"@site/references/Lightning CLI/uninstall-lightning-node.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/uninstall-lightning-node",permalink:"/references/Lightning CLI/uninstall-lightning-node",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/uninstall-lightning-node.md",tags:[{label:"References",permalink:"/references/tags/references"},{label:"Help",permalink:"/references/tags/help"},{label:"Uninstall",permalink:"/references/tags/uninstall"},{label:"Remove",permalink:"/references/tags/remove"},{label:"Delete",permalink:"/references/tags/delete"},{label:"Clear",permalink:"/references/tags/clear"},{label:"Clean",permalink:"/references/tags/clean"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Uninstall Lightning Node",slug:"uninstall-lightning-node",hide_title:!0,tags:["References","Help","Uninstall","Remove","Delete","Clear","Clean"]},sidebar:"defaultSidebar",previous:{title:"Restore the keystore",permalink:"/references/Lightning CLI/restore-the-keystore"},next:{title:"Update CLI from source code",permalink:"/references/Lightning CLI/update-cli-from-source-code"}},c={},p=[{value:"Remove symLink",id:"remove-symlink",level:2},{value:"Delete the local source code",id:"delete-the-local-source-code",level:2},{value:"Disable the systemd service",id:"disable-the-systemd-service",level:2},{value:"Clear the lightning config directory",id:"clear-the-lightning-config-directory",level:2},{value:"Uninstall Cargo and Rust",id:"uninstall-cargo-and-rust",level:2}],m={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,l.kt)(u,(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"remove-symlink"},"Remove symLink"),(0,l.kt)("p",null,"To remove a symbolic link, use either the rm or unlink command followed by the name of the symlink as an argument. Here's an example with ",(0,l.kt)("inlineCode",{parentName:"p"},"unlink"),":"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"unlink /usr/local/bin/lgtn\n")),(0,l.kt)("h2",{id:"delete-the-local-source-code"},"Delete the local source code"),(0,l.kt)("p",null,"Delete the local source code which was copied from the remote ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"repository"),". You can delete it recursively by:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"rm -r ~/fleek-network/lightning\n")),(0,l.kt)("p",null,"\ud83d\udca1 Use the flag ",(0,l.kt)("inlineCode",{parentName:"p"},"f")," to force remove by skipping any prompts, e.g. ",(0,l.kt)("inlineCode",{parentName:"p"},"rm -rf <PATHNAME>")),(0,l.kt)("admonition",{type:"note"},(0,l.kt)("p",{parentName:"admonition"},"The default install location is ",(0,l.kt)("inlineCode",{parentName:"p"},"$HOME/fleek-network/lightning"),". If you have selected a different location to store the repository, change the target path.")),(0,l.kt)("h2",{id:"disable-the-systemd-service"},"Disable the systemd service"),(0,l.kt)("p",null,"To disable the Fleek Network Lightning Systemd's service, start by stopping the service."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl stop lightning.service\n")),(0,l.kt)("admonition",{type:"tip"},(0,l.kt)("p",{parentName:"admonition"},"You can replace ",(0,l.kt)("inlineCode",{parentName:"p"},"lightning.service")," by ",(0,l.kt)("inlineCode",{parentName:"p"},"lightning"),".")),(0,l.kt)("p",null,"Disable the lightning service"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl disable lightning.service\n")),(0,l.kt)("p",null,"If you have used the recommended procedures in the ",(0,l.kt)("a",{parentName:"p",href:"/docs/node/install"},"install")," documentation you'll have to remove the Systemd unit (file that defines the service)."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"rm /etc/systemd/system/lightning.service\n")),(0,l.kt)("p",null,"Reload the Systemd service daemon"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,l.kt)("h2",{id:"clear-the-lightning-config-directory"},"Clear the lightning config directory"),(0,l.kt)("p",null,"The Fleek Network lightning config directory is where the configuration, keystore\u2013the location where your private key is hosted\u2013and other system files are stored."),(0,l.kt)("admonition",{title:"WARNING",type:"caution"},(0,l.kt)("p",{parentName:"admonition"},"Make sure to back up any sensitive data, such as the keystore (private keys), as you won't be able to recover the keys by any other means. If you have any funds associated with it, it'll be lost forever. The Fleek Network team or anyone else will not be able to help recover keys. Your keys, your responsibility.")),(0,l.kt)("p",null,"Alternatively, instead of deleting you can move the files to a custom directory name such as",(0,l.kt)("inlineCode",{parentName:"p"},".lightning.backupDATESTAMP"),", e.g. the example below we've used the date ",(0,l.kt)("inlineCode",{parentName:"p"},"2023-09-06-1205")," as that was the time this text was written:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"mv ~/.lightning ~/.lightning.backup202309061205\n")),(0,l.kt)("p",null,"To clear the lightning config directory remove any files recursively by running the following command:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"rm -r ~/.lightning/*\n")),(0,l.kt)("p",null,"\ud83d\udca1 Use the flag ",(0,l.kt)("inlineCode",{parentName:"p"},"f")," to force remove by skipping any prompts, e.g. ",(0,l.kt)("inlineCode",{parentName:"p"},"rm -rf <PATHNAME>/*")),(0,l.kt)("p",null,"Alternatively, delete the ",(0,l.kt)("inlineCode",{parentName:"p"},"~/.lightning")," directory:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"rm -r ~/.lightning\n")),(0,l.kt)("h2",{id:"uninstall-cargo-and-rust"},"Uninstall Cargo and Rust"),(0,l.kt)("p",null,"To uninstall rustc, rustup and cargo run the following command:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-sh"},"rustup self uninstall\n")),(0,l.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}d.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(7294);const l=e=>{let{image:t,name:n,title:l,url:a,communityMember:i=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:a,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:a,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},l),r.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/7b667a7f.ae55a2ab.js b/assets/js/7b667a7f.8a480976.js similarity index 89% rename from assets/js/7b667a7f.ae55a2ab.js rename to assets/js/7b667a7f.8a480976.js index 0c31a5aa3..1ea62074f 100644 --- a/assets/js/7b667a7f.ae55a2ab.js +++ b/assets/js/7b667a7f.8a480976.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5649],{5274:t=>{t.exports=JSON.parse('{"label":"git","permalink":"/docs/tags/git","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5649],{5274:t=>{t.exports=JSON.parse('{"label":"git","permalink":"/docs/tags/git","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7b788087.328863f6.js b/assets/js/7b788087.8948d3eb.js similarity index 94% rename from assets/js/7b788087.328863f6.js rename to assets/js/7b788087.8948d3eb.js index e64690521..c98b9f728 100644 --- a/assets/js/7b788087.328863f6.js +++ b/assets/js/7b788087.8948d3eb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9062],{6149:e=>{e.exports=JSON.parse('{"label":"keys","permalink":"/guides/tags/keys","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9062],{6149:e=>{e.exports=JSON.parse('{"label":"keys","permalink":"/guides/tags/keys","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7b9de75f.0ebd6f32.js b/assets/js/7b9de75f.61af48f1.js similarity index 86% rename from assets/js/7b9de75f.0ebd6f32.js rename to assets/js/7b9de75f.61af48f1.js index 43459d88f..8933510cc 100644 --- a/assets/js/7b9de75f.0ebd6f32.js +++ b/assets/js/7b9de75f.61af48f1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6353],{6378:e=>{e.exports=JSON.parse('{"label":"healthcheck","permalink":"/docs/tags/healthcheck","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","permalink":"/docs/node/health-check"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6353],{6378:e=>{e.exports=JSON.parse('{"label":"healthcheck","permalink":"/docs/tags/healthcheck","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","permalink":"/docs/node/health-check"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/7ceaa645.42ff94cb.js b/assets/js/7ceaa645.42ff94cb.js new file mode 100644 index 000000000..814bf3a17 --- /dev/null +++ b/assets/js/7ceaa645.42ff94cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[387],{7767:(e,n,t)=>{t.d(n,{ZP:()=>o});var i=t(5893),r=t(1151);function s(e){const n={admonition:"admonition",code:"code",h3:"h3",li:"li",p:"p",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully."}),"\n",(0,i.jsx)(n.p,{children:"We reserve the following top level ranges:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["TCP: ",(0,i.jsx)(n.code,{children:"4200-4299"})]}),"\n",(0,i.jsxs)(n.li,{children:["UDP: ",(0,i.jsx)(n.code,{children:"4300-4399"})]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each service in the node has 10 ports reserved within each range."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node."})}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["For the Node Operators who opt to run the ",(0,i.jsx)(n.code,{children:"get.fleek.network"})," assisted installer, the ports are verified if in use."]})}),"\n",(0,i.jsx)(n.p,{children:"The Node process requires the following ports:"}),"\n",(0,i.jsxs)(n.h3,{id:"connection-pool-4x00-4x09",children:["Connection Pool (",(0,i.jsx)(n.code,{children:"4x00-4x09"}),")"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Netkit QUIC: ",(0,i.jsx)(n.code,{children:"4300 (UDP)"})]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"consensus-4x10-4x19",children:["Consensus (",(0,i.jsx)(n.code,{children:"4x10-4x19"}),")"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Mempool: ",(0,i.jsx)(n.code,{children:"4210 (TCP)"})]}),"\n",(0,i.jsxs)(n.li,{children:["Primary: ",(0,i.jsx)(n.code,{children:"4310 (UDP)"})]}),"\n",(0,i.jsxs)(n.li,{children:["Worker: ",(0,i.jsx)(n.code,{children:"4311 (UDP)"})]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"handshake-4x20-4x29",children:["Handshake (",(0,i.jsx)(n.code,{children:"4x20-4x29"}),")"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["HTTP: ",(0,i.jsx)(n.code,{children:"4220 (TCP)"})]}),"\n",(0,i.jsxs)(n.li,{children:["TCP: ",(0,i.jsx)(n.code,{children:"4221 (TCP)"})]}),"\n",(0,i.jsxs)(n.li,{children:["WebRTC: ",(0,i.jsx)(n.code,{children:"4320 (UDP)"})]}),"\n",(0,i.jsxs)(n.li,{children:["WebTransport: ",(0,i.jsx)(n.code,{children:"4321 (UDP)"})]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"rpc-4x30-4x39",children:["RPC (",(0,i.jsx)(n.code,{children:"4x30-4x39"}),")"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["HTTP: ",(0,i.jsx)(n.code,{children:"4230 (TCP)"})]}),"\n",(0,i.jsx)(n.li,{children:"WebSocket / WebTransport?"}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"dht-4x40-4x49",children:["DHT (",(0,i.jsx)(n.code,{children:"4x40-4x49"}),")"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["UDP: ",(0,i.jsx)(n.code,{children:"4340 (UDP)"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"broadcast",children:"Broadcast"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Uses connection pool"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"blockstore-server",children:"Blockstore Server"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Uses connection pool"}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"required",type:"caution",children:(0,i.jsx)(n.p,{children:"The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports."})})]})}function o(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(s,{...e})}):s(e)}},155:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var i=t(5893),r=t(1151),s=t(3872),o=t(7767);const a={title:"The Network",slug:"the-network",hide_title:!0,description:"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.",tags:["protocol","architecture","permissionless","decentralization","consensus","algorithms","snarks","rpc","reputation","ports"],sidebarCollapsible:!1},l=void 0,d={id:"learn/the-network",title:"The Network",description:"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.",source:"@site/docs/learn/the-network.md",sourceDirName:"learn",slug:"/learn/the-network",permalink:"/docs/learn/the-network",draft:!1,unlisted:!1,tags:[{label:"protocol",permalink:"/docs/tags/protocol"},{label:"architecture",permalink:"/docs/tags/architecture"},{label:"permissionless",permalink:"/docs/tags/permissionless"},{label:"decentralization",permalink:"/docs/tags/decentralization"},{label:"consensus",permalink:"/docs/tags/consensus"},{label:"algorithms",permalink:"/docs/tags/algorithms"},{label:"snarks",permalink:"/docs/tags/snarks"},{label:"rpc",permalink:"/docs/tags/rpc"},{label:"reputation",permalink:"/docs/tags/reputation"},{label:"ports",permalink:"/docs/tags/ports"}],version:"current",frontMatter:{title:"The Network",slug:"the-network",hide_title:!0,description:"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.",tags:["protocol","architecture","permissionless","decentralization","consensus","algorithms","snarks","rpc","reputation","ports"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"Introduction",permalink:"/docs/learn/introduction"},next:{title:"Delivery Acknowledgements",permalink:"/docs/learn/delivery-acknowledgements"}},h={},c=[{value:"Protocol",id:"protocol",level:2},{value:"The Consensus algorithm",id:"the-consensus-algorithm",level:2},{value:"The Edge Network",id:"the-edge-network",level:2},{value:"Incentives and rewards",id:"incentives-and-rewards",level:2},{value:"Delivery Acknowledgements (SNARKs)",id:"delivery-acknowledgements-snarks",level:2},{value:"Reputation system",id:"reputation-system",level:2},{value:"Actors and their roles",id:"actors-and-their-roles",level:2},{value:"Client",id:"client",level:3},{value:"Developer",id:"developer",level:3},{value:"End-user",id:"end-user",level:3},{value:"Node operator",id:"node-operator",level:3},{value:"Multi-Service Support",id:"multi-service-support",level:2},{value:"Abstraction and build blocks",id:"abstraction-and-build-blocks",level:2},{value:"Modular architecture",id:"modular-architecture",level:2},{value:"Repository",id:"repository",level:3},{value:"Directory structure",id:"directory-structure",level:3},{value:"Interfaces",id:"interfaces",level:3},{value:"Identity on the Fleek Network",id:"identity-on-the-fleek-network",level:2},{value:"Content addressability and verifiability",id:"content-addressability-and-verifiability",level:2},{value:"Immutability",id:"immutability",level:3},{value:"Content addressing",id:"content-addressing",level:3},{value:"Hash functions",id:"hash-functions",level:3},{value:"Interplanetary linked data (IPLD)",id:"interplanetary-linked-data-ipld",level:3},{value:"Content Addressable aRchive (CAR)",id:"content-addressable-archive-car",level:3},{value:"HTTP PUT Request Origin",id:"http-put-request-origin",level:3},{value:"Binary process",id:"binary-process",level:2},{value:"Ports",id:"ports",level:3},{value:"JSON-RPC Interface",id:"json-rpc-interface",level:3}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"protocol",children:"Protocol"}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network is designed to deliver computation cheaper, faster and more efficiently than existing cloud providers by allowing anyone to offer computer resources for rewards. Including, secured information about who requested it on the network."}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network is a proof-of-stake protocol, that takes advantage of Ethereum for staking, payments, governance and other economic features."}),"\n",(0,i.jsx)(n.p,{children:"This is achieved by a combination of SNARKs (Succinct Non-interactive Argument of Knowledge), Narwhal and Bullshark consensus, including other cryptographic and economic guarantees to achieve a trustless decentralized and long-term sustainable environment."}),"\n",(0,i.jsx)(n.p,{children:"It's important to keep track of these components to ensure that the system is running fairly. The protocol holds the state for the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Token Balances"}),"\n",(0,i.jsx)(n.li,{children:"Staking details"}),"\n",(0,i.jsx)(n.li,{children:"The Node Reputation"}),"\n",(0,i.jsx)(n.li,{children:"Data on how much work a Node has performed in a given epoch"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"As a decentralized network, the state of these is replicated across all of the distributed nodes in the network by forming a blockchain, in which consensus on transactions transmutes to the final immutable state."}),"\n",(0,i.jsx)(n.h2,{id:"the-consensus-algorithm",children:"The Consensus algorithm"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://arxiv.org/abs/2105.11827",children:"Narwhal"})," and ",(0,i.jsx)(n.a,{href:"https://arxiv.org/abs/2209.05633",children:"Bullshark"}),", are high-performant mempool and consensus engines by ",(0,i.jsx)(n.a,{href:"https://github.com/MystenLabs",children:"Mysten Labs"}),". The Fleek Network uses Narwhal as a DAG-mempool for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The primary transactions being ordered by the consensus algorithm is the batch of Delivery Acknowledgements stored in a local list of transactions before commitment to the blockchain (memory pool)."})}),"\n",(0,i.jsx)(n.p,{children:"The Narwhal algorithm is based on the separation between the dissemination and transaction ordering to achieve high throughput in the blockchain system. The protocol achieves reliable dissemination and storage of causal histories of transactions. Narwhal tolerates an asynchronous network and maintains high performance despite failures."}),"\n",(0,i.jsx)(n.p,{children:"Bullshark is a zero-message overhead consensus algorithm that handles transactions that require total ordering (linear ordering), and synchronization of the transactions between nodes and the global network state."}),"\n",(0,i.jsx)(n.p,{children:"To put it simply, where Narwhal ensures data is submitted to consensus, Bullshark sorts out the order of the data."}),"\n",(0,i.jsx)(n.admonition,{title:"Total ordering",type:"tip",children:(0,i.jsx)(n.p,{children:"Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked Node at the end of every epoch (about 24 hours). The integrity is met due to the Node rotation that occurs at each period, reducing risks associated with Nodes being compromised and affecting the committee purity. In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining Nodes."})}),"\n",(0,i.jsx)(n.h2,{id:"the-edge-network",children:"The Edge Network"}),"\n",(0,i.jsx)(n.p,{children:"Edge computing is about processing data at the closest point of interaction, while cloud computing is about processing data in a data center."}),"\n",(0,i.jsx)(n.p,{children:"Instead of resolving requests in the cloud, where roundtrip times are noticeable due to latency, the processing of requests is done at your closest convenience, which means getting you a quicker response and a better user experience."}),"\n",(0,i.jsx)(n.p,{children:"Fleek Network's Edge computing is computing that's done at the speediest location to the user. Provided by Network Nodes that are favorably dispersed and operated by a diverse community."}),"\n",(0,i.jsx)(n.p,{children:"The community members host and operate the Network Nodes, which form the Edge Platform, and contribute to an autonomous and decentralized network of web services."}),"\n",(0,i.jsx)(n.p,{children:"Some of the resources provided by the network nodes are:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Disk Storage"}),"\n",(0,i.jsx)(n.li,{children:"Processing power (CPU Units)"}),"\n",(0,i.jsx)(n.li,{children:"Network bandwidth"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The Edge Network aims to provide computational resources where a user most needs them."}),"\n",(0,i.jsx)(n.h2,{id:"incentives-and-rewards",children:"Incentives and rewards"}),"\n",(0,i.jsx)(n.p,{children:"Fleek Network issues FLK\u2013an ERC-20 fungible token created using the Ethereum Blockchain\u2013which Node operators must stake to perform work on the network. On the other hand, developers and clients use stablecoins in a fair exchange for the commodities and resources consumed on the network."}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"caution",children:(0,i.jsx)(n.p,{children:"A Node Operator has to stake FLK to have a node participate in the Network. A node without FLK staken is referred to as a stakeless node. A stakeless node cannot contribute or participate in the network, as there would be no way to punish them for malicious behavior. Thus, all fully operational nodes in the network, without exception, have a stake."})}),"\n",(0,i.jsx)(n.p,{children:"A node is a process that runs on a machine that provides resources to the network. The resources are packaged as commodities. For instance:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Availability / Up-time"}),"\n",(0,i.jsx)(n.li,{children:"Bandwidth"}),"\n",(0,i.jsx)(n.li,{children:"CPU"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"These commodities are exchanged fairly and pricing is decided by the ecosystem and network governance. To ensure a stable and predictable income stream, the rewards awarded to Node Operators are predetermined at a stable rate (USD)."}),"\n",(0,i.jsx)(n.p,{children:"Service providers are rewarded in many ways, for instance, by fulfilling cache requests per bandwidth, and sharing cached data with other peers\u2013as an incentive for a shared economy, therefore the more bandwidth served, the more tokens received."}),"\n",(0,i.jsx)(n.p,{children:"When an epoch ends, which is about 24 hours, the rewards from all submitted Delivery Acknowledgements are distributed to the edge nodes."}),"\n",(0,i.jsx)(n.h2,{id:"delivery-acknowledgements-snarks",children:"Delivery Acknowledgements (SNARKs)"}),"\n",(0,i.jsx)(n.p,{children:"A Delivery Acknowledgement is a signed message by a client attesting that a node has successfully delivered a task to the client. These acknowledgements are instantly finalized locally and irreversible by the client."}),"\n",(0,i.jsx)(n.p,{children:"The Delivery Acknowledgements are cryptographically secured and tamper-proof, meaning that the transaction contains irrefutable details about all parts involved in the transaction."}),"\n",(0,i.jsx)(n.p,{children:"A Delivery Acknowledgement includes metadata about the commodities consumed by a node while executing or running a service. Also contains metadata that is used to determine the reward attributed to a Node."}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsx)(n.p,{children:"A Node provides the computational resources to the network and keeps track of doings in a list of Delivery Acknowledgements, on which the rewards' mechanism is based at the end of each Epoch (about 24 hours)."})}),"\n",(0,i.jsxs)(n.p,{children:["Finally, Delivery Acknowledgements are gathered and batched by nodes before being submitted to the core protocol and committee as described in the ",(0,i.jsx)(n.a,{href:"#consensus",children:"consensus"})," section."]}),"\n",(0,i.jsxs)(n.p,{children:["To learn more, visit the section ",(0,i.jsx)(n.a,{href:"/docs/learn/delivery-acknowledgements",children:"Delivery Acknowledgements"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"reputation-system",children:"Reputation system"}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network has a reputation system where nodes rate each other. The ratings are collected timely and an aggregation algorithm calculates the overall rate for each node at the end of every epoch."}),"\n",(0,i.jsx)(n.p,{children:"Noteworthy, any reputation system that depends on players attributing rates to each other can be exploited. For prevention, a custom version of the EigenTrust algorithm is used to reduce dishonest and incorrect measurements."}),"\n",(0,i.jsx)(n.p,{children:"Some other procedures where a node is rated are on the interactions between nodes while servicing. Meaning that a node earns a rate per service interaction."}),"\n",(0,i.jsx)(n.p,{children:"The information is replicated across the network securely and cannot be tampered with and is a valuable and reliable source of knowledge for optimization tasks."}),"\n",(0,i.jsx)(n.p,{children:"A few optimization tasks include:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Optimizing the network flow"}),"\n",(0,i.jsx)(n.li,{children:"Assigning services to nodes"}),"\n",(0,i.jsx)(n.li,{children:"Determining proximity"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The reputation system is used to determine the service routing and work allocation."}),"\n",(0,i.jsx)(n.h2,{id:"actors-and-their-roles",children:"Actors and their roles"}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network is a system where actors play important roles, namely:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Client"}),"\n",(0,i.jsx)(n.li,{children:"Developer"}),"\n",(0,i.jsx)(n.li,{children:"End-user"}),"\n",(0,i.jsx)(n.li,{children:"Node Operator"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Each of these users has a huge role in contributing and participating in the network. They make it possible and lively by requesting resources, through usage, payments or by simply being a plain member of the community."}),"\n",(0,i.jsx)(n.h3,{id:"client",children:"Client"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Client"})," is a user that consumes data from the network, for instance:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A developer interested in using the CDN in an application"}),"\n",(0,i.jsx)(n.li,{children:"A media publisher wanting to accelerate access to media assets"}),"\n",(0,i.jsx)(n.li,{children:"A system administrator looking for instructions to troubleshoot the client library"}),"\n",(0,i.jsx)(n.li,{children:"A Solutions Architect looking for a quick overview of an alternative service for a centralized provider"}),"\n",(0,i.jsx)(n.li,{children:"Instructions to install and use the client library"}),"\n",(0,i.jsx)(n.li,{children:"A Web developer looking to decentralize an API service"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"A client is a paying customer for the commodities and resources consumed on the network, e.g. a CDN service customer who pays for bandwidth use, etc."}),"\n",(0,i.jsx)(n.p,{children:"This type of user can:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Top up the account to have enough credit to exchange for service"}),"\n",(0,i.jsx)(n.li,{children:"Check the balance"}),"\n",(0,i.jsx)(n.li,{children:"Check the cost(s) of the service(s)"}),"\n",(0,i.jsx)(n.li,{children:"Many others (relative to the service offering that might be of a third-party provider)"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"developer",children:"Developer"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.strong,{children:"Developer"})," is a knowledgeable user that enables the business logic and end-to-end experience to the ",(0,i.jsx)(n.strong,{children:"end-user"})," through applications or services. Take, for example:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Protocol development contributor"}),"\n",(0,i.jsx)(n.li,{children:"Service creator"}),"\n",(0,i.jsx)(n.li,{children:"Client library user"}),"\n",(0,i.jsx)(n.li,{children:"Contributions to the client libraries and tools"}),"\n",(0,i.jsx)(n.li,{children:"The library method and parameters references"}),"\n",(0,i.jsx)(n.li,{children:"Versions and features support"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"A developer is often described as a builder who enables the end-to-end experience in the Fleek Network. A builder that can work at the Service provider level, protocol development, core contributor and, amongst others, at a higher level, such as providing support and integrations of services in applications or third-party systems."}),"\n",(0,i.jsx)(n.h3,{id:"end-user",children:"End-user"}),"\n",(0,i.jsxs)(n.p,{children:["An ",(0,i.jsx)(n.strong,{children:"End-user"})," is someone to whom the data or computation output is ultimately delivered, amongst others:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Static assets, such as images rendered on a website"}),"\n",(0,i.jsx)(n.li,{children:"Image optimization output for a very particular size request"}),"\n",(0,i.jsx)(n.li,{children:"Server-side rendering"}),"\n",(0,i.jsx)(n.li,{children:"Data response provided via HTTP Gateway or RPC"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The service outputs are for the ",(0,i.jsx)(n.strong,{children:"end-user"}),", but payment for the service is the responsibility of the ",(0,i.jsx)(n.strong,{children:"client"})," that manages the application or service the ",(0,i.jsx)(n.strong,{children:"end-user"})," interacts with."]}),"\n",(0,i.jsx)(n.h3,{id:"node-operator",children:"Node operator"}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.strong,{children:"Node Operator"})," is a kind of system administrator who builds, configures, installs or maintains a node(s) in a server. To mention a few use cases:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Builds the node binary from source-code"}),"\n",(0,i.jsx)(n.li,{children:"Updates the source-code repository, which node is built on"}),"\n",(0,i.jsx)(n.li,{children:"Runs the installation wizard to setup a node"}),"\n",(0,i.jsx)(n.li,{children:"Installs the node manually"}),"\n",(0,i.jsx)(n.li,{children:"Configures the node"}),"\n",(0,i.jsx)(n.li,{children:"Secures the server"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network works as a distributed system of nodes where each node operates and contributes to the system\u2019s overall health and functionality with computational resources by network operation demand."}),"\n",(0,i.jsx)(n.p,{children:"Nodes are set up to run on servers by operators. Operators are system administrators who build, configure, install and maintain the nodes in a server. Generally, a node is installed and runs on a computer or virtual private server (VPS) lent by a cloud service provider."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"A server is a computer machine where a Node runs and can be located anywhere in the world."})}),"\n",(0,i.jsx)(n.p,{children:"The Node Operator is a critical system actor that is incentivized to manage one or many nodes. Ultimately making the Fleek Network what is about, a decentralized orchestration layer and infrastructure."}),"\n",(0,i.jsx)(n.p,{children:"Any individual who's interested in learning can become a Node Operator by reading the documentation, or content made available by the network core team and community."}),"\n",(0,i.jsx)(n.h2,{id:"multi-service-support",children:"Multi-Service Support"}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network provides a base layer as the foundation of many Services. Simplicity at its core, it handles Proof-of-delivery and other client-node exchanges, such as user balance and rewards."}),"\n",(0,i.jsx)(n.p,{children:"It's designed to allow anyone to create and deploy a custom service to the network, without the need for anyone's permission. The protocol slashing mechanisms help deter malicious behavior and penalize dishonest participants while allowing the service, a modular unit, to operate at maximum availability and performance."}),"\n",(0,i.jsx)(n.p,{children:"Within a diverse ecosystem where node operators are free to choose which services to run, e.g. an operator might find popular services more appealing economically. Thus, the network is nonhomogenous, made up of different types of resource servers, requirements and services."}),"\n",(0,i.jsx)(n.h2,{id:"abstraction-and-build-blocks",children:"Abstraction and build blocks"}),"\n",(0,i.jsx)(n.p,{children:"Abstraction is conceptually useful in decentralized and distributed web service development because of how incredibly complex it can become and the speed at which developers have to react to the outside world. The core team put most of the complexity into well-defined building blocks."}),"\n",(0,i.jsx)(n.p,{children:"The building blocks provide you with enough level of detail that the modern developer experience demands but with cryptographic, economical and security assurances for confident service development, amongst others."}),"\n",(0,i.jsx)(n.p,{children:"The Fleek Network implementation is open source and freely available for consultation and contribution when more detail or refinement is required by the community and other observers."}),"\n",(0,i.jsx)(n.h2,{id:"modular-architecture",children:"Modular architecture"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"Lightning"})," is the repository name containing the Fleek multi-service Edge Network implementation."]}),"\n",(0,i.jsxs)(n.p,{children:["The project aims to provide a higher focus on engineering productivity from the get-go, an improvement over the original ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/ursa",children:"Ursa"})," implementation, which was exclusively focused on CDN, one of many services Lightning offers support."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Lightning is the open-source Rust implementation of Fleek Network. The repository contains the source code for the implementation of Fleek Network at ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"https://github.com/fleek-network/lightning"}),"."]})}),"\n",(0,i.jsx)(n.p,{children:"Some of the main differences from Ursa\u2019s implementation are:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The dynamic service loading approach"}),"\n",(0,i.jsx)(n.li,{children:"Decoupling of the network's core from the service implementation"}),"\n",(0,i.jsx)(n.li,{children:"Higher-level architecture that makes it easier to maintain and within reach of external contributors."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Lightning\u2019s development approach is more open, which allows the community to build services and also helps the core team work on other features or services in parallel."}),"\n",(0,i.jsx)(n.h3,{id:"repository",children:"Repository"}),"\n",(0,i.jsxs)(n.p,{children:["The repository contains the source code for the implementation of the Fleek Network and is located at ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"https://github.com/fleek-network/lightning"}),", a private repository that will go public after the whitepaper announcement and roadmap."]}),"\n",(0,i.jsx)(n.h3,{id:"directory-structure",children:"Directory structure"}),"\n",(0,i.jsxs)(n.p,{children:["There are three top-level directories, namely ",(0,i.jsx)(n.code,{children:"lib"}),", ",(0,i.jsx)(n.code,{children:"core"})," and ",(0,i.jsx)(n.code,{children:"services"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Lib - These are open-source libraries created to help tackle the project features and packaged with a friendly license in the Rust ecosystem (MIT, Apache)."}),"\n",(0,i.jsxs)(n.p,{children:["Core - The primary protocol implementation, where ",(0,i.jsx)(n.code,{children:"node"})," crate contains the essential feature set or base functionality. Includes the ",(0,i.jsx)(n.code,{children:"interfaces"})," crate, where the top-down specification of the project is located."]}),"\n",(0,i.jsx)(n.p,{children:"Services - A Service is a business logic provider built with the SDK (Service Development Kit). A service is decoupled from the core of the network and loaded dynamically [1] during the runtime using FFI (foreigner function interface)."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"draco\n\u251c\u2500\u2500 lib\n\u2502 \u251c\u2500\u2500 affair\n\u2502 \u251c\u2500\u2500 atomo\n\u2502 \u2514\u2500\u2500 blake3-tree\n\u251c\u2500\u2500 core\n\u2502 \u251c\u2500\u2500 node\n\u2502 \u251c\u2500\u2500 interfaces\n\u2502 \u251c\u2500\u2500 application\n\u2502 \u251c\u2500\u2500 blockstore\n\u2502 \u251c\u2500\u2500 consensus\n\u2502 \u251c\u2500\u2500 handshake\n\u2502 \u251c\u2500\u2500 identity\n\u2502 \u251c\u2500\u2500 origin-arweave\n\u2502 \u251c\u2500\u2500 origin-filecoin\n\u2502 \u251c\u2500\u2500 origin-ipfs\n\u2502 \u251c\u2500\u2500 pod\n\u2502 \u251c\u2500\u2500 reputation\n\u2502 \u251c\u2500\u2500 rpc\n\u2502 \u2514\u2500\u2500 sdk\n\u2514\u2500\u2500 services\n \u2514\u2500\u2500 cdn\n"})}),"\n",(0,i.jsx)(n.h3,{id:"interfaces",children:"Interfaces"}),"\n",(0,i.jsx)(n.p,{children:"The design pattern adopted for this software is highly inspired by the Object-Oriented model described by Alan Kay, which may be a bit different from OOP which grew to fame due to Java."}),"\n",(0,i.jsx)(n.p,{children:"In a nutshell, this is similar to the same idea, and we represent different units of computation and process as objects that communicate with each other by message passing."}),"\n",(0,i.jsx)(n.h2,{id:"identity-on-the-fleek-network",children:"Identity on the Fleek Network"}),"\n",(0,i.jsx)(n.p,{children:"The identity on the Fleek Network is issued and controlled by individuals, which means that there aren't any central entities that issue, manage or control it for you. An identity is created without permission from anyone, and stored securely and privately."}),"\n",(0,i.jsx)(n.admonition,{type:"caution",children:(0,i.jsx)(n.p,{children:"Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility."})}),"\n",(0,i.jsx)(n.p,{children:"The types of Identities found in the Fleek Network are used for:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Node (for BFT DAG consensus)"}),"\n",(0,i.jsx)(n.li,{children:"Node Network (for fast communication signatures)"}),"\n",(0,i.jsx)(n.li,{children:"Account Owner (any actor holding a balance on Fleek Network)"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The Public-key cryptography used in the network identities are the following curves:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"BLS12-381 is a pairing-friendly elliptic curve construction from the BLS family"}),"\n",(0,i.jsx)(n.li,{children:"Ed25519 is the EdDSA signature scheme using SHA-512 (SHA-2) and Curve25519"}),"\n",(0,i.jsx)(n.li,{children:"Secp256k1 is the Elliptic Curve Digital Signature Algorithm (ECDSA) used by Bitcoin and Ethereum"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The identities are associated with the elliptic curves as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A Node key (ConsensusPublicKey) is BLS12-381 which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates"}),"\n",(0,i.jsx)(n.li,{children:"A Node Networking key (NodePublicKey) is Ed25519 used for the speed and performance of the network communications"}),"\n",(0,i.jsx)(n.li,{children:"Account Owner keys are based on secp256k1, which corresponds to an Ethereum Address"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Transactions can be signed by the Account Owner\u2014an Ethereum key (secp256k1) owned by the user on an external wallet and initially required to bridge assets from L2\u2014and Node identities"}),"\n",(0,i.jsx)(n.p,{children:"Node Networking with Narwhal utilizes the Node Network key (Ed25519) is much more efficient when dealing with a single signature instead of aggregated signatures."}),"\n",(0,i.jsx)(n.h2,{id:"content-addressability-and-verifiability",children:"Content addressability and verifiability"}),"\n",(0,i.jsx)(n.p,{children:"The way content is distributed, handled and stored defines how trustworthy's a protocol. Some of the primitives to achieve it has roots in linked data, immutability, verification and the semantic web."}),"\n",(0,i.jsxs)(n.p,{children:["On Fleek Network, you either hint about data packed into a format called a Content Archive (CAR) or an existing CID of a CAR file\u2014which hash addresses are unique and universally addressable. The network never stores data, only a cache layer to existing storage as origins. For example, on ",(0,i.jsx)(n.code,{children:"HTTP PUT"})," we're just telling the network that there's some origin it should care about and cache."]}),"\n",(0,i.jsx)(n.p,{children:"Some of the principles that help us provide guarantees to end-users require a high ability for content verification, as a consequence, the immutability of files is critical to the system."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"To emphasize, immutability means the state of not changing, or being unable to change!"})}),"\n",(0,i.jsx)(n.h3,{id:"immutability",children:"Immutability"}),"\n",(0,i.jsx)(n.p,{children:"Fleek Network deals with files in a manner where the content determines the address in which the user of the system can locate and verify it unquestionably. This is possible due to cryptography, in which the same data always produces the same hash deterministically."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A file whose content determines the hash, but is also impossible to invert it"}),"\n",(0,i.jsx)(n.li,{children:"Unable to reconstruct data from a hash"}),"\n",(0,i.jsx)(n.li,{children:"It's unique, not two files produce the same file or content"}),"\n",(0,i.jsx)(n.li,{children:"Any change in the content should always generate a completely different hash"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:'In retrospect, what we have on the web today are files accessible via a URL address and the problem with this approach is that the content is not intrinsically tight to the address e.g. the content can change and the URL remains the same. That is the problematic way we access files on the web today, which we call "Location addressing", and the way we solve it for the web of tomorrow is called "Content addressing".'}),"\n",(0,i.jsx)(n.h3,{id:"content-addressing",children:"Content addressing"}),"\n",(0,i.jsx)(n.p,{children:"Content addressing is where we use a hash to access the content, and it allows us to verify that the content we received is the content we asked for. For this, we use a special hash called CID (Content Identifier), a cryptography hash function that maps input of arbitrary size to the output of a fixed size\u2014the content identifiers are short, regardless of the size of the content, and the address does not tell us where the content is stored."}),"\n",(0,i.jsx)(n.p,{children:"The entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability."}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"The CID is a sort of string-like binary that is human-friendlier in comparison to the underlying binary, which is way longer."})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"Caching and deduplication are possible due to the immutability of content e.g. if content changes, let's say that an image has some new detail, the files share many of the same bytes. The amount of data we have to transfer to fetch is minimum, we'd only pull the difference. In today's web, we'd have to transfer both files in full, which is a worse path on resource allocation and performance."})}),"\n",(0,i.jsx)(n.h3,{id:"hash-functions",children:"Hash functions"}),"\n",(0,i.jsx)(n.p,{children:"The hash function for creating CIDs uses sha-256, but there is support for other hashing algorithms, such as sha1 (used by Git), sha2-256, sha3-255, blake2b-160, blake3, etc. Some older algorithms are proven not to be collision-free, so if algorithms can break, we have to switch the hash algorithm we use in the future! The problem with this switching of algorithms is the need to find a future-proof way of identifying the hash functions used to generate the hash, as well as the hash name."}),"\n",(0,i.jsx)(n.p,{children:"Multihash is a protocol that comes into play to provide us with valuable metadata for future-proofing. In an attempt to summarize it, it's the composition of a hash placed at the end, a prefix, as a number to identify the algorithm used, and a number, to identify the hash name. Therefore, we'd start raising some questions. Without it, how would we get the data back without the ability to identify how it was encoded? Some users could use cbor, protocol buffers, json, etc, and there might be plenty of good reasons why for those choices. Maybe it's a compact binary encoding that is very efficient for storage, easy to work with, etc."}),"\n",(0,i.jsx)(n.p,{children:"What's important is that it is the user's choice and why IPLD becomes useful for Fleek Network's use cases. A system for understanding and working with data that is made of a data model, codecs, tools for linking, and then a handful of other powerful features that help us develop a decentralized application."}),"\n",(0,i.jsx)(n.h3,{id:"interplanetary-linked-data-ipld",children:"Interplanetary linked data (IPLD)"}),"\n",(0,i.jsx)(n.p,{children:"Interplanetary linked data (IPLD) provides us with all the metadata prefixes to soothe the system needs, and provides us with the data model of the content-addressable web, as discussed earlier. IPLD is a set of conventions for creating decentralized data structures that are universally addressable and linkable."}),"\n",(0,i.jsxs)(n.p,{children:['A Distributed Hash Table (DHT) enables the network to store an IPLD or flexible mapping from any "immutable data pointer", such as a CID to its corresponding Blake3 hash. As mentioned in the ',(0,i.jsx)(n.a,{href:"#content-addressing",children:"Content Addressing"})," section, the network operates over Blake3 hashing for efficient content handling."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"These addressable and linkable data structures will allow us to do for data what URLs and links did for HTML web pages (Quote from IPLD)."})}),"\n",(0,i.jsx)(n.h3,{id:"content-addressable-archive-car",children:"Content Addressable aRchive (CAR)"}),"\n",(0,i.jsx)(n.p,{children:"The core of Fleek Network understands the IPLD CAR Content Addressable aRchive, which unpacks and traverses to cache individual files. The archive's content is hashed as Blake3, which Fleek Network uses to address all data coming and going into the network, regardless of their origin."}),"\n",(0,i.jsx)(n.admonition,{title:"warning",type:"caution",children:(0,i.jsx)(n.p,{children:"Despite handling IPLD CAR files, it serves raw archive content to the client. In other words, if a request for a complete CAR came through a gateway, the gateway (as a client) would have to build the file from the streamed data before sending it as a response to the end user."})}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"The ordering of blocks in a CAR is random, e.g. two different CAR files storing the same content. This causes the need to traverse the archive (DAG-PB/UnixFS) to store the CAR blocks as individual content."})}),"\n",(0,i.jsx)(n.h3,{id:"http-put-request-origin",children:"HTTP PUT Request Origin"}),"\n",(0,i.jsxs)(n.p,{children:["An ",(0,i.jsx)(n.strong,{children:"Origin"})," is a location where content originates from. In the context of Fleek Network, the origin has to be supported for the data retrieval to function, some examples of what will be supported are Arweave, Filecoin and IPFS. For instance, the first supported storage is IPFS and a user of Fleek Network should have the data pinned for IPFS somewhere to have it cached by the Fleek Network CDN service on an ",(0,i.jsx)(n.code,{children:"HTTP PUT"})," request."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["A Client-side library can provide helpers to upload to some origin, such as IPFS and call the ",(0,i.jsx)(n.code,{children:"HTTP PUT"})," for the origin."]})}),"\n",(0,i.jsx)(n.h2,{id:"binary-process",children:"Binary process"}),"\n",(0,i.jsxs)(n.p,{children:["The Fleek Network binary process is the program that's been compiled down to machine code that the computer's processor can understand and execute. The project source code repository from which the binary is compiled is called ",(0,i.jsx)(n.a,{href:"https://github.com/fleek-network/lightning",children:"Lightning"}),". Most node operators set up the nodes by running the install wizard, others do it manually. When a node operator runs a node, it means that the binary process is launched in the node operator's computer. It runs as a separate instance in memory, with its own set of resources and permissions. The Fleek Network binary is an essential component that contributes to the network formation, distribution and decentralization. It runs on a supported Linux operating system, enabling users to run a wide variety of computing services and perform complex tasks."]}),"\n",(0,i.jsx)(n.h3,{id:"ports",children:"Ports"}),"\n",(0,i.jsx)(o.ZP,{}),"\n",(0,i.jsx)(n.h3,{id:"json-rpc-interface",children:"JSON-RPC Interface"}),"\n",(0,i.jsxs)(n.p,{children:["A JSON-RPC (JavaScript Object Notation Remote Procedure Call) is a protocol that enables communication between client and server applications. The ",(0,i.jsx)(n.a,{href:"https://fleek-network.github.io/lightning/api-documentation/?202308171515",children:"Fleek Network JSON-RPC"})," API enables JSON-RPC interaction with Fleek Network Node."]}),"\n",(0,i.jsxs)(n.p,{children:["Fleek Network JSON-RPC API reference documentation is available at ",(0,i.jsx)(n.a,{href:"https://fleek-network.github.io/lightning/api-documentation",children:"https://fleek-network.github.io/lightning/api-documentation"}),"."]}),"\n",(0,i.jsx)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>r});t(7294);var i=t(5893);const r=e=>{let{image:n,name:t,title:r,url:s,communityMember:o=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:s,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:s,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:r}),(0,i.jsxs)("span",{className:"discord",children:[o?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>o});var i=t(7294);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7ceaa645.ac1d6308.js b/assets/js/7ceaa645.ac1d6308.js deleted file mode 100644 index b4b814936..000000000 --- a/assets/js/7ceaa645.ac1d6308.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[387],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n,a,o={},i=Object.keys(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a<i.length;a++)n=i[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},h="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),h=d(n),p=o,m=h["".concat(l,".").concat(p)]||h[p]||u[p]||i;return n?a.createElement(m,r(r({ref:t},c),{},{components:n})):a.createElement(m,r({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[h]="string"==typeof e?e:o,r[1]=s;for(var d=2;d<i;d++)r[d]=n[d];return a.createElement.apply(null,r)}return a.createElement.apply(null,n)}p.displayName="MDXCreateElement"},7906:(e,t,n)=>{n.d(t,{ZP:()=>s});var a=n(7462),o=(n(7294),n(3905));const i={toc:[{value:"Connection Pool (<code>4x00-4x09</code>)",id:"connection-pool-4x00-4x09",level:3},{value:"Consensus (<code>4x10-4x19</code>)",id:"consensus-4x10-4x19",level:3},{value:"Handshake (<code>4x20-4x29</code>)",id:"handshake-4x20-4x29",level:3},{value:"RPC (<code>4x30-4x39</code>)",id:"rpc-4x30-4x39",level:3},{value:"DHT (<code>4x40-4x49</code>)",id:"dht-4x40-4x49",level:3},{value:"Broadcast",id:"broadcast",level:3},{value:"Blockstore Server",id:"blockstore-server",level:3}]},r="wrapper";function s(e){let{components:t,...n}=e;return(0,o.kt)(r,(0,a.Z)({},i,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully."),(0,o.kt)("p",null,"We reserve the following top level ranges:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"TCP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4200-4299")),(0,o.kt)("li",{parentName:"ul"},"UDP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4300-4399"))),(0,o.kt)("p",null,"Each service in the node has 10 ports reserved within each range."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node.")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"For the Node Operators who opt to run the ",(0,o.kt)("inlineCode",{parentName:"p"},"get.fleek.network")," assisted installer, the ports are verified if in use.")),(0,o.kt)("p",null,"The Node process requires the following ports:"),(0,o.kt)("h3",{id:"connection-pool-4x00-4x09"},"Connection Pool (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x00-4x09"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Netkit QUIC: ",(0,o.kt)("inlineCode",{parentName:"li"},"4300 (UDP)"))),(0,o.kt)("h3",{id:"consensus-4x10-4x19"},"Consensus (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x10-4x19"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Mempool: ",(0,o.kt)("inlineCode",{parentName:"li"},"4210 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"Primary: ",(0,o.kt)("inlineCode",{parentName:"li"},"4310 (UDP)")),(0,o.kt)("li",{parentName:"ul"},"Worker: ",(0,o.kt)("inlineCode",{parentName:"li"},"4311 (UDP)"))),(0,o.kt)("h3",{id:"handshake-4x20-4x29"},"Handshake (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x20-4x29"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"HTTP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4220 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"TCP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4221 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"WebRTC: ",(0,o.kt)("inlineCode",{parentName:"li"},"4320 (UDP)")),(0,o.kt)("li",{parentName:"ul"},"WebTransport: ",(0,o.kt)("inlineCode",{parentName:"li"},"4321 (UDP)"))),(0,o.kt)("h3",{id:"rpc-4x30-4x39"},"RPC (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x30-4x39"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"HTTP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4230 (TCP)")),(0,o.kt)("li",{parentName:"ul"},"WebSocket / WebTransport?")),(0,o.kt)("h3",{id:"dht-4x40-4x49"},"DHT (",(0,o.kt)("inlineCode",{parentName:"h3"},"4x40-4x49"),")"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"UDP: ",(0,o.kt)("inlineCode",{parentName:"li"},"4340 (UDP)"))),(0,o.kt)("h3",{id:"broadcast"},"Broadcast"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Uses connection pool")),(0,o.kt)("h3",{id:"blockstore-server"},"Blockstore Server"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Uses connection pool")),(0,o.kt)("admonition",{title:"required",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports.")))}s.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(7294);const o=e=>{let{image:t,name:n,title:o,url:i,communityMember:r=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:i,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:i,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},o),a.createElement("span",{className:"discord"},r?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},9562:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>d,toc:()=>h});var a=n(7462),o=(n(7294),n(3905)),i=n(3872),r=n(7906);const s={title:"The Network",slug:"the-network",hide_title:!0,description:"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.",tags:["protocol","architecture","permissionless","decentralization","consensus","algorithms","snarks","rpc","reputation","ports"],sidebarCollapsible:!1},l=void 0,d={unversionedId:"learn/the-network",id:"learn/the-network",title:"The Network",description:"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.",source:"@site/docs/learn/the-network.md",sourceDirName:"learn",slug:"/learn/the-network",permalink:"/docs/learn/the-network",draft:!1,tags:[{label:"protocol",permalink:"/docs/tags/protocol"},{label:"architecture",permalink:"/docs/tags/architecture"},{label:"permissionless",permalink:"/docs/tags/permissionless"},{label:"decentralization",permalink:"/docs/tags/decentralization"},{label:"consensus",permalink:"/docs/tags/consensus"},{label:"algorithms",permalink:"/docs/tags/algorithms"},{label:"snarks",permalink:"/docs/tags/snarks"},{label:"rpc",permalink:"/docs/tags/rpc"},{label:"reputation",permalink:"/docs/tags/reputation"},{label:"ports",permalink:"/docs/tags/ports"}],version:"current",frontMatter:{title:"The Network",slug:"the-network",hide_title:!0,description:"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.",tags:["protocol","architecture","permissionless","decentralization","consensus","algorithms","snarks","rpc","reputation","ports"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"Introduction",permalink:"/docs/learn/introduction"},next:{title:"Delivery Acknowledgements",permalink:"/docs/learn/delivery-acknowledgements"}},c={},h=[{value:"Protocol",id:"protocol",level:2},{value:"The Consensus algorithm",id:"the-consensus-algorithm",level:2},{value:"The Edge Network",id:"the-edge-network",level:2},{value:"Incentives and rewards",id:"incentives-and-rewards",level:2},{value:"Delivery Acknowledgements (SNARKs)",id:"delivery-acknowledgements-snarks",level:2},{value:"Reputation system",id:"reputation-system",level:2},{value:"Actors and their roles",id:"actors-and-their-roles",level:2},{value:"Client",id:"client",level:3},{value:"Developer",id:"developer",level:3},{value:"End-user",id:"end-user",level:3},{value:"Node operator",id:"node-operator",level:3},{value:"Multi-Service Support",id:"multi-service-support",level:2},{value:"Abstraction and build blocks",id:"abstraction-and-build-blocks",level:2},{value:"Modular architecture",id:"modular-architecture",level:2},{value:"Repository",id:"repository",level:3},{value:"Directory structure",id:"directory-structure",level:3},{value:"Interfaces",id:"interfaces",level:3},{value:"Identity on the Fleek Network",id:"identity-on-the-fleek-network",level:2},{value:"Content addressability and verifiability",id:"content-addressability-and-verifiability",level:2},{value:"Immutability",id:"immutability",level:3},{value:"Content addressing",id:"content-addressing",level:3},{value:"Hash functions",id:"hash-functions",level:3},{value:"Interplanetary linked data (IPLD)",id:"interplanetary-linked-data-ipld",level:3},{value:"Content Addressable aRchive (CAR)",id:"content-addressable-archive-car",level:3},{value:"HTTP PUT Request Origin",id:"http-put-request-origin",level:3},{value:"Binary process",id:"binary-process",level:2},{value:"Ports",id:"ports",level:3},{value:"JSON-RPC Interface",id:"json-rpc-interface",level:3}],u={toc:h},p="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"protocol"},"Protocol"),(0,o.kt)("p",null,"The Fleek Network is designed to deliver computation cheaper, faster and more efficiently than existing cloud providers by allowing anyone to offer computer resources for rewards. Including, secured information about who requested it on the network."),(0,o.kt)("p",null,"The Fleek Network is a proof-of-stake protocol, that takes advantage of Ethereum for staking, payments, governance and other economic features."),(0,o.kt)("p",null,"This is achieved by a combination of SNARKs (Succinct Non-interactive Argument of Knowledge), Narwhal and Bullshark consensus, including other cryptographic and economic guarantees to achieve a trustless decentralized and long-term sustainable environment."),(0,o.kt)("p",null,"It's important to keep track of these components to ensure that the system is running fairly. The protocol holds the state for the following:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Token Balances"),(0,o.kt)("li",{parentName:"ul"},"Staking details"),(0,o.kt)("li",{parentName:"ul"},"The Node Reputation"),(0,o.kt)("li",{parentName:"ul"},"Data on how much work a Node has performed in a given epoch")),(0,o.kt)("p",null,"As a decentralized network, the state of these is replicated across all of the distributed nodes in the network by forming a blockchain, in which consensus on transactions transmutes to the final immutable state."),(0,o.kt)("h2",{id:"the-consensus-algorithm"},"The Consensus algorithm"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://arxiv.org/abs/2105.11827"},"Narwhal")," and ",(0,o.kt)("a",{parentName:"p",href:"https://arxiv.org/abs/2209.05633"},"Bullshark"),", are high-performant mempool and consensus engines by ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/MystenLabs"},"Mysten Labs"),". The Fleek Network uses Narwhal as a DAG-mempool for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The primary transactions being ordered by the consensus algorithm is the batch of Delivery Acknowledgements stored in a local list of transactions before commitment to the blockchain (memory pool).")),(0,o.kt)("p",null,"The Narwhal algorithm is based on the separation between the dissemination and transaction ordering to achieve high throughput in the blockchain system. The protocol achieves reliable dissemination and storage of causal histories of transactions. Narwhal tolerates an asynchronous network and maintains high performance despite failures."),(0,o.kt)("p",null,"Bullshark is a zero-message overhead consensus algorithm that handles transactions that require total ordering (linear ordering), and synchronization of the transactions between nodes and the global network state."),(0,o.kt)("p",null,"To put it simply, where Narwhal ensures data is submitted to consensus, Bullshark sorts out the order of the data."),(0,o.kt)("admonition",{title:"Total ordering",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked Node at the end of every epoch (about 24 hours). The integrity is met due to the Node rotation that occurs at each period, reducing risks associated with Nodes being compromised and affecting the committee purity. In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining Nodes.")),(0,o.kt)("h2",{id:"the-edge-network"},"The Edge Network"),(0,o.kt)("p",null,"Edge computing is about processing data at the closest point of interaction, while cloud computing is about processing data in a data center. "),(0,o.kt)("p",null,"Instead of resolving requests in the cloud, where roundtrip times are noticeable due to latency, the processing of requests is done at your closest convenience, which means getting you a quicker response and a better user experience."),(0,o.kt)("p",null,"Fleek Network's Edge computing is computing that's done at the speediest location to the user. Provided by Network Nodes that are favorably dispersed and operated by a diverse community."),(0,o.kt)("p",null,"The community members host and operate the Network Nodes, which form the Edge Platform, and contribute to an autonomous and decentralized network of web services."),(0,o.kt)("p",null,"Some of the resources provided by the network nodes are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Disk Storage"),(0,o.kt)("li",{parentName:"ul"},"Processing power (CPU Units)"),(0,o.kt)("li",{parentName:"ul"},"Network bandwidth")),(0,o.kt)("p",null,"The Edge Network aims to provide computational resources where a user most needs them."),(0,o.kt)("h2",{id:"incentives-and-rewards"},"Incentives and rewards"),(0,o.kt)("p",null,"Fleek Network issues FLK\u2013an ERC-20 fungible token created using the Ethereum Blockchain\u2013which Node operators must stake to perform work on the network. On the other hand, developers and clients use stablecoins in a fair exchange for the commodities and resources consumed on the network."),(0,o.kt)("admonition",{title:"warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"A Node Operator has to stake FLK to have a node participate in the Network. A node without FLK staken is referred to as a stakeless node. A stakeless node cannot contribute or participate in the network, as there would be no way to punish them for malicious behavior. Thus, all fully operational nodes in the network, without exception, have a stake.")),(0,o.kt)("p",null,"A node is a process that runs on a machine that provides resources to the network. The resources are packaged as commodities. For instance:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Availability / Up-time"),(0,o.kt)("li",{parentName:"ul"},"Bandwidth"),(0,o.kt)("li",{parentName:"ul"},"CPU")),(0,o.kt)("p",null,"These commodities are exchanged fairly and pricing is decided by the ecosystem and network governance. To ensure a stable and predictable income stream, the rewards awarded to Node Operators are predetermined at a stable rate (USD)."),(0,o.kt)("p",null,"Service providers are rewarded in many ways, for instance, by fulfilling cache requests per bandwidth, and sharing cached data with other peers\u2013as an incentive for a shared economy, therefore the more bandwidth served, the more tokens received."),(0,o.kt)("p",null,"When an epoch ends, which is about 24 hours, the rewards from all submitted Delivery Acknowledgements are distributed to the edge nodes."),(0,o.kt)("h2",{id:"delivery-acknowledgements-snarks"},"Delivery Acknowledgements (SNARKs)"),(0,o.kt)("p",null,"A Delivery Acknowledgement is a signed message by a client attesting that a node has successfully delivered a task to the client. These acknowledgements are instantly finalized locally and irreversible by the client."),(0,o.kt)("p",null,"The Delivery Acknowledgements are cryptographically secured and tamper-proof, meaning that the transaction contains irrefutable details about all parts involved in the transaction."),(0,o.kt)("p",null,"A Delivery Acknowledgement includes metadata about the commodities consumed by a node while executing or running a service. Also contains metadata that is used to determine the reward attributed to a Node."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"A Node provides the computational resources to the network and keeps track of doings in a list of Delivery Acknowledgements, on which the rewards' mechanism is based at the end of each Epoch (about 24 hours).")),(0,o.kt)("p",null,"Finally, Delivery Acknowledgements are gathered and batched by nodes before being submitted to the core protocol and committee as described in the ",(0,o.kt)("a",{parentName:"p",href:"#consensus"},"consensus")," section."),(0,o.kt)("p",null,"To learn more, visit the section ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn/delivery-acknowledgements"},"Delivery Acknowledgements"),"."),(0,o.kt)("h2",{id:"reputation-system"},"Reputation system"),(0,o.kt)("p",null,"The Fleek Network has a reputation system where nodes rate each other. The ratings are collected timely and an aggregation algorithm calculates the overall rate for each node at the end of every epoch."),(0,o.kt)("p",null,"Noteworthy, any reputation system that depends on players attributing rates to each other can be exploited. For prevention, a custom version of the EigenTrust algorithm is used to reduce dishonest and incorrect measurements."),(0,o.kt)("p",null,"Some other procedures where a node is rated are on the interactions between nodes while servicing. Meaning that a node earns a rate per service interaction."),(0,o.kt)("p",null,"The information is replicated across the network securely and cannot be tampered with and is a valuable and reliable source of knowledge for optimization tasks."),(0,o.kt)("p",null,"A few optimization tasks include:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Optimizing the network flow"),(0,o.kt)("li",{parentName:"ul"},"Assigning services to nodes"),(0,o.kt)("li",{parentName:"ul"},"Determining proximity")),(0,o.kt)("p",null,"The reputation system is used to determine the service routing and work allocation."),(0,o.kt)("h2",{id:"actors-and-their-roles"},"Actors and their roles"),(0,o.kt)("p",null,"The Fleek Network is a system where actors play important roles, namely:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Client"),(0,o.kt)("li",{parentName:"ul"},"Developer"),(0,o.kt)("li",{parentName:"ul"},"End-user"),(0,o.kt)("li",{parentName:"ul"},"Node Operator")),(0,o.kt)("p",null,"Each of these users has a huge role in contributing and participating in the network. They make it possible and lively by requesting resources, through usage, payments or by simply being a plain member of the community."),(0,o.kt)("h3",{id:"client"},"Client"),(0,o.kt)("p",null,"The ",(0,o.kt)("strong",{parentName:"p"},"Client")," is a user that consumes data from the network, for instance:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A developer interested in using the CDN in an application"),(0,o.kt)("li",{parentName:"ul"},"A media publisher wanting to accelerate access to media assets"),(0,o.kt)("li",{parentName:"ul"},"A system administrator looking for instructions to troubleshoot the client library"),(0,o.kt)("li",{parentName:"ul"},"A Solutions Architect looking for a quick overview of an alternative service for a centralized provider"),(0,o.kt)("li",{parentName:"ul"},"Instructions to install and use the client library"),(0,o.kt)("li",{parentName:"ul"},"A Web developer looking to decentralize an API service")),(0,o.kt)("p",null,"A client is a paying customer for the commodities and resources consumed on the network, e.g. a CDN service customer who pays for bandwidth use, etc."),(0,o.kt)("p",null,"This type of user can:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Top up the account to have enough credit to exchange for service"),(0,o.kt)("li",{parentName:"ul"},"Check the balance"),(0,o.kt)("li",{parentName:"ul"},"Check the cost(s) of the service(s)"),(0,o.kt)("li",{parentName:"ul"},"Many others (relative to the service offering that might be of a third-party provider)")),(0,o.kt)("h3",{id:"developer"},"Developer"),(0,o.kt)("p",null,"The ",(0,o.kt)("strong",{parentName:"p"},"Developer")," is a knowledgeable user that enables the business logic and end-to-end experience to the ",(0,o.kt)("strong",{parentName:"p"},"end-user")," through applications or services. Take, for example:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Protocol development contributor"),(0,o.kt)("li",{parentName:"ul"},"Service creator"),(0,o.kt)("li",{parentName:"ul"},"Client library user"),(0,o.kt)("li",{parentName:"ul"},"Contributions to the client libraries and tools"),(0,o.kt)("li",{parentName:"ul"},"The library method and parameters references"),(0,o.kt)("li",{parentName:"ul"},"Versions and features support")),(0,o.kt)("p",null,"A developer is often described as a builder who enables the end-to-end experience in the Fleek Network. A builder that can work at the Service provider level, protocol development, core contributor and, amongst others, at a higher level, such as providing support and integrations of services in applications or third-party systems."),(0,o.kt)("h3",{id:"end-user"},"End-user"),(0,o.kt)("p",null,"An ",(0,o.kt)("strong",{parentName:"p"},"End-user")," is someone to whom the data or computation output is ultimately delivered, amongst others:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Static assets, such as images rendered on a website"),(0,o.kt)("li",{parentName:"ul"},"Image optimization output for a very particular size request"),(0,o.kt)("li",{parentName:"ul"},"Server-side rendering"),(0,o.kt)("li",{parentName:"ul"},"Data response provided via HTTP Gateway or RPC")),(0,o.kt)("p",null,"The service outputs are for the ",(0,o.kt)("strong",{parentName:"p"},"end-user"),", but payment for the service is the responsibility of the ",(0,o.kt)("strong",{parentName:"p"},"client")," that manages the application or service the ",(0,o.kt)("strong",{parentName:"p"},"end-user")," interacts with."),(0,o.kt)("h3",{id:"node-operator"},"Node operator"),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},"Node Operator")," is a kind of system administrator who builds, configures, installs or maintains a node(s) in a server. To mention a few use cases:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Builds the node binary from source-code"),(0,o.kt)("li",{parentName:"ul"},"Updates the source-code repository, which node is built on"),(0,o.kt)("li",{parentName:"ul"},"Runs the installation wizard to setup a node"),(0,o.kt)("li",{parentName:"ul"},"Installs the node manually"),(0,o.kt)("li",{parentName:"ul"},"Configures the node"),(0,o.kt)("li",{parentName:"ul"},"Secures the server")),(0,o.kt)("p",null,"The Fleek Network works as a distributed system of nodes where each node operates and contributes to the system\u2019s overall health and functionality with computational resources by network operation demand."),(0,o.kt)("p",null,"Nodes are set up to run on servers by operators. Operators are system administrators who build, configure, install and maintain the nodes in a server. Generally, a node is installed and runs on a computer or virtual private server (VPS) lent by a cloud service provider."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"A server is a computer machine where a Node runs and can be located anywhere in the world.")),(0,o.kt)("p",null,"The Node Operator is a critical system actor that is incentivized to manage one or many nodes. Ultimately making the Fleek Network what is about, a decentralized orchestration layer and infrastructure."),(0,o.kt)("p",null,"Any individual who's interested in learning can become a Node Operator by reading the documentation, or content made available by the network core team and community."),(0,o.kt)("h2",{id:"multi-service-support"},"Multi-Service Support"),(0,o.kt)("p",null,"The Fleek Network provides a base layer as the foundation of many Services. Simplicity at its core, it handles Proof-of-delivery and other client-node exchanges, such as user balance and rewards."),(0,o.kt)("p",null,"It's designed to allow anyone to create and deploy a custom service to the network, without the need for anyone's permission. The protocol slashing mechanisms help deter malicious behavior and penalize dishonest participants while allowing the service, a modular unit, to operate at maximum availability and performance."),(0,o.kt)("p",null,"Within a diverse ecosystem where node operators are free to choose which services to run, e.g. an operator might find popular services more appealing economically. Thus, the network is nonhomogenous, made up of different types of resource servers, requirements and services."),(0,o.kt)("h2",{id:"abstraction-and-build-blocks"},"Abstraction and build blocks"),(0,o.kt)("p",null,"Abstraction is conceptually useful in decentralized and distributed web service development because of how incredibly complex it can become and the speed at which developers have to react to the outside world. The core team put most of the complexity into well-defined building blocks."),(0,o.kt)("p",null,"The building blocks provide you with enough level of detail that the modern developer experience demands but with cryptographic, economical and security assurances for confident service development, amongst others."),(0,o.kt)("p",null,"The Fleek Network implementation is open source and freely available for consultation and contribution when more detail or refinement is required by the community and other observers."),(0,o.kt)("h2",{id:"modular-architecture"},"Modular architecture"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"Lightning")," is the repository name containing the Fleek multi-service Edge Network implementation."),(0,o.kt)("p",null,"The project aims to provide a higher focus on engineering productivity from the get-go, an improvement over the original ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/ursa"},"Ursa")," implementation, which was exclusively focused on CDN, one of many services Lightning offers support."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Lightning is the open-source Rust implementation of Fleek Network. The repository contains the source code for the implementation of Fleek Network at ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"https://github.com/fleek-network/lightning"),".")),(0,o.kt)("p",null,"Some of the main differences from Ursa\u2019s implementation are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The dynamic service loading approach"),(0,o.kt)("li",{parentName:"ul"},"Decoupling of the network's core from the service implementation"),(0,o.kt)("li",{parentName:"ul"},"Higher-level architecture that makes it easier to maintain and within reach of external contributors.")),(0,o.kt)("p",null,"Lightning\u2019s development approach is more open, which allows the community to build services and also helps the core team work on other features or services in parallel."),(0,o.kt)("h3",{id:"repository"},"Repository"),(0,o.kt)("p",null,"The repository contains the source code for the implementation of the Fleek Network and is located at ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"https://github.com/fleek-network/lightning"),", a private repository that will go public after the whitepaper announcement and roadmap."),(0,o.kt)("h3",{id:"directory-structure"},"Directory structure"),(0,o.kt)("p",null,"There are three top-level directories, namely ",(0,o.kt)("inlineCode",{parentName:"p"},"lib"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"core")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"services"),"."),(0,o.kt)("p",null,"Lib - These are open-source libraries created to help tackle the project features and packaged with a friendly license in the Rust ecosystem (MIT, Apache)."),(0,o.kt)("p",null,"Core - The primary protocol implementation, where ",(0,o.kt)("inlineCode",{parentName:"p"},"node")," crate contains the essential feature set or base functionality. Includes the ",(0,o.kt)("inlineCode",{parentName:"p"},"interfaces")," crate, where the top-down specification of the project is located."),(0,o.kt)("p",null,"Services - A Service is a business logic provider built with the SDK (Service Development Kit). A service is decoupled from the core of the network and loaded dynamically ","[1]"," during the runtime using FFI (foreigner function interface)."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"draco\n\u251c\u2500\u2500 lib\n\u2502 \u251c\u2500\u2500 affair\n\u2502 \u251c\u2500\u2500 atomo\n\u2502 \u2514\u2500\u2500 blake3-tree\n\u251c\u2500\u2500 core\n\u2502 \u251c\u2500\u2500 node\n\u2502 \u251c\u2500\u2500 interfaces\n\u2502 \u251c\u2500\u2500 application\n\u2502 \u251c\u2500\u2500 blockstore\n\u2502 \u251c\u2500\u2500 consensus\n\u2502 \u251c\u2500\u2500 handshake\n\u2502 \u251c\u2500\u2500 identity\n\u2502 \u251c\u2500\u2500 origin-arweave\n\u2502 \u251c\u2500\u2500 origin-filecoin\n\u2502 \u251c\u2500\u2500 origin-ipfs\n\u2502 \u251c\u2500\u2500 pod\n\u2502 \u251c\u2500\u2500 reputation\n\u2502 \u251c\u2500\u2500 rpc\n\u2502 \u2514\u2500\u2500 sdk\n\u2514\u2500\u2500 services\n \u2514\u2500\u2500 cdn\n")),(0,o.kt)("h3",{id:"interfaces"},"Interfaces"),(0,o.kt)("p",null,"The design pattern adopted for this software is highly inspired by the Object-Oriented model described by Alan Kay, which may be a bit different from OOP which grew to fame due to Java."),(0,o.kt)("p",null,"In a nutshell, this is similar to the same idea, and we represent different units of computation and process as objects that communicate with each other by message passing."),(0,o.kt)("h2",{id:"identity-on-the-fleek-network"},"Identity on the Fleek Network"),(0,o.kt)("p",null,"The identity on the Fleek Network is issued and controlled by individuals, which means that there aren't any central entities that issue, manage or control it for you. An identity is created without permission from anyone, and stored securely and privately."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility.")),(0,o.kt)("p",null,"The types of Identities found in the Fleek Network are used for:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Node (for BFT DAG consensus)"),(0,o.kt)("li",{parentName:"ul"},"Node Network (for fast communication signatures)"),(0,o.kt)("li",{parentName:"ul"},"Account Owner (any actor holding a balance on Fleek Network)")),(0,o.kt)("p",null,"The Public-key cryptography used in the network identities are the following curves:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"BLS12-381 is a pairing-friendly elliptic curve construction from the BLS family"),(0,o.kt)("li",{parentName:"ul"},"Ed25519 is the EdDSA signature scheme using SHA-512 (SHA-2) and Curve25519"),(0,o.kt)("li",{parentName:"ul"},"Secp256k1 is the Elliptic Curve Digital Signature Algorithm (ECDSA) used by Bitcoin and Ethereum")),(0,o.kt)("p",null,"The identities are associated with the elliptic curves as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A Node key (ConsensusPublicKey) is BLS12-381 which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates"),(0,o.kt)("li",{parentName:"ul"},"A Node Networking key (NodePublicKey) is Ed25519 used for the speed and performance of the network communications"),(0,o.kt)("li",{parentName:"ul"},"Account Owner keys are based on secp256k1, which corresponds to an Ethereum Address")),(0,o.kt)("p",null,"Transactions can be signed by the Account Owner\u2014an Ethereum key (secp256k1) owned by the user on an external wallet and initially required to bridge assets from L2\u2014and Node identities"),(0,o.kt)("p",null,"Node Networking with Narwhal utilizes the Node Network key (Ed25519) is much more efficient when dealing with a single signature instead of aggregated signatures."),(0,o.kt)("h2",{id:"content-addressability-and-verifiability"},"Content addressability and verifiability"),(0,o.kt)("p",null,"The way content is distributed, handled and stored defines how trustworthy's a protocol. Some of the primitives to achieve it has roots in linked data, immutability, verification and the semantic web."),(0,o.kt)("p",null,"On Fleek Network, you either hint about data packed into a format called a Content Archive (CAR) or an existing CID of a CAR file\u2014which hash addresses are unique and universally addressable. The network never stores data, only a cache layer to existing storage as origins. For example, on ",(0,o.kt)("inlineCode",{parentName:"p"},"HTTP PUT")," we're just telling the network that there's some origin it should care about and cache."),(0,o.kt)("p",null,"Some of the principles that help us provide guarantees to end-users require a high ability for content verification, as a consequence, the immutability of files is critical to the system."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"To emphasize, immutability means the state of not changing, or being unable to change!")),(0,o.kt)("h3",{id:"immutability"},"Immutability"),(0,o.kt)("p",null,"Fleek Network deals with files in a manner where the content determines the address in which the user of the system can locate and verify it unquestionably. This is possible due to cryptography, in which the same data always produces the same hash deterministically."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A file whose content determines the hash, but is also impossible to invert it"),(0,o.kt)("li",{parentName:"ul"},"Unable to reconstruct data from a hash"),(0,o.kt)("li",{parentName:"ul"},"It's unique, not two files produce the same file or content"),(0,o.kt)("li",{parentName:"ul"},"Any change in the content should always generate a completely different hash")),(0,o.kt)("p",null,'In retrospect, what we have on the web today are files accessible via a URL address and the problem with this approach is that the content is not intrinsically tight to the address e.g. the content can change and the URL remains the same. That is the problematic way we access files on the web today, which we call "Location addressing", and the way we solve it for the web of tomorrow is called "Content addressing".'),(0,o.kt)("h3",{id:"content-addressing"},"Content addressing"),(0,o.kt)("p",null,"Content addressing is where we use a hash to access the content, and it allows us to verify that the content we received is the content we asked for. For this, we use a special hash called CID (Content Identifier), a cryptography hash function that maps input of arbitrary size to the output of a fixed size\u2014the content identifiers are short, regardless of the size of the content, and the address does not tell us where the content is stored."),(0,o.kt)("p",null,"The entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The CID is a sort of string-like binary that is human-friendlier in comparison to the underlying binary, which is way longer.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Caching and deduplication are possible due to the immutability of content e.g. if content changes, let's say that an image has some new detail, the files share many of the same bytes. The amount of data we have to transfer to fetch is minimum, we'd only pull the difference. In today's web, we'd have to transfer both files in full, which is a worse path on resource allocation and performance.")),(0,o.kt)("h3",{id:"hash-functions"},"Hash functions"),(0,o.kt)("p",null,"The hash function for creating CIDs uses sha-256, but there is support for other hashing algorithms, such as sha1 (used by Git), sha2-256, sha3-255, blake2b-160, blake3, etc. Some older algorithms are proven not to be collision-free, so if algorithms can break, we have to switch the hash algorithm we use in the future! The problem with this switching of algorithms is the need to find a future-proof way of identifying the hash functions used to generate the hash, as well as the hash name."),(0,o.kt)("p",null,"Multihash is a protocol that comes into play to provide us with valuable metadata for future-proofing. In an attempt to summarize it, it's the composition of a hash placed at the end, a prefix, as a number to identify the algorithm used, and a number, to identify the hash name. Therefore, we'd start raising some questions. Without it, how would we get the data back without the ability to identify how it was encoded? Some users could use cbor, protocol buffers, json, etc, and there might be plenty of good reasons why for those choices. Maybe it's a compact binary encoding that is very efficient for storage, easy to work with, etc."),(0,o.kt)("p",null,"What's important is that it is the user's choice and why IPLD becomes useful for Fleek Network's use cases. A system for understanding and working with data that is made of a data model, codecs, tools for linking, and then a handful of other powerful features that help us develop a decentralized application."),(0,o.kt)("h3",{id:"interplanetary-linked-data-ipld"},"Interplanetary linked data (IPLD)"),(0,o.kt)("p",null,"Interplanetary linked data (IPLD) provides us with all the metadata prefixes to soothe the system needs, and provides us with the data model of the content-addressable web, as discussed earlier. IPLD is a set of conventions for creating decentralized data structures that are universally addressable and linkable."),(0,o.kt)("p",null,'A Distributed Hash Table (DHT) enables the network to store an IPLD or flexible mapping from any "immutable data pointer", such as a CID to its corresponding Blake3 hash. As mentioned in the ',(0,o.kt)("a",{parentName:"p",href:"#content-addressing"},"Content Addressing")," section, the network operates over Blake3 hashing for efficient content handling."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"These addressable and linkable data structures will allow us to do for data what URLs and links did for HTML web pages (Quote from IPLD).")),(0,o.kt)("h3",{id:"content-addressable-archive-car"},"Content Addressable aRchive (CAR)"),(0,o.kt)("p",null,"The core of Fleek Network understands the IPLD CAR Content Addressable aRchive, which unpacks and traverses to cache individual files. The archive's content is hashed as Blake3, which Fleek Network uses to address all data coming and going into the network, regardless of their origin."),(0,o.kt)("admonition",{title:"warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Despite handling IPLD CAR files, it serves raw archive content to the client. In other words, if a request for a complete CAR came through a gateway, the gateway (as a client) would have to build the file from the streamed data before sending it as a response to the end user.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The ordering of blocks in a CAR is random, e.g. two different CAR files storing the same content. This causes the need to traverse the archive (DAG-PB/UnixFS) to store the CAR blocks as individual content.")),(0,o.kt)("h3",{id:"http-put-request-origin"},"HTTP PUT Request Origin"),(0,o.kt)("p",null,"An ",(0,o.kt)("strong",{parentName:"p"},"Origin")," is a location where content originates from. In the context of Fleek Network, the origin has to be supported for the data retrieval to function, some examples of what will be supported are Arweave, Filecoin and IPFS. For instance, the first supported storage is IPFS and a user of Fleek Network should have the data pinned for IPFS somewhere to have it cached by the Fleek Network CDN service on an ",(0,o.kt)("inlineCode",{parentName:"p"},"HTTP PUT")," request."),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"A Client-side library can provide helpers to upload to some origin, such as IPFS and call the ",(0,o.kt)("inlineCode",{parentName:"p"},"HTTP PUT")," for the origin.")),(0,o.kt)("h2",{id:"binary-process"},"Binary process"),(0,o.kt)("p",null,"The Fleek Network binary process is the program that's been compiled down to machine code that the computer's processor can understand and execute. The project source code repository from which the binary is compiled is called ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning"},"Lightning"),". Most node operators set up the nodes by running the install wizard, others do it manually. When a node operator runs a node, it means that the binary process is launched in the node operator's computer. It runs as a separate instance in memory, with its own set of resources and permissions. The Fleek Network binary is an essential component that contributes to the network formation, distribution and decentralization. It runs on a supported Linux operating system, enabling users to run a wide variety of computing services and perform complex tasks."),(0,o.kt)("h3",{id:"ports"},"Ports"),(0,o.kt)(r.ZP,{mdxType:"Ports"}),(0,o.kt)("h3",{id:"json-rpc-interface"},"JSON-RPC Interface"),(0,o.kt)("p",null,"A JSON-RPC (JavaScript Object Notation Remote Procedure Call) is a protocol that enables communication between client and server applications. The ",(0,o.kt)("a",{parentName:"p",href:"https://fleek-network.github.io/lightning/api-documentation/?202308171515"},"Fleek Network JSON-RPC")," API enables JSON-RPC interaction with Fleek Network Node."),(0,o.kt)("p",null,"Fleek Network JSON-RPC API reference documentation is available at ",(0,o.kt)("a",{parentName:"p",href:"https://fleek-network.github.io/lightning/api-documentation"},"https://fleek-network.github.io/lightning/api-documentation"),"."),(0,o.kt)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8105.7cae6d1f.js b/assets/js/8105.7cae6d1f.js deleted file mode 100644 index e2b78a0f0..000000000 --- a/assets/js/8105.7cae6d1f.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8105],{3905:(e,t,n)=>{"use strict";n.d(t,{Zo:()=>u,kt:()=>f});var o=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,o,a=function(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=o.createContext({}),s=function(e){var t=o.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=s(e.components);return o.createElement(i.Provider,{value:t},e.children)},m="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=s(n),p=a,f=m["".concat(i,".").concat(p)]||m[p]||d[p]||r;return n?o.createElement(f,c(c({ref:t},u),{},{components:n})):o.createElement(f,c({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,c=new Array(r);c[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l[m]="string"==typeof e?e:a,c[1]=l;for(var s=2;s<r;s++)c[s]=n[s];return o.createElement.apply(null,c)}return o.createElement.apply(null,n)}p.displayName="MDXCreateElement"},4881:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7294),a=n(5999),r=n(5281),c=n(7462),l=n(6010);const i={iconEdit:"iconEdit_Z9Sw"};function s(e){let{className:t,...n}=e;return o.createElement("svg",(0,c.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,l.Z)(i.iconEdit,t),"aria-hidden":"true"},n),o.createElement("g",null,o.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))}function u(e){let{editUrl:t}=e;return o.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener",className:r.k.common.editThisPage},o.createElement(s,null),o.createElement(a.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var o=n(7462),a=n(7294),r=n(6010),c=n(5999),l=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:m}}=(0,l.L)();if("h1"===t||!n)return a.createElement(t,(0,o.Z)({},u,{id:void 0}));const d=(0,c.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return a.createElement(t,(0,o.Z)({},u,{className:(0,r.Z)("anchor",m?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n}),u.children,a.createElement(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d},"\u200b"))}},8718:(e,t,n)=>{"use strict";n.d(t,{Z:()=>he});var o=n(7294),a=n(3905),r=n(7462),c=n(5742);var l=n(2389),i=n(6010),s=n(2949),u=n(6668);function m(){const{prism:e}=(0,u.L)(),{colorMode:t}=(0,s.I)(),n=e.theme,o=e.darkTheme||n;return"dark"===t?o:n}var d=n(5281),p=n(7594),f=n.n(p);const g=/title=(?<quote>["'])(?<title>.*?)\1/,h=/\{(?<range>[\d,-]+)\}/,y={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}};function b(e,t){const n=e.map((e=>{const{start:n,end:o}=y[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${o})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:o,magicComments:a,metastring:r}=t;if(r&&h.test(r)){const e=r.match(h).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${r}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,o=f()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(o),code:n}}if(void 0===o)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return b(["js","jsBlock"],t);case"jsx":case"tsx":return b(["js","jsBlock","jsx"],t);case"html":return b(["js","jsBlock","html"],t);case"python":case"py":case"bash":return b(["bash"],t);case"markdown":case"md":return b(["html","jsx","bash"],t);default:return b(Object.keys(y),t)}}(o,a),l=n.split("\n"),i=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),s=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),m=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let p=0;p<l.length;){const e=l[p].match(c);if(!e){p+=1;continue}const t=e.slice(1).find((e=>void 0!==e));s[t]?i[s[t]].range+=`${p},`:u[t]?i[u[t]].start=p:m[t]&&(i[m[t]].range+=`${i[m[t]].start}-${p-1},`),l.splice(p,1)}n=l.join("\n");const d={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;f()(n).forEach((e=>{d[e]??=[],d[e].push(t)}))})),{lineClassNames:d,code:n}}const E={codeBlockContainer:"codeBlockContainer_Ckt0"};function k(e){let{as:t,...n}=e;const a=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[o,a]=e;const r=t[o];r&&"string"==typeof a&&(n[r]=a)})),n}(m());return o.createElement(t,(0,r.Z)({},n,{style:a,className:(0,i.Z)(n.className,E.codeBlockContainer,d.k.common.codeBlock)}))}const N={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function C(e){let{children:t,className:n}=e;return o.createElement(k,{as:"pre",tabIndex:0,className:(0,i.Z)(N.codeBlockStandalone,"thin-scrollbar",n)},o.createElement("code",{className:N.codeBlockLines},t))}var w=n(902);const B={attributes:!0,characterData:!0,childList:!0,subtree:!0};function Z(e,t){const[n,a]=(0,o.useState)(),r=(0,o.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,o.useEffect)((()=>{r()}),[r]),function(e,t,n){void 0===n&&(n=B);const a=(0,w.zX)(t),r=(0,w.Ql)(n);(0,o.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,r),()=>t.disconnect()}),[e,a,r])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),r())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}const T={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]};var L={Prism:n(7410).Z,theme:T};function j(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _(){return _=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},_.apply(this,arguments)}var x=/\r\n|\r|\n/,O=function(e){0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},S=function(e,t){var n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)};function P(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&-1===t.indexOf(o)&&(n[o]=e[o]);return n}var z=function(e){function t(){for(var t=this,n=[],o=arguments.length;o--;)n[o]=arguments[o];e.apply(this,n),j(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var n=e.theme?function(e,t){var n=e.plain,o=Object.create(null),a=e.styles.reduce((function(e,n){var o=n.languages,a=n.style;return o&&!o.includes(t)||n.types.forEach((function(t){var n=_({},e[t],a);e[t]=n})),e}),o);return a.root=n,a.plain=_({},n,{backgroundColor:null}),a}(e.theme,e.language):void 0;return t.themeDict=n})),j(this,"getLineProps",(function(e){var n=e.key,o=e.className,a=e.style,r=_({},P(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(r.style=c.plain),void 0!==a&&(r.style=void 0!==r.style?_({},r.style,a):a),void 0!==n&&(r.key=n),o&&(r.className+=" "+o),r})),j(this,"getStyleForToken",(function(e){var n=e.types,o=e.empty,a=n.length,r=t.getThemeDict(t.props);if(void 0!==r){if(1===a&&"plain"===n[0])return o?{display:"inline-block"}:void 0;if(1===a&&!o)return r[n[0]];var c=o?{display:"inline-block"}:{},l=n.map((function(e){return r[e]}));return Object.assign.apply(Object,[c].concat(l))}})),j(this,"getTokenProps",(function(e){var n=e.key,o=e.className,a=e.style,r=e.token,c=_({},P(e,["key","className","style","token"]),{className:"token "+r.types.join(" "),children:r.content,style:t.getStyleForToken(r),key:void 0});return void 0!==a&&(c.style=void 0!==c.style?_({},c.style,a):a),void 0!==n&&(c.key=n),o&&(c.className+=" "+o),c})),j(this,"tokenize",(function(e,t,n,o){var a={code:t,grammar:n,language:o,tokens:[]};e.hooks.run("before-tokenize",a);var r=a.tokens=e.tokenize(a.code,a.grammar,a.language);return e.hooks.run("after-tokenize",a),r}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,n=e.language,o=e.code,a=e.children,r=this.getThemeDict(this.props),c=t.languages[n];return a({tokens:function(e){for(var t=[[]],n=[e],o=[0],a=[e.length],r=0,c=0,l=[],i=[l];c>-1;){for(;(r=o[c]++)<a[c];){var s=void 0,u=t[c],m=n[c][r];if("string"==typeof m?(u=c>0?u:["plain"],s=m):(u=S(u,m.type),m.alias&&(u=S(u,m.alias)),s=m.content),"string"==typeof s){var d=s.split(x),p=d.length;l.push({types:u,content:d[0]});for(var f=1;f<p;f++)O(l),i.push(l=[]),l.push({types:u,content:d[f]})}else c++,t.push(u),n.push(s),o.push(0),a.push(s.length)}c--,t.pop(),n.pop(),o.pop(),a.pop()}return O(l),i}(void 0!==c?this.tokenize(t,o,c,n):[o]),className:"prism-code language-"+n,style:void 0!==r?r.root:{},getLineProps:this.getLineProps,getTokenProps:this.getTokenProps})},t}(o.Component);const A=z,I={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function W(e){let{line:t,classNames:n,showLineNumbers:a,getLineProps:c,getTokenProps:l}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const s=c({line:t,className:(0,i.Z)(n,a&&I.codeLine)}),u=t.map(((e,t)=>o.createElement("span",(0,r.Z)({key:t},l({token:e,key:t})))));return o.createElement("span",s,a?o.createElement(o.Fragment,null,o.createElement("span",{className:I.codeLineNumber}),o.createElement("span",{className:I.codeLineContent},u)):u,o.createElement("br",null))}var M=n(5999);function H(e){return o.createElement("svg",(0,r.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"}))}function D(e){return o.createElement("svg",(0,r.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}const V={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function R(e){let{code:t,className:n}=e;const[a,r]=(0,o.useState)(!1),c=(0,o.useRef)(void 0),l=(0,o.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const o=document.createElement("textarea"),a=document.activeElement;o.value=e,o.setAttribute("readonly",""),o.style.contain="strict",o.style.position="absolute",o.style.left="-9999px",o.style.fontSize="12pt";const r=document.getSelection(),c=r.rangeCount>0&&r.getRangeAt(0);n.append(o),o.select(),o.selectionStart=0,o.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}o.remove(),c&&(r.removeAllRanges(),r.addRange(c)),a&&a.focus()}(t),r(!0),c.current=window.setTimeout((()=>{r(!1)}),1e3)}),[t]);return(0,o.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),o.createElement("button",{type:"button","aria-label":a?(0,M.I)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,M.I)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,M.I)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,i.Z)("clean-btn",n,V.copyButton,a&&V.copyButtonCopied),onClick:l},o.createElement("span",{className:V.copyButtonIcons,"aria-hidden":"true"},o.createElement(H,{className:V.copyButtonIcon}),o.createElement(D,{className:V.copyButtonSuccessIcon})))}function $(e){return o.createElement("svg",(0,r.Z)({viewBox:"0 0 24 24"},e),o.createElement("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"}))}const F={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function q(e){let{className:t,onClick:n,isEnabled:a}=e;const r=(0,M.I)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return o.createElement("button",{type:"button",onClick:n,className:(0,i.Z)("clean-btn",t,a&&F.wordWrapButtonEnabled),"aria-label":r,title:r},o.createElement($,{className:F.wordWrapButtonIcon,"aria-hidden":"true"}))}function G(e){let{children:t,className:n="",metastring:a,title:c,showLineNumbers:l,language:s}=e;const{prism:{defaultLanguage:d,magicComments:p}}=(0,u.L)(),f=s??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??d,h=m(),y=function(){const[e,t]=(0,o.useState)(!1),[n,a]=(0,o.useState)(!1),r=(0,o.useRef)(null),c=(0,o.useCallback)((()=>{const n=r.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[r,e]),l=(0,o.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=r.current,n=e>t||r.current.querySelector("code").hasAttribute("style");a(n)}),[r]);return Z(r,l),(0,o.useEffect)((()=>{l()}),[e,l]),(0,o.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:r,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(g)?.groups.title??""}(a)||c,{lineClassNames:E,code:C}=v(t,{metastring:a,language:f,magicComments:p}),w=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return o.createElement(k,{as:"div",className:(0,i.Z)(n,f&&!n.includes(`language-${f}`)&&`language-${f}`)},b&&o.createElement("div",{className:N.codeBlockTitle},b),o.createElement("div",{className:N.codeBlockContent},o.createElement(A,(0,r.Z)({},L,{theme:h,code:C,language:f??"text"}),(e=>{let{className:t,tokens:n,getLineProps:a,getTokenProps:r}=e;return o.createElement("pre",{tabIndex:0,ref:y.codeBlockRef,className:(0,i.Z)(t,N.codeBlock,"thin-scrollbar")},o.createElement("code",{className:(0,i.Z)(N.codeBlockLines,w&&N.codeBlockLinesWithNumbering)},n.map(((e,t)=>o.createElement(W,{key:t,line:e,getLineProps:a,getTokenProps:r,classNames:E[t],showLineNumbers:w})))))})),o.createElement("div",{className:N.buttonGroup},(y.isEnabled||y.isCodeScrollable)&&o.createElement(q,{className:N.codeButton,onClick:()=>y.toggle(),isEnabled:y.isEnabled}),o.createElement(R,{className:N.codeButton,code:C}))))}function U(e){let{children:t,...n}=e;const a=(0,l.Z)(),c=function(e){return o.Children.toArray(e).some((e=>(0,o.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),i="string"==typeof c?G:C;return o.createElement(i,(0,r.Z)({key:String(a)},n),c)}var Q=n(9960);var X=n(6043);const Y={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function J(e){return!!e&&("SUMMARY"===e.tagName||J(e.parentElement))}function K(e,t){return!!e&&(e===t||K(e.parentElement,t))}function ee(e){let{summary:t,children:n,...a}=e;const c=(0,l.Z)(),s=(0,o.useRef)(null),{collapsed:u,setCollapsed:m}=(0,X.u)({initialState:!a.open}),[d,p]=(0,o.useState)(a.open),f=o.isValidElement(t)?t:o.createElement("summary",null,t??"Details");return o.createElement("details",(0,r.Z)({},a,{ref:s,open:d,"data-collapsed":u,className:(0,i.Z)(Y.details,c&&Y.isBrowser,a.className),onMouseDown:e=>{J(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;J(t)&&K(t,s.current)&&(e.preventDefault(),u?(m(!1),p(!0)):m(!0))}}),f,o.createElement(X.z,{lazy:!1,collapsed:u,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{m(e),p(!e)}},o.createElement("div",{className:Y.collapsibleContent},n)))}const te={details:"details_b_Ee"},ne="alert alert--info";function oe(e){let{...t}=e;return o.createElement(ee,(0,r.Z)({},t,{className:(0,i.Z)(ne,te.details,t.className)}))}var ae=n(2503);function re(e){return o.createElement(ae.Z,e)}const ce={containsTaskList:"containsTaskList_mC6p"};const le={img:"img_ev3q"};const ie="admonition_LlT9",se="admonitionHeading_tbUL",ue="admonitionIcon_kALy",me="admonitionContent_S0QG";const de={note:{infimaClassName:"secondary",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))},label:o.createElement(M.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)"},"note")},tip:{infimaClassName:"success",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"}))},label:o.createElement(M.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)"},"tip")},danger:{infimaClassName:"danger",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 12 16"},o.createElement("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))},label:o.createElement(M.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)"},"danger")},info:{infimaClassName:"info",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 14 16"},o.createElement("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))},label:o.createElement(M.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)"},"info")},caution:{infimaClassName:"warning",iconComponent:function(){return o.createElement("svg",{viewBox:"0 0 16 16"},o.createElement("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))},label:o.createElement(M.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)"},"caution")}},pe={secondary:"note",important:"info",success:"tip",warning:"danger"};function fe(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=o.Children.toArray(e),n=t.find((e=>o.isValidElement(e)&&"mdxAdmonitionTitle"===e.props?.mdxType)),a=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return{mdxAdmonitionTitle:n,rest:a}}(e.children);return{...e,title:e.title??t,children:n}}const ge={head:function(e){const t=o.Children.map(e.children,(e=>o.isValidElement(e)?function(e){if(e.props?.mdxType&&e.props.originalType){const{mdxType:t,originalType:n,...a}=e.props;return o.createElement(e.props.originalType,a)}return e}(e):e));return o.createElement(c.Z,e,t)},code:function(e){const t=["a","abbr","b","br","button","cite","code","del","dfn","em","i","img","input","ins","kbd","label","object","output","q","ruby","s","small","span","strong","sub","sup","time","u","var","wbr"];return o.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")||(0,o.isValidElement)(e)&&t.includes(e.props?.mdxType)))?o.createElement("code",e):o.createElement(U,e)},a:function(e){return o.createElement(Q.Z,e)},pre:function(e){return o.createElement(U,(0,o.isValidElement)(e.children)&&"code"===e.children.props?.originalType?e.children.props:{...e})},details:function(e){const t=o.Children.toArray(e.children),n=t.find((e=>o.isValidElement(e)&&"summary"===e.props?.mdxType)),a=o.createElement(o.Fragment,null,t.filter((e=>e!==n)));return o.createElement(oe,(0,r.Z)({},e,{summary:n}),a)},ul:function(e){return o.createElement("ul",(0,r.Z)({},e,{className:(t=e.className,(0,i.Z)(t,t?.includes("contains-task-list")&&ce.containsTaskList))}));var t},img:function(e){return o.createElement("img",(0,r.Z)({loading:"lazy"},e,{className:(t=e.className,(0,i.Z)(t,le.img))}));var t},h1:e=>o.createElement(re,(0,r.Z)({as:"h1"},e)),h2:e=>o.createElement(re,(0,r.Z)({as:"h2"},e)),h3:e=>o.createElement(re,(0,r.Z)({as:"h3"},e)),h4:e=>o.createElement(re,(0,r.Z)({as:"h4"},e)),h5:e=>o.createElement(re,(0,r.Z)({as:"h5"},e)),h6:e=>o.createElement(re,(0,r.Z)({as:"h6"},e)),admonition:function(e){const{children:t,type:n,title:a,icon:r}=fe(e),c=function(e){const t=pe[e]??e,n=de[t];return n||(console.warn(`No admonition config found for admonition type "${t}". Using Info as fallback.`),de.info)}(n),l=a??c.label,{iconComponent:s}=c,u=r??o.createElement(s,null);return o.createElement("div",{className:(0,i.Z)(d.k.common.admonition,d.k.common.admonitionType(e.type),"alert",`alert--${c.infimaClassName}`,ie)},o.createElement("div",{className:se},o.createElement("span",{className:ue},u),l),o.createElement("div",{className:me},t))},mermaid:()=>null};function he(e){let{children:t}=e;return o.createElement(a.Zo,{components:ge},t)}},2244:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(7294),a=n(6010),r=n(9960);function c(e){const{permalink:t,title:n,subLabel:c,isNext:l}=e;return o.createElement(r.Z,{className:(0,a.Z)("pagination-nav__link",l?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},c&&o.createElement("div",{className:"pagination-nav__sublabel"},c),o.createElement("div",{className:"pagination-nav__label"},n))}},3008:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var o=n(7294),a=n(6010),r=n(9960);const c={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};function l(e){let{permalink:t,label:n,count:l}=e;return o.createElement(r.Z,{href:t,className:(0,a.Z)(c.tag,l?c.tagWithCount:c.tagRegular)},n,l&&o.createElement("span",null,l))}},1526:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var o=n(7294),a=n(6010),r=n(5999),c=n(3008);const l={tags:"tags_jXut",tag:"tag_QGVx"};function i(e){let{tags:t}=e;return o.createElement(o.Fragment,null,o.createElement("b",null,o.createElement(r.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),o.createElement("ul",{className:(0,a.Z)(l.tags,"padding--none","margin-left--sm")},t.map((e=>{let{label:t,permalink:n}=e;return o.createElement("li",{key:n,className:l.tag},o.createElement(c.Z,{label:t,permalink:n}))}))))}},7594:(e,t)=>{function n(e){let t,n=[];for(let o of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(o))n.push(parseInt(o,10));else if(t=o.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,o,a,r]=t;if(o&&r){o=parseInt(o),r=parseInt(r);const e=o<r?1:-1;"-"!==a&&".."!==a&&"\u2025"!==a||(r+=e);for(let t=o;t!==r;t+=e)n.push(t)}}return n}t.default=n,e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/814f3328.d24f5f57.js b/assets/js/814f3328.01f98a18.js similarity index 62% rename from assets/js/814f3328.d24f5f57.js rename to assets/js/814f3328.01f98a18.js index 93b3680d3..7488c264b 100644 --- a/assets/js/814f3328.d24f5f57.js +++ b/assets/js/814f3328.01f98a18.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2535],{5641:o=>{o.exports=JSON.parse('{"title":"All Blog Posts","items":[{"title":"Bloom Filters and Cuckoo Filters for Cache Summarization","permalink":"/blog/bloom-and-cuckoo-filters-for-cache-summarization"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2535],{5641:e=>{e.exports=JSON.parse('{"title":"All Blog Posts","items":[{"title":"Bloom Filters and Cuckoo Filters for Cache Summarization","permalink":"/blog/bloom-and-cuckoo-filters-for-cache-summarization","unlisted":false}]}')}}]); \ No newline at end of file diff --git a/assets/js/82893666.f3b79821.js b/assets/js/82893666.1b7a455f.js similarity index 96% rename from assets/js/82893666.f3b79821.js rename to assets/js/82893666.1b7a455f.js index 07813d61b..ca601738c 100644 --- a/assets/js/82893666.f3b79821.js +++ b/assets/js/82893666.1b7a455f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8005],{2220:e=>{e.exports=JSON.parse('{"label":"develop","permalink":"/docs/tags/develop","allTagsPath":"/docs/tags","count":2,"items":[{"id":"develop/index","title":"Overview","description":"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.","permalink":"/docs/develop/overview"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8005],{2220:e=>{e.exports=JSON.parse('{"label":"develop","permalink":"/docs/tags/develop","allTagsPath":"/docs/tags","count":2,"items":[{"id":"develop/index","title":"Overview","description":"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.","permalink":"/docs/develop/overview"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/8428fe34.0509f320.js b/assets/js/8428fe34.0509f320.js deleted file mode 100644 index 644ad157f..000000000 --- a/assets/js/8428fe34.0509f320.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5522],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=r.createContext({}),l=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=l(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),f=o,g=u["".concat(s,".").concat(f)]||u[f]||d[f]||a;return n?r.createElement(g,i(i({ref:t},p),{},{components:n})):r.createElement(g,i({ref:t},p))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var l=2;l<a;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}f.displayName="MDXCreateElement"},6729:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={title:"Diagnostics",tags:["Diagnostics"],sidebarCollapsible:!1},i=void 0,c={unversionedId:"node/diagnostics",id:"node/diagnostics",title:"Diagnostics",description:"TODO: Diagnostics",source:"@site/docs/node/diagnostics.md",sourceDirName:"node",slug:"/node/diagnostics",permalink:"/docs/node/diagnostics",draft:!1,tags:[{label:"Diagnostics",permalink:"/docs/tags/diagnostics"}],version:"current",frontMatter:{title:"Diagnostics",tags:["Diagnostics"],sidebarCollapsible:!1}},s={},l=[],p={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"TODO: Diagnostics"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8428fe34.9593ce54.js b/assets/js/8428fe34.9593ce54.js new file mode 100644 index 000000000..3516c57bd --- /dev/null +++ b/assets/js/8428fe34.9593ce54.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5522],{576:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var s=e(5893),o=e(1151);const i={title:"Diagnostics",tags:["Diagnostics"],sidebarCollapsible:!1},c=void 0,a={id:"node/diagnostics",title:"Diagnostics",description:"TODO: Diagnostics",source:"@site/docs/node/diagnostics.md",sourceDirName:"node",slug:"/node/diagnostics",permalink:"/docs/node/diagnostics",draft:!1,unlisted:!1,tags:[{label:"Diagnostics",permalink:"/docs/tags/diagnostics"}],version:"current",frontMatter:{title:"Diagnostics",tags:["Diagnostics"],sidebarCollapsible:!1}},r={},d=[];function l(t){const n={p:"p",...(0,o.a)(),...t.components};return(0,s.jsx)(n.p,{children:"TODO: Diagnostics"})}function u(t={}){const{wrapper:n}={...(0,o.a)(),...t.components};return n?(0,s.jsx)(n,{...t,children:(0,s.jsx)(l,{...t})}):l(t)}},1151:(t,n,e)=>{e.d(n,{Z:()=>a,a:()=>c});var s=e(7294);const o={},i=s.createContext(o);function c(t){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function a(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:c(t.components),s.createElement(i.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/84e08f43.e19511bc.js b/assets/js/84e08f43.fd8204f1.js similarity index 92% rename from assets/js/84e08f43.e19511bc.js rename to assets/js/84e08f43.fd8204f1.js index a4e81afe9..abf847eeb 100644 --- a/assets/js/84e08f43.e19511bc.js +++ b/assets/js/84e08f43.fd8204f1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8059],{3290:e=>{e.exports=JSON.parse('{"label":"file permissions","permalink":"/references/tags/file-permissions","allTagsPath":"/references/tags","count":3,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"},{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8059],{3290:e=>{e.exports=JSON.parse('{"label":"file permissions","permalink":"/references/tags/file-permissions","allTagsPath":"/references/tags","count":3,"items":[{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","permalink":"/references/Lightning CLI/file-permissions-and-ownership"},{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/866d553a.15ab360d.js b/assets/js/866d553a.15ab360d.js new file mode 100644 index 000000000..6fcbe4d26 --- /dev/null +++ b/assets/js/866d553a.15ab360d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8668],{1534:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>d,toc:()=>o});var t=s(5893),l=s(1151),i=s(3872);const a={title:"Frequently used commands for Native setup",slug:"frequently-used-commands-for-native-setup",hide_title:!0,tags:["commands","cli","lightning"]},r=void 0,d={id:"Lightning CLI/frequently-used-commands-for-native-setup",title:"Frequently used commands for Native setup",description:"TL;DR",source:"@site/references/Lightning CLI/frequently-used-commands-for-native-setup.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/frequently-used-commands-for-native-setup",permalink:"/references/Lightning CLI/frequently-used-commands-for-native-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/frequently-used-commands-for-native-setup.md",tags:[{label:"commands",permalink:"/references/tags/commands"},{label:"cli",permalink:"/references/tags/cli"},{label:"lightning",permalink:"/references/tags/lightning"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Frequently used commands for Native setup",slug:"frequently-used-commands-for-native-setup",hide_title:!0,tags:["commands","cli","lightning"]},sidebar:"defaultSidebar",previous:{title:"File permissions and Ownership",permalink:"/references/Lightning CLI/file-permissions-and-ownership"},next:{title:"Keys not found",permalink:"/references/Lightning CLI/keys-not-found"}},c={},o=[{value:"TL;DR",id:"tldr",level:2},{value:"Systemctl Service Management",id:"systemctl-service-management",level:2},{value:"Enable",id:"enable",level:3},{value:"Disable",id:"disable",level:3},{value:"Start",id:"start",level:3},{value:"Stop",id:"stop",level:3},{value:"Restart",id:"restart",level:3},{value:"Status",id:"status",level:3},{value:"Lightning CLI",id:"lightning-cli",level:2},{value:"Show keys for user config",id:"show-keys-for-user-config",level:3},{value:"Diagnostic tools",id:"diagnostic-tools",level:2},{value:"Extended verification health check",id:"extended-verification-health-check",level:3},{value:"Health status",id:"health-status",level:3},{value:"Node details",id:"node-details",level:3},{value:"Analyzing Logs",id:"analyzing-logs",level:2},{value:"Standard output",id:"standard-output",level:3},{value:"Standard error",id:"standard-error",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"tldr",children:"TL;DR"}),"\n",(0,t.jsxs)(n.p,{children:["Most assisted processes are available through the ",(0,t.jsx)(n.code,{children:"get.fleek.network"})," command, where you can select to install, do a health check amongst others."]}),"\n",(0,t.jsx)(n.p,{children:"To access the menu options run the command in the shell prompt:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"curl https://get.fleek.network | bash\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["For Docker setup users read the corresponding version in the section ",(0,t.jsx)(n.a,{href:"/references/Docker/frequently-used-commands-for-docker-setup",children:"Frequently Used Commands for Docker Setup"})]})}),"\n",(0,t.jsx)(n.h2,{id:"systemctl-service-management",children:"Systemctl Service Management"}),"\n",(0,t.jsx)(n.h3,{id:"enable",children:"Enable"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl enable lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"disable",children:"Disable"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl enable lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"start",children:"Start"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl start lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"stop",children:"Stop"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl stop lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"restart",children:"Restart"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl restart lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"status",children:"Status"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl status lightning\n"})}),"\n",(0,t.jsx)(n.h2,{id:"lightning-cli",children:"Lightning CLI"}),"\n",(0,t.jsx)(n.h3,{id:"show-keys-for-user-config",children:"Show keys for user config"}),"\n",(0,t.jsxs)(n.p,{children:["Show the keys by running the sub-commands ",(0,t.jsx)(n.code,{children:"keys show"})," and declaring the configuration file location:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"lgtn -c /home/<USERNAME>/.lightning/config.toml keys show\n"})}),"\n",(0,t.jsx)(n.h2,{id:"diagnostic-tools",children:"Diagnostic tools"}),"\n",(0,t.jsx)(n.h3,{id:"extended-verification-health-check",children:"Extended verification health check"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"curl -sS https://get.fleek.network/healthcheck | bash\n"})}),"\n",(0,t.jsx)(n.h3,{id:"health-status",children:"Health status"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:'curl -w "\\n" localhost:4230/health\n'})}),"\n",(0,t.jsx)(n.h3,{id:"node-details",children:"Node details"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"curl -sS https://get.fleek.network/node_details | bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"analyzing-logs",children:"Analyzing Logs"}),"\n",(0,t.jsx)(n.h3,{id:"standard-output",children:"Standard output"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/output.log\n"})}),"\n",(0,t.jsx)(n.h3,{id:"standard-error",children:"Standard error"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/diagnostic.log\n"})}),"\n",(0,t.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},3872:(e,n,s)=>{s.d(n,{Z:()=>l});s(7294);var t=s(5893);const l=e=>{let{image:n,name:s,title:l,url:i,communityMember:a=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:i,target:"_blank",alt:s,children:(0,t.jsx)("img",{src:n,alt:s})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:i,target:"_blank",alt:s,children:s})}),(0,t.jsx)("span",{className:"title",children:l}),(0,t.jsxs)("span",{className:"discord",children:[a?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,s)=>{s.d(n,{Z:()=>r,a:()=>a});var t=s(7294);const l={},i=t.createContext(l);function a(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:a(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/866d553a.cbd99266.js b/assets/js/866d553a.cbd99266.js deleted file mode 100644 index b55881d91..000000000 --- a/assets/js/866d553a.cbd99266.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8668],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var o=a.createContext({}),c=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return a.createElement(o.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(n),p=r,g=u["".concat(o,".").concat(p)]||u[p]||m[p]||l;return n?a.createElement(g,s(s({ref:t},d),{},{components:n})):a.createElement(g,s({ref:t},d))}));function g(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,s=new Array(l);s[0]=p;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[u]="string"==typeof e?e:r,s[1]=i;for(var c=2;c<l;c++)s[c]=n[c];return a.createElement.apply(null,s)}return a.createElement.apply(null,n)}p.displayName="MDXCreateElement"},5346:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),l=n(3872);const s={title:"Frequently used commands for Native setup",slug:"frequently-used-commands-for-native-setup",hide_title:!0,tags:["commands","cli","lightning"]},i=void 0,o={unversionedId:"Lightning CLI/frequently-used-commands-for-native-setup",id:"Lightning CLI/frequently-used-commands-for-native-setup",title:"Frequently used commands for Native setup",description:"TL;DR",source:"@site/references/Lightning CLI/frequently-used-commands-for-native-setup.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/frequently-used-commands-for-native-setup",permalink:"/references/Lightning CLI/frequently-used-commands-for-native-setup",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/frequently-used-commands-for-native-setup.md",tags:[{label:"commands",permalink:"/references/tags/commands"},{label:"cli",permalink:"/references/tags/cli"},{label:"lightning",permalink:"/references/tags/lightning"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Frequently used commands for Native setup",slug:"frequently-used-commands-for-native-setup",hide_title:!0,tags:["commands","cli","lightning"]},sidebar:"defaultSidebar",previous:{title:"File permissions and Ownership",permalink:"/references/Lightning CLI/file-permissions-and-ownership"},next:{title:"Keys not found",permalink:"/references/Lightning CLI/keys-not-found"}},c={},d=[{value:"TL;DR",id:"tldr",level:2},{value:"Systemctl Service Management",id:"systemctl-service-management",level:2},{value:"Enable",id:"enable",level:3},{value:"Disable",id:"disable",level:3},{value:"Start",id:"start",level:3},{value:"Stop",id:"stop",level:3},{value:"Restart",id:"restart",level:3},{value:"Status",id:"status",level:3},{value:"Lightning CLI",id:"lightning-cli",level:2},{value:"Show keys for user config",id:"show-keys-for-user-config",level:3},{value:"Diagnostic tools",id:"diagnostic-tools",level:2},{value:"Extended verification health check",id:"extended-verification-health-check",level:3},{value:"Health status",id:"health-status",level:3},{value:"Node details",id:"node-details",level:3},{value:"Analyzing Logs",id:"analyzing-logs",level:2},{value:"Standard output",id:"standard-output",level:3},{value:"Standard error",id:"standard-error",level:3}],u={toc:d},m="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"tldr"},"TL;DR"),(0,r.kt)("p",null,"Most assisted processes are available through the ",(0,r.kt)("inlineCode",{parentName:"p"},"get.fleek.network")," command, where you can select to install, do a health check amongst others."),(0,r.kt)("p",null,"To access the menu options run the command in the shell prompt:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://get.fleek.network | bash\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For Docker setup users read the corresponding version in the section ",(0,r.kt)("a",{parentName:"p",href:"/references/Docker/frequently-used-commands-for-docker-setup"},"Frequently Used Commands for Docker Setup"))),(0,r.kt)("h2",{id:"systemctl-service-management"},"Systemctl Service Management"),(0,r.kt)("h3",{id:"enable"},"Enable"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable lightning\n")),(0,r.kt)("h3",{id:"disable"},"Disable"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable lightning\n")),(0,r.kt)("h3",{id:"start"},"Start"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning\n")),(0,r.kt)("h3",{id:"stop"},"Stop"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl stop lightning\n")),(0,r.kt)("h3",{id:"restart"},"Restart"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl restart lightning\n")),(0,r.kt)("h3",{id:"status"},"Status"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl status lightning\n")),(0,r.kt)("h2",{id:"lightning-cli"},"Lightning CLI"),(0,r.kt)("h3",{id:"show-keys-for-user-config"},"Show keys for user config"),(0,r.kt)("p",null,"Show the keys by running the sub-commands ",(0,r.kt)("inlineCode",{parentName:"p"},"keys show")," and declaring the configuration file location:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"lgtn -c /home/<USERNAME>/.lightning/config.toml keys show\n")),(0,r.kt)("h2",{id:"diagnostic-tools"},"Diagnostic tools"),(0,r.kt)("h3",{id:"extended-verification-health-check"},"Extended verification health check"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl -sS https://get.fleek.network/healthcheck | bash\n")),(0,r.kt)("h3",{id:"health-status"},"Health status"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'curl -w "\\n" localhost:4230/health\n')),(0,r.kt)("h3",{id:"node-details"},"Node details"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl -sS https://get.fleek.network/node_details | bash\n")),(0,r.kt)("h2",{id:"analyzing-logs"},"Analyzing Logs"),(0,r.kt)("h3",{id:"standard-output"},"Standard output"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/output.log\n")),(0,r.kt)("h3",{id:"standard-error"},"Standard error"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/diagnostic.log\n")),(0,r.kt)(l.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}p.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(7294);const r=e=>{let{image:t,name:n,title:r,url:l,communityMember:s=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:l,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:l,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},r),a.createElement("span",{className:"discord"},s?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/86c3bd1d.e7c31aca.js b/assets/js/86c3bd1d.9115d118.js similarity index 93% rename from assets/js/86c3bd1d.e7c31aca.js rename to assets/js/86c3bd1d.9115d118.js index 3761845c0..175aa51de 100644 --- a/assets/js/86c3bd1d.e7c31aca.js +++ b/assets/js/86c3bd1d.9115d118.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2421],{813:e=>{e.exports=JSON.parse('{"label":"user service","permalink":"/references/tags/user-service","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2421],{813:e=>{e.exports=JSON.parse('{"label":"user service","permalink":"/references/tags/user-service","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/8a92e787.4f946d9f.js b/assets/js/8a92e787.4f946d9f.js new file mode 100644 index 000000000..f52f0ae5b --- /dev/null +++ b/assets/js/8a92e787.4f946d9f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2517],{6739:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var t=n(5893),r=n(1151),o=n(3872);const i={title:"Shutting down persistance",slug:"shutting-down-persistance",hide_title:!0,tags:["reference","shutdown","frozen","idle","service error","systemctl","systemd"]},c=void 0,l={id:"Systemd/shutting-down-persistance",title:"Shutting down persistance",description:"Systemd Service as frozen or idle",source:"@site/references/Systemd/shutting-down-persistance.md",sourceDirName:"Systemd",slug:"/Systemd/shutting-down-persistance",permalink:"/references/Systemd/shutting-down-persistance",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Systemd/shutting-down-persistance.md",tags:[{label:"reference",permalink:"/references/tags/reference"},{label:"shutdown",permalink:"/references/tags/shutdown"},{label:"frozen",permalink:"/references/tags/frozen"},{label:"idle",permalink:"/references/tags/idle"},{label:"service error",permalink:"/references/tags/service-error"},{label:"systemctl",permalink:"/references/tags/systemctl"},{label:"systemd",permalink:"/references/tags/systemd"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Shutting down persistance",slug:"shutting-down-persistance",hide_title:!0,tags:["reference","shutdown","frozen","idle","service error","systemctl","systemd"]},sidebar:"defaultSidebar",previous:{title:"Service keeps running after shutdown",permalink:"/references/Systemd/service-keeps-running-after-shutdown"},next:{title:"User service",permalink:"/references/Systemd/user-service"}},a={},d=[{value:"Systemd Service as frozen or idle",id:"systemd-service-as-frozen-or-idle",level:2}];function h(e){const s={code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.h2,{id:"systemd-service-as-frozen-or-idle",children:"Systemd Service as frozen or idle"}),"\n",(0,t.jsxs)(s.p,{children:["If you have a ",(0,t.jsx)(s.code,{children:"Shutting node down"})," message on the service log, the process is likely failing to respond to Systemd shut down command by failing to terminate all the child processes that were started by the service."]}),"\n",(0,t.jsx)(s.p,{children:"The logs should be similar to the following:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: XsE9KtedDRUGv22MLHvy8qcc52QsWGWJYY1LBnWhglg=\n2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: zBmZaycvQsdFRfe0p5Rig/KgyYPD4yNKQTPDo7JrugM=\n2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################\n2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************\nRPC server starting up\nlistening on 0.0.0.0:4230\nShutting node down.\nShutting node down.\nShutting node down.\nShutting node down.\nShutting node down.\n"})}),"\n",(0,t.jsxs)(s.p,{children:["To resolve this issue, start by executing a new ",(0,t.jsx)(s.code,{children:"shutdown"})," command as follows:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"systemctl stop lightning\n"})}),"\n",(0,t.jsxs)(s.p,{children:["If you need to delegate to root, then use the ",(0,t.jsx)(s.strong,{children:"sudo"})," keyword, as follows:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"sudo systemctl stop lightning\n"})}),"\n",(0,t.jsx)(s.p,{children:"Once completed, clear the logs to avoid confusion as the log aggregates messages past and current."}),"\n",(0,t.jsx)(s.p,{children:"Delete all the log files (output.log and diagnostic.log) by running:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"sudo rm -f /var/log/lightning/*.log\n"})}),"\n",(0,t.jsx)(s.p,{children:"Launch the service:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"systemctl start lightning\n"})}),"\n",(0,t.jsxs)(s.p,{children:["If you need to delegate to root, then use the ",(0,t.jsx)(s.strong,{children:"sudo"})," keyword, as follows:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"sudo systemctl start lightning\n"})}),"\n",(0,t.jsx)(s.p,{children:"You can watch the log output of the service by running:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"tail -f /var/log/lightning/output.log\n"})}),"\n",(0,t.jsx)(s.p,{children:"The output should be similar to:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"2023-09-12 13:53:51 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################\n2023-09-12 13:53:51 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************\n"})}),"\n",(0,t.jsx)(s.p,{children:"Alternatively, you can watch the diagnostic.log"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-sh",children:"tail -f /var/log/lightning/diagnostic.log\n"})}),"\n",(0,t.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},3872:(e,s,n)=>{n.d(s,{Z:()=>r});n(7294);var t=n(5893);const r=e=>{let{image:s,name:n,title:r,url:o,communityMember:i=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:o,target:"_blank",alt:n,children:(0,t.jsx)("img",{src:s,alt:n})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:o,target:"_blank",alt:n,children:n})}),(0,t.jsx)("span",{className:"title",children:r}),(0,t.jsxs)("span",{className:"discord",children:[i?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,s,n)=>{n.d(s,{Z:()=>c,a:()=>i});var t=n(7294);const r={},o=t.createContext(r);function i(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8a92e787.a068730e.js b/assets/js/8a92e787.a068730e.js deleted file mode 100644 index 2d3ecbc22..000000000 --- a/assets/js/8a92e787.a068730e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2517],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){s(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,s=function(e,t){if(null==e)return{};var n,r,s={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(s[n]=e[n]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s}var c=r.createContext({}),i=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=i(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,s=e.mdxType,a=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=i(n),g=s,m=d["".concat(c,".").concat(g)]||d[g]||p[g]||a;return n?r.createElement(m,o(o({ref:t},u),{},{components:n})):r.createElement(m,o({ref:t},u))}));function m(e,t){var n=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=n.length,o=new Array(a);o[0]=g;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:s,o[1]=l;for(var i=2;i<a;i++)o[i]=n[i];return r.createElement.apply(null,o)}return r.createElement.apply(null,n)}g.displayName="MDXCreateElement"},2087:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>l,default:()=>g,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var r=n(7462),s=(n(7294),n(3905)),a=n(3872);const o={title:"Shutting down persistance",slug:"shutting-down-persistance",hide_title:!0,tags:["reference","shutdown","frozen","idle","service error","systemctl","systemd"]},l=void 0,c={unversionedId:"Systemd/shutting-down-persistance",id:"Systemd/shutting-down-persistance",title:"Shutting down persistance",description:"Systemd Service as frozen or idle",source:"@site/references/Systemd/shutting-down-persistance.md",sourceDirName:"Systemd",slug:"/Systemd/shutting-down-persistance",permalink:"/references/Systemd/shutting-down-persistance",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Systemd/shutting-down-persistance.md",tags:[{label:"reference",permalink:"/references/tags/reference"},{label:"shutdown",permalink:"/references/tags/shutdown"},{label:"frozen",permalink:"/references/tags/frozen"},{label:"idle",permalink:"/references/tags/idle"},{label:"service error",permalink:"/references/tags/service-error"},{label:"systemctl",permalink:"/references/tags/systemctl"},{label:"systemd",permalink:"/references/tags/systemd"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Shutting down persistance",slug:"shutting-down-persistance",hide_title:!0,tags:["reference","shutdown","frozen","idle","service error","systemctl","systemd"]},sidebar:"defaultSidebar",previous:{title:"Service keeps running after shutdown",permalink:"/references/Systemd/service-keeps-running-after-shutdown"},next:{title:"User service",permalink:"/references/Systemd/user-service"}},i={},u=[{value:"Systemd Service as frozen or idle",id:"systemd-service-as-frozen-or-idle",level:2}],d={toc:u},p="wrapper";function g(e){let{components:t,...n}=e;return(0,s.kt)(p,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"systemd-service-as-frozen-or-idle"},"Systemd Service as frozen or idle"),(0,s.kt)("p",null,"If you have a ",(0,s.kt)("inlineCode",{parentName:"p"},"Shutting node down")," message on the service log, the process is likely failing to respond to Systemd shut down command by failing to terminate all the child processes that were started by the service."),(0,s.kt)("p",null,"The logs should be similar to the following:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: XsE9KtedDRUGv22MLHvy8qcc52QsWGWJYY1LBnWhglg=\n2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: zBmZaycvQsdFRfe0p5Rig/KgyYPD4yNKQTPDo7JrugM=\n2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################\n2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************\nRPC server starting up\nlistening on 0.0.0.0:4230\nShutting node down.\nShutting node down.\nShutting node down.\nShutting node down.\nShutting node down.\n")),(0,s.kt)("p",null,"To resolve this issue, start by executing a new ",(0,s.kt)("inlineCode",{parentName:"p"},"shutdown")," command as follows:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl stop lightning\n")),(0,s.kt)("p",null,"If you need to delegate to root, then use the ",(0,s.kt)("strong",{parentName:"p"},"sudo")," keyword, as follows:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl stop lightning\n")),(0,s.kt)("p",null,"Once completed, clear the logs to avoid confusion as the log aggregates messages past and current."),(0,s.kt)("p",null,"Delete all the log files (output.log and diagnostic.log) by running:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"sudo rm -f /var/log/lightning/*.log\n")),(0,s.kt)("p",null,"Launch the service:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl start lightning\n")),(0,s.kt)("p",null,"If you need to delegate to root, then use the ",(0,s.kt)("strong",{parentName:"p"},"sudo")," keyword, as follows:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning\n")),(0,s.kt)("p",null,"You can watch the log output of the service by running:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/output.log\n")),(0,s.kt)("p",null,"The output should be similar to:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"2023-09-12 13:53:51 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################\n2023-09-12 13:53:51 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************\n")),(0,s.kt)("p",null,"Alternatively, you can watch the diagnostic.log"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/diagnostic.log\n")),(0,s.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}g.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(7294);const s=e=>{let{image:t,name:n,title:s,url:a,communityMember:o=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:a,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:a,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},s),r.createElement("span",{className:"discord"},o?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/8cf21e85.eb0c3500.js b/assets/js/8cf21e85.f316391c.js similarity index 79% rename from assets/js/8cf21e85.eb0c3500.js rename to assets/js/8cf21e85.f316391c.js index 3fc1fb50c..cfa9d44c9 100644 --- a/assets/js/8cf21e85.eb0c3500.js +++ b/assets/js/8cf21e85.f316391c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6854],{90:e=>{e.exports=JSON.parse('{"label":"client","permalink":"/docs/tags/client","allTagsPath":"/docs/tags","count":1,"items":[{"id":"develop/client","title":"Client","description":"","permalink":"/docs/develop/client"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6854],{90:e=>{e.exports=JSON.parse('{"label":"client","permalink":"/docs/tags/client","allTagsPath":"/docs/tags","count":1,"items":[{"id":"develop/client","title":"Client","description":"","permalink":"/docs/develop/client"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/8def2dd5.46757c8d.js b/assets/js/8def2dd5.46757c8d.js deleted file mode 100644 index 2bc564046..000000000 --- a/assets/js/8def2dd5.46757c8d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[382],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},h=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(r),h=o,m=p["".concat(s,".").concat(h)]||p[h]||u[h]||a;return r?n.createElement(m,i(i({ref:t},d),{},{components:r})):n.createElement(m,i({ref:t},d))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:o,i[1]=l;for(var c=2;c<a;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}h.displayName="MDXCreateElement"},3872:(e,t,r)=>{r.d(t,{Z:()=>o});var n=r(7294);const o=e=>{let{image:t,name:r,title:o,url:a,communityMember:i=!1}=e;return n.createElement("section",{className:"author_card"},n.createElement("div",null,n.createElement("span",{className:"avatar"},n.createElement("a",{href:a,target:"_blank",alt:r},n.createElement("img",{src:t,alt:r}))),n.createElement("div",null,n.createElement("span",{className:"name"},n.createElement("a",{href:a,target:"_blank",alt:r},r)),n.createElement("span",{className:"title"},o),n.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",n.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},8242:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var n=r(7462),o=(r(7294),r(3905)),a=r(3872);const i={title:"Introduction",slug:"introduction",hide_title:!0,description:"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.",tags:["about","learn","fleek network","whitepaper"]},l=void 0,s={unversionedId:"learn/index",id:"learn/index",title:"Introduction",description:"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.",source:"@site/docs/learn/index.md",sourceDirName:"learn",slug:"/learn/introduction",permalink:"/docs/learn/introduction",draft:!1,tags:[{label:"about",permalink:"/docs/tags/about"},{label:"learn",permalink:"/docs/tags/learn"},{label:"fleek network",permalink:"/docs/tags/fleek-network"},{label:"whitepaper",permalink:"/docs/tags/whitepaper"}],version:"current",frontMatter:{title:"Introduction",slug:"introduction",hide_title:!0,description:"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.",tags:["about","learn","fleek network","whitepaper"]},sidebar:"docs",previous:{title:"About",permalink:"/docs/"},next:{title:"The Network",permalink:"/docs/learn/the-network"}},c={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Why does it exist?",id:"why-does-it-exist",level:2},{value:"Motivation",id:"motivation",level:3},{value:"How does it work?",id:"how-does-it-work",level:2}],p={toc:d},u="wrapper";function h(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction"},"Introduction"),(0,o.kt)("p",null,"The Core of Fleek Network offers a foundational layer to enable developers to build and deploy Edge Services efficiently. It abstracts away the development complexities of consensus, cryptography, storage and peer-to-peer networking, etc, to simplify things conceptually. It frees developers and teams to focus on what matters the most to reach business goals."),(0,o.kt)("p",null,"In contrast, end users have access to network services on the edge, that provide different kinds of computation and data processing features."),(0,o.kt)("p",null,"We'll take a brief look into ",(0,o.kt)("a",{parentName:"p",href:"#why-does-it-exist"},"why does it exist"),", ",(0,o.kt)("a",{parentName:"p",href:"#how-does-it-work"},"how does it work"),", and learn about ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn/services"},"services"),", amongst other topics."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"For a deep dive into Fleek Network, check the ",(0,o.kt)("a",{parentName:"p",href:"/docs/whitepaper"},"whitepaper")," section.")),(0,o.kt)("h2",{id:"why-does-it-exist"},"Why does it exist?"),(0,o.kt)("p",null,"Many Web3 products rely on the conventional models of centralized cloud infrastructure, due to the lack of corresponding alternatives."),(0,o.kt)("p",null,"Some of the most popular Web3 products rely on content delivery and edge computing provided by the monopolized cloud market. Unlike a decentralized system, the opposite is more vulnerable to attacks, as computation and data can be easily manipulated to suit the monopoly's business goals."),(0,o.kt)("p",null,"Meanwhile, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage, offering a sustainable alternative to traditional centralized architectures."),(0,o.kt)("p",null,"The Fleek Network provides the alternative, paving the way to a decentralized edge computing future that is secure, transparent and accessible to everybody in the world."),(0,o.kt)("h3",{id:"motivation"},"Motivation"),(0,o.kt)("p",null,"The Fleek Network team was motivated to create a decentralized Edge Platform due to the current infrastructure trends, user concerns and demands. The modern web is shifting from the cloud to the edge, which is a reflection of the internet's growing user base and the need for low latency for users worldwide."),(0,o.kt)("p",null,"This development is a crucial and necessary step towards significantly enhancing the reliability, efficiency, and decentralization of Web3 applications and platforms, such as the next iteration of the Fleek platform."),(0,o.kt)("h2",{id:"how-does-it-work"},"How does it work?"),(0,o.kt)("p",null,"When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated."),(0,o.kt)("p",null,"Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed."),(0,o.kt)("p",null,"The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the epoch (about 24h). This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly."),(0,o.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8def2dd5.8faef833.js b/assets/js/8def2dd5.8faef833.js new file mode 100644 index 000000000..c65279573 --- /dev/null +++ b/assets/js/8def2dd5.8faef833.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[382],{4610:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var o=n(5893),r=n(1151),a=n(3872);const i={title:"Introduction",slug:"introduction",hide_title:!0,description:"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.",tags:["about","learn","fleek network","whitepaper"]},s=void 0,d={id:"learn/index",title:"Introduction",description:"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.",source:"@site/docs/learn/index.md",sourceDirName:"learn",slug:"/learn/introduction",permalink:"/docs/learn/introduction",draft:!1,unlisted:!1,tags:[{label:"about",permalink:"/docs/tags/about"},{label:"learn",permalink:"/docs/tags/learn"},{label:"fleek network",permalink:"/docs/tags/fleek-network"},{label:"whitepaper",permalink:"/docs/tags/whitepaper"}],version:"current",frontMatter:{title:"Introduction",slug:"introduction",hide_title:!0,description:"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.",tags:["about","learn","fleek network","whitepaper"]},sidebar:"docs",previous:{title:"About",permalink:"/docs/"},next:{title:"The Network",permalink:"/docs/learn/the-network"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Why does it exist?",id:"why-does-it-exist",level:2},{value:"Motivation",id:"motivation",level:3},{value:"How does it work?",id:"how-does-it-work",level:2}];function h(e){const t={a:"a",admonition:"admonition",h2:"h2",h3:"h3",p:"p",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"introduction",children:"Introduction"}),"\n",(0,o.jsx)(t.p,{children:"The Core of Fleek Network offers a foundational layer to enable developers to build and deploy Edge Services efficiently. It abstracts away the development complexities of consensus, cryptography, storage and peer-to-peer networking, etc, to simplify things conceptually. It frees developers and teams to focus on what matters the most to reach business goals."}),"\n",(0,o.jsx)(t.p,{children:"In contrast, end users have access to network services on the edge, that provide different kinds of computation and data processing features."}),"\n",(0,o.jsxs)(t.p,{children:["We'll take a brief look into ",(0,o.jsx)(t.a,{href:"#why-does-it-exist",children:"why does it exist"}),", ",(0,o.jsx)(t.a,{href:"#how-does-it-work",children:"how does it work"}),", and learn about ",(0,o.jsx)(t.a,{href:"/docs/learn/services",children:"services"}),", amongst other topics."]}),"\n",(0,o.jsx)(t.admonition,{type:"tip",children:(0,o.jsxs)(t.p,{children:["For a deep dive into Fleek Network, check the ",(0,o.jsx)(t.a,{href:"/docs/whitepaper",children:"whitepaper"})," section."]})}),"\n",(0,o.jsx)(t.h2,{id:"why-does-it-exist",children:"Why does it exist?"}),"\n",(0,o.jsx)(t.p,{children:"Many Web3 products rely on the conventional models of centralized cloud infrastructure, due to the lack of corresponding alternatives."}),"\n",(0,o.jsx)(t.p,{children:"Some of the most popular Web3 products rely on content delivery and edge computing provided by the monopolized cloud market. Unlike a decentralized system, the opposite is more vulnerable to attacks, as computation and data can be easily manipulated to suit the monopoly's business goals."}),"\n",(0,o.jsx)(t.p,{children:"Meanwhile, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage, offering a sustainable alternative to traditional centralized architectures."}),"\n",(0,o.jsx)(t.p,{children:"The Fleek Network provides the alternative, paving the way to a decentralized edge computing future that is secure, transparent and accessible to everybody in the world."}),"\n",(0,o.jsx)(t.h3,{id:"motivation",children:"Motivation"}),"\n",(0,o.jsx)(t.p,{children:"The Fleek Network team was motivated to create a decentralized Edge Platform due to the current infrastructure trends, user concerns and demands. The modern web is shifting from the cloud to the edge, which is a reflection of the internet's growing user base and the need for low latency for users worldwide."}),"\n",(0,o.jsx)(t.p,{children:"This development is a crucial and necessary step towards significantly enhancing the reliability, efficiency, and decentralization of Web3 applications and platforms, such as the next iteration of the Fleek platform."}),"\n",(0,o.jsx)(t.h2,{id:"how-does-it-work",children:"How does it work?"}),"\n",(0,o.jsx)(t.p,{children:"When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated."}),"\n",(0,o.jsx)(t.p,{children:"Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed."}),"\n",(0,o.jsx)(t.p,{children:"The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the epoch (about 24h). This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly."}),"\n",(0,o.jsx)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},3872:(e,t,n)=>{n.d(t,{Z:()=>r});n(7294);var o=n(5893);const r=e=>{let{image:t,name:n,title:r,url:a,communityMember:i=!1}=e;return(0,o.jsx)("section",{className:"author_card",children:(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"avatar",children:(0,o.jsx)("a",{href:a,target:"_blank",alt:n,children:(0,o.jsx)("img",{src:t,alt:n})})}),(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"name",children:(0,o.jsx)("a",{href:a,target:"_blank",alt:n,children:n})}),(0,o.jsx)("span",{className:"title",children:r}),(0,o.jsxs)("span",{className:"discord",children:[i?"Join our community on":"Got questions? Find us on"," ",(0,o.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,t,n)=>{n.d(t,{Z:()=>s,a:()=>i});var o=n(7294);const r={},a=o.createContext(r);function i(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/90decb6d.9b736857.js b/assets/js/90decb6d.17716680.js similarity index 92% rename from assets/js/90decb6d.9b736857.js rename to assets/js/90decb6d.17716680.js index 17ed539d8..dcf9ee746 100644 --- a/assets/js/90decb6d.9b736857.js +++ b/assets/js/90decb6d.17716680.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9649],{2570:e=>{e.exports=JSON.parse('{"label":"private keys","permalink":"/guides/tags/private-keys","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9649],{2570:e=>{e.exports=JSON.parse('{"label":"private keys","permalink":"/guides/tags/private-keys","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","permalink":"/guides/Node Operators/managing-the-keystore"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/933a69d3.580d79a0.js b/assets/js/933a69d3.ba52a263.js similarity index 92% rename from assets/js/933a69d3.580d79a0.js rename to assets/js/933a69d3.ba52a263.js index cd2165f30..5a25862f9 100644 --- a/assets/js/933a69d3.580d79a0.js +++ b/assets/js/933a69d3.ba52a263.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7813],{1853:t=>{t.exports=JSON.parse('{"label":"Getting Started","permalink":"/docs/tags/getting-started","allTagsPath":"/docs/tags","count":2,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7813],{1853:t=>{t.exports=JSON.parse('{"label":"Getting Started","permalink":"/docs/tags/getting-started","allTagsPath":"/docs/tags","count":2,"items":[{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.3edf634b.js b/assets/js/935f2afb.3edf634b.js new file mode 100644 index 000000000..582ced35c --- /dev/null +++ b/assets/js/935f2afb.3edf634b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"About","href":"/docs/","docId":"index","unlisted":false},{"type":"category","label":"Learn","collapsed":true,"collapsible":true,"items":[{"type":"link","label":"Introduction","href":"/docs/learn/introduction","docId":"learn/index","unlisted":false},{"type":"link","label":"The Network","href":"/docs/learn/the-network","docId":"learn/the-network","unlisted":false},{"type":"link","label":"Delivery Acknowledgements","href":"/docs/learn/delivery-acknowledgements","docId":"learn/delivery-acknowledgements","unlisted":false},{"type":"link","label":"Token and economics","href":"/docs/learn/token-and-economics","docId":"learn/token-and-economics","unlisted":false},{"type":"link","label":"Services","href":"/docs/learn/services","docId":"learn/services","unlisted":false},{"type":"link","label":"Developers","href":"/docs/learn/developers","docId":"learn/developers","unlisted":false}]},{"type":"category","label":"Node","collapsed":true,"collapsible":true,"items":[{"type":"link","label":"Overview","href":"/docs/node/overview","docId":"node/index","unlisted":false},{"type":"link","label":"Requirements","href":"/docs/node/requirements","docId":"node/requirements","unlisted":false},{"type":"link","label":"Testnet onboarding","href":"/docs/node/testnet-onboarding","docId":"node/testnet-onboarding","unlisted":false},{"type":"link","label":"Install","href":"/docs/node/install","docId":"node/install","unlisted":false},{"type":"link","label":"Health check","href":"/docs/node/health-check","docId":"node/health-check","unlisted":false},{"type":"link","label":"Analyzing logs","href":"/docs/node/analyzing-logs","docId":"node/analyzing-logs","unlisted":false},{"type":"link","label":"Systemd Service","href":"/docs/node/systemd-service","docId":"node/systemd-service","unlisted":false},{"type":"link","label":"Lightning CLI","href":"/docs/node/lightning-cli","docId":"node/lightning-cli","unlisted":false}]},{"type":"link","label":"Roadmap","href":"/docs/roadmap","docId":"roadmap","unlisted":false},{"type":"category","label":"Open-source","collapsed":true,"collapsible":true,"items":[{"type":"link","label":"Code of Conduct","href":"/docs/Open-source/code-of-conduct","docId":"Open-source/code-of-conduct","unlisted":false},{"type":"link","label":"Contributing","href":"/docs/Open-source/contributing","docId":"Open-source/contributing","unlisted":false},{"type":"link","label":"Repositories","href":"/docs/Open-source/repositories","docId":"Open-source/repositories","unlisted":false}]},{"type":"link","label":"Whitepaper","href":"/docs/whitepaper","docId":"whitepaper","unlisted":false}]},"docs":{"develop/client":{"id":"develop/client","title":"Client","description":""},"develop/index":{"id":"develop/index","title":"Overview","description":"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network."},"develop/json-rpc":{"id":"develop/json-rpc","title":"JSON-RPC","description":""},"develop/service-development":{"id":"develop/service-development","title":"Service development","description":""},"index":{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","sidebar":"docs"},"learn/delivery-acknowledgements":{"id":"learn/delivery-acknowledgements","title":"Delivery Acknowledgements","description":"Dive into Fleek Network\'s Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.","sidebar":"docs"},"learn/developers":{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","sidebar":"docs"},"learn/index":{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","sidebar":"docs"},"learn/services":{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","sidebar":"docs"},"learn/the-network":{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","sidebar":"docs"},"learn/token-and-economics":{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","sidebar":"docs"},"node/analyzing-logs":{"id":"node/analyzing-logs","title":"Analyzing logs","description":"Analyzing Logs","sidebar":"docs"},"node/configuration":{"id":"node/configuration","title":"Configuration","description":"TODO: Configuration"},"node/diagnostics":{"id":"node/diagnostics","title":"Diagnostics","description":"TODO: Diagnostics"},"node/health-check":{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","sidebar":"docs"},"node/index":{"id":"node/index","title":"Overview","description":"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network\'s growth.","sidebar":"docs"},"node/install":{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","sidebar":"docs"},"node/lightning-cli":{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","sidebar":"docs"},"node/requirements":{"id":"node/requirements","title":"Requirements","description":"The requirements for the server specifications on which the Fleek Network Node can be installed and run.","sidebar":"docs"},"node/systemd-service":{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","sidebar":"docs"},"node/testnet-onboarding":{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","sidebar":"docs"},"Open-source":{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase."},"Open-source/code-of-conduct":{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","sidebar":"docs"},"Open-source/contributing":{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","sidebar":"docs"},"Open-source/repositories":{"id":"Open-source/repositories","title":"Repositories","description":"Repositories","sidebar":"docs"},"roadmap":{"id":"roadmap","title":"Roadmap","description":"Fleek Network\'s high-level roadmap per stage. Devnet, Testnet, and Mainnet.","sidebar":"docs"},"whitepaper":{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","sidebar":"docs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.73c88fc7.js b/assets/js/935f2afb.73c88fc7.js deleted file mode 100644 index 7bb8353cc..000000000 --- a/assets/js/935f2afb.73c88fc7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"About","href":"/docs/","docId":"index"},{"type":"category","label":"Learn","collapsed":true,"collapsible":true,"items":[{"type":"link","label":"Introduction","href":"/docs/learn/introduction","docId":"learn/index"},{"type":"link","label":"The Network","href":"/docs/learn/the-network","docId":"learn/the-network"},{"type":"link","label":"Delivery Acknowledgements","href":"/docs/learn/delivery-acknowledgements","docId":"learn/delivery-acknowledgements"},{"type":"link","label":"Token and economics","href":"/docs/learn/token-and-economics","docId":"learn/token-and-economics"},{"type":"link","label":"Services","href":"/docs/learn/services","docId":"learn/services"},{"type":"link","label":"Developers","href":"/docs/learn/developers","docId":"learn/developers"}]},{"type":"category","label":"Node","collapsed":true,"collapsible":true,"items":[{"type":"link","label":"Overview","href":"/docs/node/overview","docId":"node/index"},{"type":"link","label":"Requirements","href":"/docs/node/requirements","docId":"node/requirements"},{"type":"link","label":"Testnet onboarding","href":"/docs/node/testnet-onboarding","docId":"node/testnet-onboarding"},{"type":"link","label":"Install","href":"/docs/node/install","docId":"node/install"},{"type":"link","label":"Health check","href":"/docs/node/health-check","docId":"node/health-check"},{"type":"link","label":"Analyzing logs","href":"/docs/node/analyzing-logs","docId":"node/analyzing-logs"},{"type":"link","label":"Systemd Service","href":"/docs/node/systemd-service","docId":"node/systemd-service"},{"type":"link","label":"Lightning CLI","href":"/docs/node/lightning-cli","docId":"node/lightning-cli"}]},{"type":"link","label":"Roadmap","href":"/docs/roadmap","docId":"roadmap"},{"type":"category","label":"Open-source","collapsed":true,"collapsible":true,"items":[{"type":"link","label":"Code of Conduct","href":"/docs/Open-source/code-of-conduct","docId":"Open-source/code-of-conduct"},{"type":"link","label":"Contributing","href":"/docs/Open-source/contributing","docId":"Open-source/contributing"},{"type":"link","label":"Repositories","href":"/docs/Open-source/repositories","docId":"Open-source/repositories"}]},{"type":"link","label":"Whitepaper","href":"/docs/whitepaper","docId":"whitepaper"}]},"docs":{"develop/client":{"id":"develop/client","title":"Client","description":""},"develop/index":{"id":"develop/index","title":"Overview","description":"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network."},"develop/json-rpc":{"id":"develop/json-rpc","title":"JSON-RPC","description":""},"develop/service-development":{"id":"develop/service-development","title":"Service development","description":""},"index":{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","sidebar":"docs"},"learn/delivery-acknowledgements":{"id":"learn/delivery-acknowledgements","title":"Delivery Acknowledgements","description":"Dive into Fleek Network\'s Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.","sidebar":"docs"},"learn/developers":{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","sidebar":"docs"},"learn/index":{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","sidebar":"docs"},"learn/services":{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","sidebar":"docs"},"learn/the-network":{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","sidebar":"docs"},"learn/token-and-economics":{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","sidebar":"docs"},"node/analyzing-logs":{"id":"node/analyzing-logs","title":"Analyzing logs","description":"Analyzing Logs","sidebar":"docs"},"node/configuration":{"id":"node/configuration","title":"Configuration","description":"TODO: Configuration"},"node/diagnostics":{"id":"node/diagnostics","title":"Diagnostics","description":"TODO: Diagnostics"},"node/health-check":{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","sidebar":"docs"},"node/index":{"id":"node/index","title":"Overview","description":"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network\'s growth.","sidebar":"docs"},"node/install":{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","sidebar":"docs"},"node/lightning-cli":{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","sidebar":"docs"},"node/requirements":{"id":"node/requirements","title":"Requirements","description":"The requirements for the server specifications on which the Fleek Network Node can be installed and run.","sidebar":"docs"},"node/systemd-service":{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","sidebar":"docs"},"node/testnet-onboarding":{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","sidebar":"docs"},"Open-source":{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase."},"Open-source/code-of-conduct":{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","sidebar":"docs"},"Open-source/contributing":{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","sidebar":"docs"},"Open-source/repositories":{"id":"Open-source/repositories","title":"Repositories","description":"Repositories","sidebar":"docs"},"roadmap":{"id":"roadmap","title":"Roadmap","description":"Fleek Network\'s high-level roadmap per stage. Devnet, Testnet, and Mainnet.","sidebar":"docs"},"whitepaper":{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","sidebar":"docs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/93df2695.12f4ff8d.js b/assets/js/93df2695.12f4ff8d.js deleted file mode 100644 index 572b8551a..000000000 --- a/assets/js/93df2695.12f4ff8d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2386],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>u});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,r=function(e,t){if(null==e)return{};var n,o,r={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),m=c(n),h=r,u=m["".concat(l,".").concat(h)]||m[h]||p[h]||a;return n?o.createElement(u,i(i({ref:t},d),{},{components:n})):o.createElement(u,i({ref:t},d))}));function u(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[m]="string"==typeof e?e:r,i[1]=s;for(var c=2;c<a;c++)i[c]=n[c];return o.createElement.apply(null,i)}return o.createElement.apply(null,n)}h.displayName="MDXCreateElement"},3872:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(7294);const r=e=>{let{image:t,name:n,title:r,url:a,communityMember:i=!1}=e;return o.createElement("section",{className:"author_card"},o.createElement("div",null,o.createElement("span",{className:"avatar"},o.createElement("a",{href:a,target:"_blank",alt:n},o.createElement("img",{src:t,alt:n}))),o.createElement("div",null,o.createElement("span",{className:"name"},o.createElement("a",{href:a,target:"_blank",alt:n},n)),o.createElement("span",{className:"title"},r),o.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",o.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},1569:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=n(7462),r=(n(7294),n(3905)),a=n(3872);const i={title:"Delivery Acknowledgements",slug:"delivery-acknowledgements",hide_title:!0,description:"Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.",tags:["snarks"],sidebarCollapsible:!1},s=void 0,l={unversionedId:"learn/delivery-acknowledgements",id:"learn/delivery-acknowledgements",title:"Delivery Acknowledgements",description:"Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.",source:"@site/docs/learn/delivery-acknowledgements.md",sourceDirName:"learn",slug:"/learn/delivery-acknowledgements",permalink:"/docs/learn/delivery-acknowledgements",draft:!1,tags:[{label:"snarks",permalink:"/docs/tags/snarks"}],version:"current",frontMatter:{title:"Delivery Acknowledgements",slug:"delivery-acknowledgements",hide_title:!0,description:"Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.",tags:["snarks"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"The Network",permalink:"/docs/learn/the-network"},next:{title:"Token and economics",permalink:"/docs/learn/token-and-economics"}},c={},d=[{value:"Overview",id:"overview",level:2},{value:"SNARKs (Non-interactive zero-knowledge proofs)",id:"snarks-non-interactive-zero-knowledge-proofs",level:2},{value:"Optimization",id:"optimization",level:2},{value:"Node vs. Client Process Flow",id:"node-vs-client-process-flow",level:2},{value:"Content and Streaming Verifiability",id:"content-and-streaming-verifiability",level:2},{value:"Delivery Acknowledgement Customization",id:"delivery-acknowledgement-customization",level:2}],m={toc:d},p="wrapper";function h(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,o.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"overview"},"Overview"),(0,r.kt)("p",null,"When a client signs a message, it creates a Delivery Acknowledgement that confirms a successful service computation delivery by a node. This ",(0,r.kt)("a",{parentName:"p",href:"#node-vs-client-process-flow"},"process")," ensures the immutability and integrity of the message (the client cannot change or reverse it) and also includes metadata about the commodities consumed by the node during the service execution. This metadata helps in calculating the reward that the node will receive."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The Narwhal and Bullshark consensus primary transaction is the order of batched Delivery Acknowledgements. Every time a node serves a request, it gathers Delivery Acknowledgements that, upon submission, reward the node at the end of an epoch (which is approximately 24 hours).")),(0,r.kt)("p",null,"To claim the reward and other fees, nodes can add received Delivery Acknowledgements to a local pool and periodically submit them in batches to reach a consensus. This process also ensures consistent updates to the client's balance in stable coin."),(0,r.kt)("p",null,"The amounts deducted from all clients during an epoch, move to a payout pool which is distributed fairly to node ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn/the-network#identity-on-the-fleek-network"},"account owners")," based on the work performed in the epoch."),(0,r.kt)("p",null,"For a more in-depth dive into Delivery Acknowledgements-related topics, it's advised to read the ",(0,r.kt)("a",{parentName:"p",href:"/docs/whitepaper"},"whitepaper"),". Also, a holistic version of ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn/the-network"},"the Network")," is available on our documentation site."),(0,r.kt)("h2",{id:"snarks-non-interactive-zero-knowledge-proofs"},"SNARKs (Non-interactive zero-knowledge proofs)"),(0,r.kt)("p",null,"SNARKs is an acronym that stands for Succinct Non-interactive Argument of Knowledge. A SNARK is a cryptographic proof that allows one party to prove to another that it knows a secret without revealing the secret itself. "),(0,r.kt)("p",null,"It's a product of encryption that makes direct communication between a prover and verifier needless, effectively removing any intermediaries."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"A SNARK is a cryptographic proof that is utilized as an optimization for Delivery Acknowledgements. It's not a requirement to understand Delivery Acknowledgements. However, an important implementation detail for performance and message handling.")),(0,r.kt)("p",null,"The periodic submission of Delivery Acknowledgements, allows us to leverage SNARK proofs recursively, aggregating many of these Delivery Acknowledgements. By batching, we lower the expenses associated with networking and computing power which would've been much higher if verified individually."),(0,r.kt)("h2",{id:"optimization"},"Optimization"),(0,r.kt)("p",null,"The Fleek Network uses Narwhal as a ",(0,r.kt)("a",{parentName:"p",href:"https://arxiv.org/pdf/2105.11827.pdf"},"DAG-mempool")," for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine."),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"Read ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn/the-network#the-consensus-algorithm"},"The Consensus Algorithm")," section, to learn more about Narwhal and Bullshark. Alternatively, check the ",(0,r.kt)("a",{parentName:"p",href:"/docs/whitepaper"},"whitepaper")," for more detailed information.")),(0,r.kt)("p",null,"Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked node at the end of every epoch (about 24 hours). Integrity is met due to the node rotation that occurs at each period, reducing risks associated with nodes being compromised and affecting the committee's purity."),(0,r.kt)("p",null,"Since the number of Delivery Acknowledgements can be considerably high, only a few of these are handled by consensus. It rolls up the head and tail from the batch list and leverages Zero-Knowledge proofs recursively to validate them. By rolling up a smaller footprint, it optimizes data and network performance without compromising the security of the protocol."),(0,r.kt)("p",null,"In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining nodes performantly and securely."),(0,r.kt)("h2",{id:"node-vs-client-process-flow"},"Node vs. Client Process Flow"),(0,r.kt)("p",null,"The process by which Delivery Acknowledgement works is that a node starts by sending an encrypted request to a client and once received, a signed Delivery Acknowledgement attests to it."),(0,r.kt)("p",null,"Upon Delivery Acknowledgment, the node should transmit an encryption key."),(0,r.kt)("p",null,"If a node fails to send a key after the client signs the Delivery Acknowledgement, the committee safeguards the user request interest by sending a valid rebuilt key back."),(0,r.kt)("p",null,"As a consequence of malicious behavior, the committee has the node slashed by the protocol-slashing mechanism penalizing dishonest participation while allowing the request flow to run smoothly for the betterment of the end-user experience."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"The process ensures that nodes get paid for work performed and clients get the requests fulfilled. It helps achieve decentralization and trustworthiness as the process applies to any sort of client-server communication, such as Gateways. Also, considering the impact this might have on the network, a node encryption key response has a small impact performance of 300 milliseconds (0.3ms) of latency.")),(0,r.kt)("h2",{id:"content-and-streaming-verifiability"},"Content and Streaming Verifiability"),(0,r.kt)("p",null,"A Delivery Acknowledgement message signing is deterministic, completely dependent on its inputs and the sequence of the instructions fulfilled which are strictly validated."),(0,r.kt)("p",null,"Thus, the entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability. This ensures that the hash being requested is the one being served."),(0,r.kt)("p",null,"Learn more about it in the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn/the-network#content-addressing"},"Content Addressing")," section."),(0,r.kt)("h2",{id:"delivery-acknowledgement-customization"},"Delivery Acknowledgement Customization"),(0,r.kt)("p",null,"A Service can have a custom configuration to specify how Delivery Acknowledgements should behave or work. Patterns and conventions should be expected to emerge from the Service builder community and best practices."),(0,r.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/93df2695.300a96e1.js b/assets/js/93df2695.300a96e1.js new file mode 100644 index 000000000..ae417db66 --- /dev/null +++ b/assets/js/93df2695.300a96e1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2386],{1367:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>m,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var i=t(5893),o=t(1151),s=t(3872);const r={title:"Delivery Acknowledgements",slug:"delivery-acknowledgements",hide_title:!0,description:"Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.",tags:["snarks"],sidebarCollapsible:!1},a=void 0,l={id:"learn/delivery-acknowledgements",title:"Delivery Acknowledgements",description:"Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.",source:"@site/docs/learn/delivery-acknowledgements.md",sourceDirName:"learn",slug:"/learn/delivery-acknowledgements",permalink:"/docs/learn/delivery-acknowledgements",draft:!1,unlisted:!1,tags:[{label:"snarks",permalink:"/docs/tags/snarks"}],version:"current",frontMatter:{title:"Delivery Acknowledgements",slug:"delivery-acknowledgements",hide_title:!0,description:"Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.",tags:["snarks"],sidebarCollapsible:!1},sidebar:"docs",previous:{title:"The Network",permalink:"/docs/learn/the-network"},next:{title:"Token and economics",permalink:"/docs/learn/token-and-economics"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"SNARKs (Non-interactive zero-knowledge proofs)",id:"snarks-non-interactive-zero-knowledge-proofs",level:2},{value:"Optimization",id:"optimization",level:2},{value:"Node vs. Client Process Flow",id:"node-vs-client-process-flow",level:2},{value:"Content and Streaming Verifiability",id:"content-and-streaming-verifiability",level:2},{value:"Delivery Acknowledgement Customization",id:"delivery-acknowledgement-customization",level:2}];function h(e){const n={a:"a",admonition:"admonition",h2:"h2",p:"p",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(n.p,{children:["When a client signs a message, it creates a Delivery Acknowledgement that confirms a successful service computation delivery by a node. This ",(0,i.jsx)(n.a,{href:"#node-vs-client-process-flow",children:"process"})," ensures the immutability and integrity of the message (the client cannot change or reverse it) and also includes metadata about the commodities consumed by the node during the service execution. This metadata helps in calculating the reward that the node will receive."]}),"\n",(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsx)(n.p,{children:"The Narwhal and Bullshark consensus primary transaction is the order of batched Delivery Acknowledgements. Every time a node serves a request, it gathers Delivery Acknowledgements that, upon submission, reward the node at the end of an epoch (which is approximately 24 hours)."})}),"\n",(0,i.jsx)(n.p,{children:"To claim the reward and other fees, nodes can add received Delivery Acknowledgements to a local pool and periodically submit them in batches to reach a consensus. This process also ensures consistent updates to the client's balance in stable coin."}),"\n",(0,i.jsxs)(n.p,{children:["The amounts deducted from all clients during an epoch, move to a payout pool which is distributed fairly to node ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network#identity-on-the-fleek-network",children:"account owners"})," based on the work performed in the epoch."]}),"\n",(0,i.jsxs)(n.p,{children:["For a more in-depth dive into Delivery Acknowledgements-related topics, it's advised to read the ",(0,i.jsx)(n.a,{href:"/docs/whitepaper",children:"whitepaper"}),". Also, a holistic version of ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network",children:"the Network"})," is available on our documentation site."]}),"\n",(0,i.jsx)(n.h2,{id:"snarks-non-interactive-zero-knowledge-proofs",children:"SNARKs (Non-interactive zero-knowledge proofs)"}),"\n",(0,i.jsx)(n.p,{children:"SNARKs is an acronym that stands for Succinct Non-interactive Argument of Knowledge. A SNARK is a cryptographic proof that allows one party to prove to another that it knows a secret without revealing the secret itself."}),"\n",(0,i.jsx)(n.p,{children:"It's a product of encryption that makes direct communication between a prover and verifier needless, effectively removing any intermediaries."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"A SNARK is a cryptographic proof that is utilized as an optimization for Delivery Acknowledgements. It's not a requirement to understand Delivery Acknowledgements. However, an important implementation detail for performance and message handling."})}),"\n",(0,i.jsx)(n.p,{children:"The periodic submission of Delivery Acknowledgements, allows us to leverage SNARK proofs recursively, aggregating many of these Delivery Acknowledgements. By batching, we lower the expenses associated with networking and computing power which would've been much higher if verified individually."}),"\n",(0,i.jsx)(n.h2,{id:"optimization",children:"Optimization"}),"\n",(0,i.jsxs)(n.p,{children:["The Fleek Network uses Narwhal as a ",(0,i.jsx)(n.a,{href:"https://arxiv.org/pdf/2105.11827.pdf",children:"DAG-mempool"})," for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine."]}),"\n",(0,i.jsx)(n.admonition,{type:"tip",children:(0,i.jsxs)(n.p,{children:["Read ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network#the-consensus-algorithm",children:"The Consensus Algorithm"})," section, to learn more about Narwhal and Bullshark. Alternatively, check the ",(0,i.jsx)(n.a,{href:"/docs/whitepaper",children:"whitepaper"})," for more detailed information."]})}),"\n",(0,i.jsx)(n.p,{children:"Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked node at the end of every epoch (about 24 hours). Integrity is met due to the node rotation that occurs at each period, reducing risks associated with nodes being compromised and affecting the committee's purity."}),"\n",(0,i.jsx)(n.p,{children:"Since the number of Delivery Acknowledgements can be considerably high, only a few of these are handled by consensus. It rolls up the head and tail from the batch list and leverages Zero-Knowledge proofs recursively to validate them. By rolling up a smaller footprint, it optimizes data and network performance without compromising the security of the protocol."}),"\n",(0,i.jsx)(n.p,{children:"In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining nodes performantly and securely."}),"\n",(0,i.jsx)(n.h2,{id:"node-vs-client-process-flow",children:"Node vs. Client Process Flow"}),"\n",(0,i.jsx)(n.p,{children:"The process by which Delivery Acknowledgement works is that a node starts by sending an encrypted request to a client and once received, a signed Delivery Acknowledgement attests to it."}),"\n",(0,i.jsx)(n.p,{children:"Upon Delivery Acknowledgment, the node should transmit an encryption key."}),"\n",(0,i.jsx)(n.p,{children:"If a node fails to send a key after the client signs the Delivery Acknowledgement, the committee safeguards the user request interest by sending a valid rebuilt key back."}),"\n",(0,i.jsx)(n.p,{children:"As a consequence of malicious behavior, the committee has the node slashed by the protocol-slashing mechanism penalizing dishonest participation while allowing the request flow to run smoothly for the betterment of the end-user experience."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The process ensures that nodes get paid for work performed and clients get the requests fulfilled. It helps achieve decentralization and trustworthiness as the process applies to any sort of client-server communication, such as Gateways. Also, considering the impact this might have on the network, a node encryption key response has a small impact performance of 300 milliseconds (0.3ms) of latency."})}),"\n",(0,i.jsx)(n.h2,{id:"content-and-streaming-verifiability",children:"Content and Streaming Verifiability"}),"\n",(0,i.jsx)(n.p,{children:"A Delivery Acknowledgement message signing is deterministic, completely dependent on its inputs and the sequence of the instructions fulfilled which are strictly validated."}),"\n",(0,i.jsx)(n.p,{children:"Thus, the entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability. This ensures that the hash being requested is the one being served."}),"\n",(0,i.jsxs)(n.p,{children:["Learn more about it in the ",(0,i.jsx)(n.a,{href:"/docs/learn/the-network#content-addressing",children:"Content Addressing"})," section."]}),"\n",(0,i.jsx)(n.h2,{id:"delivery-acknowledgement-customization",children:"Delivery Acknowledgement Customization"}),"\n",(0,i.jsx)(n.p,{children:"A Service can have a custom configuration to specify how Delivery Acknowledgements should behave or work. Patterns and conventions should be expected to emerge from the Service builder community and best practices."}),"\n",(0,i.jsx)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function m(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var i=t(5893);const o=e=>{let{image:n,name:t,title:o,url:s,communityMember:r=!1}=e;return(0,i.jsx)("section",{className:"author_card",children:(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"avatar",children:(0,i.jsx)("a",{href:s,target:"_blank",alt:t,children:(0,i.jsx)("img",{src:n,alt:t})})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("span",{className:"name",children:(0,i.jsx)("a",{href:s,target:"_blank",alt:t,children:t})}),(0,i.jsx)("span",{className:"title",children:o}),(0,i.jsxs)("span",{className:"discord",children:[r?"Join our community on":"Got questions? Find us on"," ",(0,i.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>r});var i=t(7294);const o={},s=i.createContext(o);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95f4d37c.0a40e7b8.js b/assets/js/95f4d37c.0a40e7b8.js new file mode 100644 index 000000000..135ed5ca8 --- /dev/null +++ b/assets/js/95f4d37c.0a40e7b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[814],{7497:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>u,frontMatter:()=>c,metadata:()=>s,toc:()=>l});var o=n(5893),r=n(1151);const c={title:"Overview",slug:"overview",tags:["develop"]},a=void 0,s={id:"develop/index",title:"Overview",description:"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.",source:"@site/docs/develop/index.md",sourceDirName:"develop",slug:"/develop/overview",permalink:"/docs/develop/overview",draft:!1,unlisted:!1,tags:[{label:"develop",permalink:"/docs/tags/develop"}],version:"current",frontMatter:{title:"Overview",slug:"overview",tags:["develop"]}},i={},l=[];function d(e){const t={p:"p",...(0,r.a)(),...e.components};return(0,o.jsx)(t.p,{children:"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network."})}function u(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>s,a:()=>a});var o=n(7294);const r={},c=o.createContext(r);function a(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95f4d37c.7715ba3a.js b/assets/js/95f4d37c.7715ba3a.js deleted file mode 100644 index 8912e38b1..000000000 --- a/assets/js/95f4d37c.7715ba3a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[814],{3905:(e,r,t)=>{t.d(r,{Zo:()=>s,kt:()=>f});var n=t(7294);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function c(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?a(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function i(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)t=a[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=n.createContext({}),p=function(e){var r=n.useContext(l),t=r;return e&&(t="function"==typeof e?e(r):c(c({},r),e)),t},s=function(e){var r=p(e.components);return n.createElement(l.Provider,{value:r},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},v=n.forwardRef((function(e,r){var t=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=p(t),v=o,f=u["".concat(l,".").concat(v)]||u[v]||d[v]||a;return t?n.createElement(f,c(c({ref:r},s),{},{components:t})):n.createElement(f,c({ref:r},s))}));function f(e,r){var t=arguments,o=r&&r.mdxType;if("string"==typeof e||o){var a=t.length,c=new Array(a);c[0]=v;var i={};for(var l in r)hasOwnProperty.call(r,l)&&(i[l]=r[l]);i.originalType=e,i[u]="string"==typeof e?e:o,c[1]=i;for(var p=2;p<a;p++)c[p]=t[p];return n.createElement.apply(null,c)}return n.createElement.apply(null,t)}v.displayName="MDXCreateElement"},9553:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>p});var n=t(7462),o=(t(7294),t(3905));const a={title:"Overview",slug:"overview",tags:["develop"]},c=void 0,i={unversionedId:"develop/index",id:"develop/index",title:"Overview",description:"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.",source:"@site/docs/develop/index.md",sourceDirName:"develop",slug:"/develop/overview",permalink:"/docs/develop/overview",draft:!1,tags:[{label:"develop",permalink:"/docs/tags/develop"}],version:"current",frontMatter:{title:"Overview",slug:"overview",tags:["develop"]}},l={},p=[],s={toc:p},u="wrapper";function d(e){let{components:r,...t}=e;return(0,o.kt)(u,(0,n.Z)({},s,t,{components:r,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/965d240c.50abd3fb.js b/assets/js/965d240c.50a7d323.js similarity index 82% rename from assets/js/965d240c.50abd3fb.js rename to assets/js/965d240c.50a7d323.js index e2865dadf..3c4be7181 100644 --- a/assets/js/965d240c.50abd3fb.js +++ b/assets/js/965d240c.50a7d323.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6577],{7668:e=>{e.exports=JSON.parse('{"label":"rebuild","permalink":"/guides/tags/rebuild","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6577],{7668:e=>{e.exports=JSON.parse('{"label":"rebuild","permalink":"/guides/tags/rebuild","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/9722e053.24ccaeca.js b/assets/js/9722e053.24ccaeca.js deleted file mode 100644 index fecb85439..000000000 --- a/assets/js/9722e053.24ccaeca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1955],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var i=a.createContext({}),c=function(e){var t=a.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=c(e.components);return a.createElement(i.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,l=e.originalType,i=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(n),p=r,k=u["".concat(i,".").concat(p)]||u[p]||m[p]||l;return n?a.createElement(k,o(o({ref:t},d),{},{components:n})):a.createElement(k,o({ref:t},d))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=n.length,o=new Array(l);o[0]=p;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[u]="string"==typeof e?e:r,o[1]=s;for(var c=2;c<l;c++)o[c]=n[c];return a.createElement.apply(null,o)}return a.createElement.apply(null,n)}p.displayName="MDXCreateElement"},3783:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),l=n(3872);const o={title:"Frequently used commands for Docker setup",slug:"frequently-used-commands-for-docker-setup",hide_title:!0,tags:["commands","cli","lightning","docker"]},s=void 0,i={unversionedId:"Docker/frequently-used-commands-for-docker-setup",id:"Docker/frequently-used-commands-for-docker-setup",title:"Frequently used commands for Docker setup",description:"TL;DR",source:"@site/references/Docker/frequently-used-commands-for-docker-setup.md",sourceDirName:"Docker",slug:"/Docker/frequently-used-commands-for-docker-setup",permalink:"/references/Docker/frequently-used-commands-for-docker-setup",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Docker/frequently-used-commands-for-docker-setup.md",tags:[{label:"commands",permalink:"/references/tags/commands"},{label:"cli",permalink:"/references/tags/cli"},{label:"lightning",permalink:"/references/tags/lightning"},{label:"docker",permalink:"/references/tags/docker"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Frequently used commands for Docker setup",slug:"frequently-used-commands-for-docker-setup",hide_title:!0,tags:["commands","cli","lightning","docker"]},sidebar:"defaultSidebar",previous:{title:"Build and run in Docker",permalink:"/references/Docker/build-and-run-in-docker"},next:{title:"Uninstall Docker Setup",permalink:"/references/Docker/uninstall-docker-setup"}},c={},d=[{value:"TL;DR",id:"tldr",level:2},{value:"Systemctl Service Management",id:"systemctl-service-management",level:2},{value:"Enable",id:"enable",level:3},{value:"Disable",id:"disable",level:3},{value:"Start",id:"start",level:3},{value:"Stop",id:"stop",level:3},{value:"Restart",id:"restart",level:3},{value:"Status",id:"status",level:3},{value:"Lightning CLI via Docker",id:"lightning-cli-via-docker",level:2},{value:"Show keys for user config",id:"show-keys-for-user-config",level:3},{value:"Diagnostic tools",id:"diagnostic-tools",level:2},{value:"Extended verification health check",id:"extended-verification-health-check",level:3},{value:"Health status",id:"health-status",level:3},{value:"Node details",id:"node-details",level:3},{value:"Analyzing Logs",id:"analyzing-logs",level:2},{value:"Standard output",id:"standard-output",level:3},{value:"Standard error",id:"standard-error",level:3},{value:"Docker Container Logs",id:"docker-container-logs",level:3},{value:"Interactive Container",id:"interactive-container",level:2},{value:"Execute Bash",id:"execute-bash",level:3},{value:"Docker",id:"docker",level:2},{value:"List Containers",id:"list-containers",level:3},{value:"Start Container",id:"start-container",level:3},{value:"Stop Container",id:"stop-container",level:3},{value:"Remove Container",id:"remove-container",level:3}],u={toc:d},m="wrapper";function p(e){let{components:t,...n}=e;return(0,r.kt)(m,(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"tldr"},"TL;DR"),(0,r.kt)("p",null,"Most assisted processes are available through the ",(0,r.kt)("inlineCode",{parentName:"p"},"get.fleek.network")," command, where you can select to install, do a health check amongst others."),(0,r.kt)("p",null,"To access the menu options run the command in the shell prompt:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://get.fleek.network | bash\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For Native setup users read the corresponding version in the section ",(0,r.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/frequently-used-commands-for-native-setup"},"Frequently Used Commands for Native Setup"))),(0,r.kt)("h2",{id:"systemctl-service-management"},"Systemctl Service Management"),(0,r.kt)("h3",{id:"enable"},"Enable"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable docker-lightning\n")),(0,r.kt)("h3",{id:"disable"},"Disable"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable docker-lightning\n")),(0,r.kt)("h3",{id:"start"},"Start"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start docker-lightning\n")),(0,r.kt)("h3",{id:"stop"},"Stop"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl stop docker-lightning\n")),(0,r.kt)("h3",{id:"restart"},"Restart"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl restart docker-lightning\n")),(0,r.kt)("h3",{id:"status"},"Status"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl status docker-lightning\n")),(0,r.kt)("h2",{id:"lightning-cli-via-docker"},"Lightning CLI via Docker"),(0,r.kt)("h3",{id:"show-keys-for-user-config"},"Show keys for user config"),(0,r.kt)("p",null,"Show the keys by running the sub-commands ",(0,r.kt)("inlineCode",{parentName:"p"},"keys show")," and declaring the configuration file location (in-docker pathname):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker exec -it lightning-node lgtn -c /home/lgtn/.lightning/config.toml keys show\n")),(0,r.kt)("h2",{id:"diagnostic-tools"},"Diagnostic tools"),(0,r.kt)("h3",{id:"extended-verification-health-check"},"Extended verification health check"),(0,r.kt)("p",null,"The command show be executed from host and not in-Docker container."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl -sS https://get.fleek.network/healthcheck | bash\n")),(0,r.kt)("h3",{id:"health-status"},"Health status"),(0,r.kt)("p",null,"The command show be executed from host and not in-Docker container."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},'curl -w "\\n" localhost:4230/health\n')),(0,r.kt)("h3",{id:"node-details"},"Node details"),(0,r.kt)("p",null,"The command show be executed from host and not in-Docker container."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"curl -sS https://get.fleek.network/node_details | bash\n")),(0,r.kt)("h2",{id:"analyzing-logs"},"Analyzing Logs"),(0,r.kt)("h3",{id:"standard-output"},"Standard output"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/output.log\n")),(0,r.kt)("h3",{id:"standard-error"},"Standard error"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/diagnostic.log\n")),(0,r.kt)("h3",{id:"docker-container-logs"},"Docker Container Logs"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker logs -f lightning-node\n")),(0,r.kt)("h2",{id:"interactive-container"},"Interactive Container"),(0,r.kt)("h3",{id:"execute-bash"},"Execute Bash"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker exec -it lightning-node bash\n")),(0,r.kt)("h2",{id:"docker"},"Docker"),(0,r.kt)("h3",{id:"list-containers"},"List Containers"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker ps -a\n")),(0,r.kt)("h3",{id:"start-container"},"Start Container"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker start <CONTAINER ID or CONTAINER NAME>\n")),(0,r.kt)("h3",{id:"stop-container"},"Stop Container"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker stop <CONTAINER ID or CONTAINER NAME>\n")),(0,r.kt)("h3",{id:"remove-container"},"Remove Container"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker rm <CONTAINER ID or CONTAINER NAME>\n")),(0,r.kt)(l.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}p.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(7294);const r=e=>{let{image:t,name:n,title:r,url:l,communityMember:o=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:l,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:l,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},r),a.createElement("span",{className:"discord"},o?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/9722e053.7ad17092.js b/assets/js/9722e053.7ad17092.js new file mode 100644 index 000000000..84690016f --- /dev/null +++ b/assets/js/9722e053.7ad17092.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1955],{6410:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>c,toc:()=>o});var t=s(5893),r=s(1151),a=s(3872);const l={title:"Frequently used commands for Docker setup",slug:"frequently-used-commands-for-docker-setup",hide_title:!0,tags:["commands","cli","lightning","docker"]},i=void 0,c={id:"Docker/frequently-used-commands-for-docker-setup",title:"Frequently used commands for Docker setup",description:"TL;DR",source:"@site/references/Docker/frequently-used-commands-for-docker-setup.md",sourceDirName:"Docker",slug:"/Docker/frequently-used-commands-for-docker-setup",permalink:"/references/Docker/frequently-used-commands-for-docker-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Docker/frequently-used-commands-for-docker-setup.md",tags:[{label:"commands",permalink:"/references/tags/commands"},{label:"cli",permalink:"/references/tags/cli"},{label:"lightning",permalink:"/references/tags/lightning"},{label:"docker",permalink:"/references/tags/docker"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Frequently used commands for Docker setup",slug:"frequently-used-commands-for-docker-setup",hide_title:!0,tags:["commands","cli","lightning","docker"]},sidebar:"defaultSidebar",previous:{title:"Build and run in Docker",permalink:"/references/Docker/build-and-run-in-docker"},next:{title:"Uninstall Docker Setup",permalink:"/references/Docker/uninstall-docker-setup"}},d={},o=[{value:"TL;DR",id:"tldr",level:2},{value:"Systemctl Service Management",id:"systemctl-service-management",level:2},{value:"Enable",id:"enable",level:3},{value:"Disable",id:"disable",level:3},{value:"Start",id:"start",level:3},{value:"Stop",id:"stop",level:3},{value:"Restart",id:"restart",level:3},{value:"Status",id:"status",level:3},{value:"Lightning CLI via Docker",id:"lightning-cli-via-docker",level:2},{value:"Show keys for user config",id:"show-keys-for-user-config",level:3},{value:"Diagnostic tools",id:"diagnostic-tools",level:2},{value:"Extended verification health check",id:"extended-verification-health-check",level:3},{value:"Health status",id:"health-status",level:3},{value:"Node details",id:"node-details",level:3},{value:"Analyzing Logs",id:"analyzing-logs",level:2},{value:"Standard output",id:"standard-output",level:3},{value:"Standard error",id:"standard-error",level:3},{value:"Docker Container Logs",id:"docker-container-logs",level:3},{value:"Interactive Container",id:"interactive-container",level:2},{value:"Execute Bash",id:"execute-bash",level:3},{value:"Docker",id:"docker",level:2},{value:"List Containers",id:"list-containers",level:3},{value:"Start Container",id:"start-container",level:3},{value:"Stop Container",id:"stop-container",level:3},{value:"Remove Container",id:"remove-container",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"tldr",children:"TL;DR"}),"\n",(0,t.jsxs)(n.p,{children:["Most assisted processes are available through the ",(0,t.jsx)(n.code,{children:"get.fleek.network"})," command, where you can select to install, do a health check amongst others."]}),"\n",(0,t.jsx)(n.p,{children:"To access the menu options run the command in the shell prompt:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"curl https://get.fleek.network | bash\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["For Native setup users read the corresponding version in the section ",(0,t.jsx)(n.a,{href:"/references/Lightning%20CLI/frequently-used-commands-for-native-setup",children:"Frequently Used Commands for Native Setup"})]})}),"\n",(0,t.jsx)(n.h2,{id:"systemctl-service-management",children:"Systemctl Service Management"}),"\n",(0,t.jsx)(n.h3,{id:"enable",children:"Enable"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl enable docker-lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"disable",children:"Disable"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl enable docker-lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"start",children:"Start"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl start docker-lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"stop",children:"Stop"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl stop docker-lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"restart",children:"Restart"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl restart docker-lightning\n"})}),"\n",(0,t.jsx)(n.h3,{id:"status",children:"Status"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo systemctl status docker-lightning\n"})}),"\n",(0,t.jsx)(n.h2,{id:"lightning-cli-via-docker",children:"Lightning CLI via Docker"}),"\n",(0,t.jsx)(n.h3,{id:"show-keys-for-user-config",children:"Show keys for user config"}),"\n",(0,t.jsxs)(n.p,{children:["Show the keys by running the sub-commands ",(0,t.jsx)(n.code,{children:"keys show"})," and declaring the configuration file location (in-docker pathname):"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker exec -it lightning-node lgtn -c /home/lgtn/.lightning/config.toml keys show\n"})}),"\n",(0,t.jsx)(n.h2,{id:"diagnostic-tools",children:"Diagnostic tools"}),"\n",(0,t.jsx)(n.h3,{id:"extended-verification-health-check",children:"Extended verification health check"}),"\n",(0,t.jsx)(n.p,{children:"The command show be executed from host and not in-Docker container."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"curl -sS https://get.fleek.network/healthcheck | bash\n"})}),"\n",(0,t.jsx)(n.h3,{id:"health-status",children:"Health status"}),"\n",(0,t.jsx)(n.p,{children:"The command show be executed from host and not in-Docker container."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:'curl -w "\\n" localhost:4230/health\n'})}),"\n",(0,t.jsx)(n.h3,{id:"node-details",children:"Node details"}),"\n",(0,t.jsx)(n.p,{children:"The command show be executed from host and not in-Docker container."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"curl -sS https://get.fleek.network/node_details | bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"analyzing-logs",children:"Analyzing Logs"}),"\n",(0,t.jsx)(n.h3,{id:"standard-output",children:"Standard output"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/output.log\n"})}),"\n",(0,t.jsx)(n.h3,{id:"standard-error",children:"Standard error"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/diagnostic.log\n"})}),"\n",(0,t.jsx)(n.h3,{id:"docker-container-logs",children:"Docker Container Logs"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker logs -f lightning-node\n"})}),"\n",(0,t.jsx)(n.h2,{id:"interactive-container",children:"Interactive Container"}),"\n",(0,t.jsx)(n.h3,{id:"execute-bash",children:"Execute Bash"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker exec -it lightning-node bash\n"})}),"\n",(0,t.jsx)(n.h2,{id:"docker",children:"Docker"}),"\n",(0,t.jsx)(n.h3,{id:"list-containers",children:"List Containers"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker ps -a\n"})}),"\n",(0,t.jsx)(n.h3,{id:"start-container",children:"Start Container"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker start <CONTAINER ID or CONTAINER NAME>\n"})}),"\n",(0,t.jsx)(n.h3,{id:"stop-container",children:"Stop Container"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker stop <CONTAINER ID or CONTAINER NAME>\n"})}),"\n",(0,t.jsx)(n.h3,{id:"remove-container",children:"Remove Container"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker rm <CONTAINER ID or CONTAINER NAME>\n"})}),"\n",(0,t.jsx)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:n}={...(0,r.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},3872:(e,n,s)=>{s.d(n,{Z:()=>r});s(7294);var t=s(5893);const r=e=>{let{image:n,name:s,title:r,url:a,communityMember:l=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:a,target:"_blank",alt:s,children:(0,t.jsx)("img",{src:n,alt:s})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:a,target:"_blank",alt:s,children:s})}),(0,t.jsx)("span",{className:"title",children:r}),(0,t.jsxs)("span",{className:"discord",children:[l?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,s)=>{s.d(n,{Z:()=>i,a:()=>l});var t=s(7294);const r={},a=t.createContext(r);function l(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/98f9308d.a01bf3c4.js b/assets/js/98f9308d.a01bf3c4.js new file mode 100644 index 000000000..4cac74c8e --- /dev/null +++ b/assets/js/98f9308d.a01bf3c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1025],{2150:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>o,toc:()=>d});var n=t(5893),r=t(1151),i=t(3872);const c={title:"Service keeps running after shutdown",slug:"service-keeps-running-after-shutdown",hide_title:!0,tags:["reference","shutdown","systemctl","systemd","pkill","process"]},l=void 0,o={id:"Systemd/service-keeps-running-after-shutdown",title:"Service keeps running after shutdown",description:"Stop the service",source:"@site/references/Systemd/service-keeps-running-after-shutdown.md",sourceDirName:"Systemd",slug:"/Systemd/service-keeps-running-after-shutdown",permalink:"/references/Systemd/service-keeps-running-after-shutdown",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Systemd/service-keeps-running-after-shutdown.md",tags:[{label:"reference",permalink:"/references/tags/reference"},{label:"shutdown",permalink:"/references/tags/shutdown"},{label:"systemctl",permalink:"/references/tags/systemctl"},{label:"systemd",permalink:"/references/tags/systemd"},{label:"pkill",permalink:"/references/tags/pkill"},{label:"process",permalink:"/references/tags/process"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Service keeps running after shutdown",slug:"service-keeps-running-after-shutdown",hide_title:!0,tags:["reference","shutdown","systemctl","systemd","pkill","process"]},sidebar:"defaultSidebar",previous:{title:"Update CLI from source code",permalink:"/references/Lightning CLI/update-cli-from-source-code"},next:{title:"Shutting down persistance",permalink:"/references/Systemd/shutting-down-persistance"}},a={},d=[{value:"Stop the service",id:"stop-the-service",level:2},{value:"Kill the process by name",id:"kill-the-process-by-name",level:2}];function h(e){const s={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h2,{id:"stop-the-service",children:"Stop the service"}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.a,{href:"/docs/node/systemd-service",children:"Systemd service"})," section tells how to stop the service, as follows:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl stop lightning\n"})}),"\n",(0,n.jsx)(s.p,{children:"Although, the service is set to restart on failure after a few seconds."}),"\n",(0,n.jsx)(s.h2,{id:"kill-the-process-by-name",children:"Kill the process by name"}),"\n",(0,n.jsxs)(s.p,{children:["Force stop a process by name with the command ",(0,n.jsx)(s.code,{children:"pkill"}),"."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"pkill -f <PROCESS NAME>\n"})}),"\n",(0,n.jsxs)(s.p,{children:["If you've followed the recommended settings, or used the assisted installer the process should be called ",(0,n.jsx)(s.code,{children:"lgtn"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:["A Systemd service is managed by ",(0,n.jsx)(s.a,{href:"/docs/node/systemd-service",children:"Systemctl"}),", to start, stop, to get status or restart. The service controls the Lightning CLI service, that for our convenience named as ",(0,n.jsx)(s.code,{children:"lgtn"}),"\u2013short for lightning. If you haven't followed the recommended settings and have a custom set up, you need to use the custom details you have defined."]}),"\n",(0,n.jsxs)(s.p,{children:["To force stop the service ",(0,n.jsx)(s.code,{children:"lgtn"})," execute the command:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo killall -9 lgtn\n"})}),"\n",(0,n.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3872:(e,s,t)=>{t.d(s,{Z:()=>r});t(7294);var n=t(5893);const r=e=>{let{image:s,name:t,title:r,url:i,communityMember:c=!1}=e;return(0,n.jsx)("section",{className:"author_card",children:(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"avatar",children:(0,n.jsx)("a",{href:i,target:"_blank",alt:t,children:(0,n.jsx)("img",{src:s,alt:t})})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"name",children:(0,n.jsx)("a",{href:i,target:"_blank",alt:t,children:t})}),(0,n.jsx)("span",{className:"title",children:r}),(0,n.jsxs)("span",{className:"discord",children:[c?"Join our community on":"Got questions? Find us on"," ",(0,n.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>c});var n=t(7294);const r={},i=n.createContext(r);function c(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/98f9308d.be94bcbf.js b/assets/js/98f9308d.be94bcbf.js deleted file mode 100644 index e4bf21427..000000000 --- a/assets/js/98f9308d.be94bcbf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1025],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function s(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){s(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,s=function(e,t){if(null==e)return{};var r,n,s={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(s[r]=e[r]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(s[r]=e[r])}return s}var i=n.createContext({}),c=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(i.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,s=e.mdxType,a=e.originalType,i=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),d=c(r),m=s,f=d["".concat(i,".").concat(m)]||d[m]||u[m]||a;return r?n.createElement(f,l(l({ref:t},p),{},{components:r})):n.createElement(f,l({ref:t},p))}));function f(e,t){var r=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=r.length,l=new Array(a);l[0]=m;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o[d]="string"==typeof e?e:s,l[1]=o;for(var c=2;c<a;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},4976:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>p});var n=r(7462),s=(r(7294),r(3905)),a=r(3872);const l={title:"Service keeps running after shutdown",slug:"service-keeps-running-after-shutdown",hide_title:!0,tags:["reference","shutdown","systemctl","systemd","pkill","process"]},o=void 0,i={unversionedId:"Systemd/service-keeps-running-after-shutdown",id:"Systemd/service-keeps-running-after-shutdown",title:"Service keeps running after shutdown",description:"Stop the service",source:"@site/references/Systemd/service-keeps-running-after-shutdown.md",sourceDirName:"Systemd",slug:"/Systemd/service-keeps-running-after-shutdown",permalink:"/references/Systemd/service-keeps-running-after-shutdown",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Systemd/service-keeps-running-after-shutdown.md",tags:[{label:"reference",permalink:"/references/tags/reference"},{label:"shutdown",permalink:"/references/tags/shutdown"},{label:"systemctl",permalink:"/references/tags/systemctl"},{label:"systemd",permalink:"/references/tags/systemd"},{label:"pkill",permalink:"/references/tags/pkill"},{label:"process",permalink:"/references/tags/process"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Service keeps running after shutdown",slug:"service-keeps-running-after-shutdown",hide_title:!0,tags:["reference","shutdown","systemctl","systemd","pkill","process"]},sidebar:"defaultSidebar",previous:{title:"Update CLI from source code",permalink:"/references/Lightning CLI/update-cli-from-source-code"},next:{title:"Shutting down persistance",permalink:"/references/Systemd/shutting-down-persistance"}},c={},p=[{value:"Stop the service",id:"stop-the-service",level:2},{value:"Kill the process by name",id:"kill-the-process-by-name",level:2}],d={toc:p},u="wrapper";function m(e){let{components:t,...r}=e;return(0,s.kt)(u,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"stop-the-service"},"Stop the service"),(0,s.kt)("p",null,"The ",(0,s.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"Systemd service")," section tells how to stop the service, as follows:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl stop lightning\n")),(0,s.kt)("p",null,"Although, the service is set to restart on failure after a few seconds."),(0,s.kt)("h2",{id:"kill-the-process-by-name"},"Kill the process by name"),(0,s.kt)("p",null,"Force stop a process by name with the command ",(0,s.kt)("inlineCode",{parentName:"p"},"pkill"),"."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"pkill -f <PROCESS NAME>\n")),(0,s.kt)("p",null,"If you've followed the recommended settings, or used the assisted installer the process should be called ",(0,s.kt)("inlineCode",{parentName:"p"},"lgtn"),"."),(0,s.kt)("p",null,"A Systemd service is managed by ",(0,s.kt)("a",{parentName:"p",href:"/docs/node/systemd-service"},"Systemctl"),", to start, stop, to get status or restart. The service controls the Lightning CLI service, that for our convenience named as ",(0,s.kt)("inlineCode",{parentName:"p"},"lgtn"),"\u2013short for lightning. If you haven't followed the recommended settings and have a custom set up, you need to use the custom details you have defined."),(0,s.kt)("p",null,"To force stop the service ",(0,s.kt)("inlineCode",{parentName:"p"},"lgtn")," execute the command:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-sh"},"sudo killall -9 lgtn\n")),(0,s.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}m.isMDXComponent=!0},3872:(e,t,r)=>{r.d(t,{Z:()=>s});var n=r(7294);const s=e=>{let{image:t,name:r,title:s,url:a,communityMember:l=!1}=e;return n.createElement("section",{className:"author_card"},n.createElement("div",null,n.createElement("span",{className:"avatar"},n.createElement("a",{href:a,target:"_blank",alt:r},n.createElement("img",{src:t,alt:r}))),n.createElement("div",null,n.createElement("span",{className:"name"},n.createElement("a",{href:a,target:"_blank",alt:r},r)),n.createElement("span",{className:"title"},s),n.createElement("span",{className:"discord"},l?"Join our community on":"Got questions? Find us on"," ",n.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/9bca08cf.cbc2db42.js b/assets/js/9bca08cf.cd5bdade.js similarity index 90% rename from assets/js/9bca08cf.cbc2db42.js rename to assets/js/9bca08cf.cd5bdade.js index a3d16d313..94c4d3ed8 100644 --- a/assets/js/9bca08cf.cbc2db42.js +++ b/assets/js/9bca08cf.cd5bdade.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8318],{7618:e=>{e.exports=JSON.parse('{"label":"upgrade","permalink":"/references/tags/upgrade","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8318],{7618:e=>{e.exports=JSON.parse('{"label":"upgrade","permalink":"/references/tags/upgrade","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/9bd69ffc.df99b872.js b/assets/js/9bd69ffc.96d0dc87.js similarity index 86% rename from assets/js/9bd69ffc.df99b872.js rename to assets/js/9bd69ffc.96d0dc87.js index f761be85c..a1d36b8e1 100644 --- a/assets/js/9bd69ffc.df99b872.js +++ b/assets/js/9bd69ffc.96d0dc87.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6699],{9790:e=>{e.exports=JSON.parse('{"label":"node status","permalink":"/docs/tags/node-status","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","permalink":"/docs/node/health-check"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6699],{9790:e=>{e.exports=JSON.parse('{"label":"node status","permalink":"/docs/tags/node-status","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","permalink":"/docs/node/health-check"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/9cc140f3.46c0f2b1.js b/assets/js/9cc140f3.d46c2c0c.js similarity index 89% rename from assets/js/9cc140f3.46c0f2b1.js rename to assets/js/9cc140f3.d46c2c0c.js index 4d2525b0b..80c5e4e08 100644 --- a/assets/js/9cc140f3.46c0f2b1.js +++ b/assets/js/9cc140f3.d46c2c0c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5049],{429:e=>{e.exports=JSON.parse('{"label":"repository","permalink":"/docs/tags/repository","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"},{"id":"Open-source/repositories","title":"Repositories","description":"Repositories","permalink":"/docs/Open-source/repositories"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5049],{429:e=>{e.exports=JSON.parse('{"label":"repository","permalink":"/docs/tags/repository","allTagsPath":"/docs/tags","count":2,"items":[{"id":"Open-source/contributing","title":"Contributing","description":"Contributing","permalink":"/docs/Open-source/contributing"},{"id":"Open-source/repositories","title":"Repositories","description":"Repositories","permalink":"/docs/Open-source/repositories"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.7fa7842e.js b/assets/js/9e4087bc.7fa7842e.js new file mode 100644 index 000000000..fb97e540e --- /dev/null +++ b/assets/js/9e4087bc.7fa7842e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3608],{3169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});a(7294);var r=a(9960),s=a(5999),i=a(833),c=a(8888),n=a(2503),l=a(5893);function d(e){let{year:t,posts:a}=e;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.Z,{as:"h3",id:t,children:t}),(0,l.jsx)("ul",{children:a.map((e=>(0,l.jsx)("li",{children:(0,l.jsxs)(r.Z,{to:e.metadata.permalink,children:[e.metadata.formattedDate," - ",e.metadata.title]})},e.metadata.date)))})]})}function h(e){let{years:t}=e;return(0,l.jsx)("section",{className:"margin-vert--lg",children:(0,l.jsx)("div",{className:"container",children:(0,l.jsx)("div",{className:"row",children:t.map(((e,t)=>(0,l.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,l.jsx)(d,{...e})},t)))})})})}function o(e){let{archive:t}=e;const a=(0,s.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),r=(0,s.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),d=function(e){const t=e.reduce(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.d,{title:a,description:r}),(0,l.jsxs)(c.Z,{children:[(0,l.jsx)("header",{className:"hero hero--primary",children:(0,l.jsxs)("div",{className:"container",children:[(0,l.jsx)(n.Z,{as:"h1",className:"hero__title",children:a}),(0,l.jsx)("p",{className:"hero__subtitle",children:r})]})}),(0,l.jsx)("main",{children:d.length>0&&(0,l.jsx)(h,{years:d})})]})]})}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.a9c67174.js b/assets/js/9e4087bc.a9c67174.js deleted file mode 100644 index 2501e3391..000000000 --- a/assets/js/9e4087bc.a9c67174.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3608],{3169:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(7294),l=a(9960),n=a(5999),c=a(833),m=a(8888);function i(e){let{year:t,posts:a}=e;return r.createElement(r.Fragment,null,r.createElement("h3",null,t),r.createElement("ul",null,a.map((e=>r.createElement("li",{key:e.metadata.date},r.createElement(l.Z,{to:e.metadata.permalink},e.metadata.formattedDate," - ",e.metadata.title))))))}function s(e){let{years:t}=e;return r.createElement("section",{className:"margin-vert--lg"},r.createElement("div",{className:"container"},r.createElement("div",{className:"row"},t.map(((e,t)=>r.createElement("div",{key:t,className:"col col--4 margin-vert--lg"},r.createElement(i,e)))))))}function o(e){let{archive:t}=e;const a=(0,n.I)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),l=(0,n.I)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const t=e.reduceRight(((e,t)=>{const a=t.metadata.date.split("-")[0],r=e.get(a)??[];return e.set(a,[t,...r])}),new Map);return Array.from(t,(e=>{let[t,a]=e;return{year:t,posts:a}}))}(t.blogPosts);return r.createElement(r.Fragment,null,r.createElement(c.d,{title:a,description:l}),r.createElement(m.Z,null,r.createElement("header",{className:"hero hero--primary"},r.createElement("div",{className:"container"},r.createElement("h1",{className:"hero__title"},a),r.createElement("p",{className:"hero__subtitle"},l))),r.createElement("main",null,i.length>0&&r.createElement(s,{years:i}))))}}}]); \ No newline at end of file diff --git a/assets/js/9f1c3232.1cf2e42e.js b/assets/js/9f1c3232.1cf2e42e.js deleted file mode 100644 index 4e7a31736..000000000 --- a/assets/js/9f1c3232.1cf2e42e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[373],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>h});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),p=c(r),m=o,h=p["".concat(s,".").concat(m)]||p[m]||u[m]||a;return r?n.createElement(h,i(i({ref:t},d),{},{components:r})):n.createElement(h,i({ref:t},d))}));function h(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:o,i[1]=l;for(var c=2;c<a;c++)i[c]=r[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},3872:(e,t,r)=>{r.d(t,{Z:()=>o});var n=r(7294);const o=e=>{let{image:t,name:r,title:o,url:a,communityMember:i=!1}=e;return n.createElement("section",{className:"author_card"},n.createElement("div",null,n.createElement("span",{className:"avatar"},n.createElement("a",{href:a,target:"_blank",alt:r},n.createElement("img",{src:t,alt:r}))),n.createElement("div",null,n.createElement("span",{className:"name"},n.createElement("a",{href:a,target:"_blank",alt:r},r)),n.createElement("span",{className:"title"},o),n.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",n.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},3477:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var n=r(7462),o=(r(7294),r(3905)),a=r(3872);const i={title:"Overview",slug:"overview",hide_title:!0,description:"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.",tags:["build"]},l=void 0,s={unversionedId:"node/index",id:"node/index",title:"Overview",description:"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.",source:"@site/docs/node/index.md",sourceDirName:"node",slug:"/node/overview",permalink:"/docs/node/overview",draft:!1,tags:[{label:"build",permalink:"/docs/tags/build"}],version:"current",frontMatter:{title:"Overview",slug:"overview",hide_title:!0,description:"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.",tags:["build"]},sidebar:"docs",previous:{title:"Developers",permalink:"/docs/learn/developers"},next:{title:"Requirements",permalink:"/docs/node/requirements"}},c={},d=[{value:"Overview",id:"overview",level:2}],p={toc:d},u="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"overview"},"Overview"),(0,o.kt)("p",null,"This section provides instructions to help you build a ",(0,o.kt)("strong",{parentName:"p"},"Fleek Network Node"),", it's aimed at everybody willing to learn and cultivate knowledge as a ",(0,o.kt)("a",{parentName:"p",href:"#node-operator"},"node operator"),"."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To participate in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/roadmap"},"alpha Testnet"),", you can begin by setting up and running nodes. Check the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"requirements")," and find the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/testnet-onboarding"},"onboarding instructions")," to enable you to ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install"},"install")," a network node successfully.")),(0,o.kt)("h1",{id:"node-operator"},"Node operator"),(0,o.kt)("hr",null),(0,o.kt)("p",null,"A ",(0,o.kt)("strong",{parentName:"p"},"Node Operator")," is represented as a system administrator who builds, installs or maintains one or many nodes in a server or more."),(0,o.kt)("p",null,"Anyone willing to learn can become a Node operator, which will be enabled to set up and run a Node on their own at any time without the need for anyone's permission."),(0,o.kt)("p",null,"Amongst others, the use cases we try to cover are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Server requirements"),(0,o.kt)("li",{parentName:"ul"},"Installing the Node easily with the installation wizard"),(0,o.kt)("li",{parentName:"ul"},"Building a Node binary from source code"),(0,o.kt)("li",{parentName:"ul"},"Configuring the Node"),(0,o.kt)("li",{parentName:"ul"},"Securing the server and identity"),(0,o.kt)("li",{parentName:"ul"},"Updating the Node"),(0,o.kt)("li",{parentName:"ul"},"Learning to troubleshoot"),(0,o.kt)("li",{parentName:"ul"},"Learning how to analyze the node process log messages")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"discord")," or by opening a PR in any of our repositories.")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Ready?")," Start by checking the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"server requirements")),(0,o.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9f1c3232.754ab62e.js b/assets/js/9f1c3232.754ab62e.js new file mode 100644 index 000000000..d9ccad685 --- /dev/null +++ b/assets/js/9f1c3232.754ab62e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[373],{9129:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var t=r(5893),o=r(1151),i=r(3872);const s={title:"Overview",slug:"overview",hide_title:!0,description:"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.",tags:["build"]},a=void 0,d={id:"node/index",title:"Overview",description:"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.",source:"@site/docs/node/index.md",sourceDirName:"node",slug:"/node/overview",permalink:"/docs/node/overview",draft:!1,unlisted:!1,tags:[{label:"build",permalink:"/docs/tags/build"}],version:"current",frontMatter:{title:"Overview",slug:"overview",hide_title:!0,description:"Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.",tags:["build"]},sidebar:"docs",previous:{title:"Developers",permalink:"/docs/learn/developers"},next:{title:"Requirements",permalink:"/docs/node/requirements"}},l={},c=[{value:"Overview",id:"overview",level:2}];function h(e){const n={a:"a",admonition:"admonition",h1:"h1",h2:"h2",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,t.jsxs)(n.p,{children:["This section provides instructions to help you build a ",(0,t.jsx)(n.strong,{children:"Fleek Network Node"}),", it's aimed at everybody willing to learn and cultivate knowledge as a ",(0,t.jsx)(n.a,{href:"#node-operator",children:"node operator"}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["To participate in the ",(0,t.jsx)(n.a,{href:"/docs/roadmap",children:"alpha Testnet"}),", you can begin by setting up and running nodes. Check the ",(0,t.jsx)(n.a,{href:"/docs/node/requirements",children:"requirements"})," and find the ",(0,t.jsx)(n.a,{href:"/docs/node/testnet-onboarding",children:"onboarding instructions"})," to enable you to ",(0,t.jsx)(n.a,{href:"/docs/node/install",children:"install"})," a network node successfully."]})}),"\n",(0,t.jsx)(n.h1,{id:"node-operator",children:"Node operator"}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.strong,{children:"Node Operator"})," is represented as a system administrator who builds, installs or maintains one or many nodes in a server or more."]}),"\n",(0,t.jsx)(n.p,{children:"Anyone willing to learn can become a Node operator, which will be enabled to set up and run a Node on their own at any time without the need for anyone's permission."}),"\n",(0,t.jsx)(n.p,{children:"Amongst others, the use cases we try to cover are:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Server requirements"}),"\n",(0,t.jsx)(n.li,{children:"Installing the Node easily with the installation wizard"}),"\n",(0,t.jsx)(n.li,{children:"Building a Node binary from source code"}),"\n",(0,t.jsx)(n.li,{children:"Configuring the Node"}),"\n",(0,t.jsx)(n.li,{children:"Securing the server and identity"}),"\n",(0,t.jsx)(n.li,{children:"Updating the Node"}),"\n",(0,t.jsx)(n.li,{children:"Learning to troubleshoot"}),"\n",(0,t.jsx)(n.li,{children:"Learning how to analyze the node process log messages"}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our ",(0,t.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"discord"})," or by opening a PR in any of our repositories."]})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Ready?"})," Start by checking the ",(0,t.jsx)(n.a,{href:"/docs/node/requirements",children:"server requirements"})]}),"\n",(0,t.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},3872:(e,n,r)=>{r.d(n,{Z:()=>o});r(7294);var t=r(5893);const o=e=>{let{image:n,name:r,title:o,url:i,communityMember:s=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:i,target:"_blank",alt:r,children:(0,t.jsx)("img",{src:n,alt:r})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:i,target:"_blank",alt:r,children:r})}),(0,t.jsx)("span",{className:"title",children:o}),(0,t.jsxs)("span",{className:"discord",children:[s?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,r)=>{r.d(n,{Z:()=>a,a:()=>s});var t=r(7294);const o={},i=t.createContext(o);function s(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f7d0305.7388f64a.js b/assets/js/9f7d0305.7388f64a.js deleted file mode 100644 index d26d1af2e..000000000 --- a/assets/js/9f7d0305.7388f64a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4713],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},g="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),g=c(n),u=r,m=g["".concat(s,".").concat(u)]||g[u]||p[u]||o;return n?a.createElement(m,l(l({ref:t},d),{},{components:n})):a.createElement(m,l({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,l=new Array(o);l[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[g]="string"==typeof e?e:r,l[1]=i;for(var c=2;c<o;c++)l[c]=n[c];return a.createElement.apply(null,l)}return a.createElement.apply(null,n)}u.displayName="MDXCreateElement"},3872:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(7294);const r=e=>{let{image:t,name:n,title:r,url:o,communityMember:l=!1}=e;return a.createElement("section",{className:"author_card"},a.createElement("div",null,a.createElement("span",{className:"avatar"},a.createElement("a",{href:o,target:"_blank",alt:n},a.createElement("img",{src:t,alt:n}))),a.createElement("div",null,a.createElement("span",{className:"name"},a.createElement("a",{href:o,target:"_blank",alt:n},n)),a.createElement("span",{className:"title"},r),a.createElement("span",{className:"discord"},l?"Join our community on":"Got questions? Find us on"," ",a.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},4826:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>d});var a=n(7462),r=(n(7294),n(3905)),o=n(3872);const l={title:"Analyzing logs",slug:"analyzing-logs",hide_title:!0,tags:["logs","diagnostic"]},i=void 0,s={unversionedId:"node/analyzing-logs",id:"node/analyzing-logs",title:"Analyzing logs",description:"Analyzing Logs",source:"@site/docs/node/analyzing-logs.md",sourceDirName:"node",slug:"/node/analyzing-logs",permalink:"/docs/node/analyzing-logs",draft:!1,tags:[{label:"logs",permalink:"/docs/tags/logs"},{label:"diagnostic",permalink:"/docs/tags/diagnostic"}],version:"current",frontMatter:{title:"Analyzing logs",slug:"analyzing-logs",hide_title:!0,tags:["logs","diagnostic"]},sidebar:"docs",previous:{title:"Health check",permalink:"/docs/node/health-check"},next:{title:"Systemd Service",permalink:"/docs/node/systemd-service"}},c={},d=[{value:"Analyzing Logs",id:"analyzing-logs",level:2},{value:"Log types",id:"log-types",level:2},{value:"Watch logs",id:"watch-logs",level:2}],g={toc:d},p="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"analyzing-logs"},"Analyzing Logs"),(0,r.kt)("p",null,"The service logs provide a timeline of events for the Lightning service that is valuable for troubleshooting when encountering issues\u2013when issues arise, analyzing log files is the first thing a node operator needs to do."),(0,r.kt)("p",null,"If you've installed the Node via the ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#assisted-installer"},"assisted installer"),", the logs are set up for you automatically. Otherwise, you have to follow the instructions provided in the ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#manual-installation"},"manual installation")," section."),(0,r.kt)("h2",{id:"log-types"},"Log types"),(0,r.kt)("p",null,"Standard out and standard error are two data streams created when we launch the Lightning process, on Lightning process activity we redirect the data streams to files as follows:"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Standard output")," - The text output from the service process is put in ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/log/lightning/output.log")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Standard error")," - The error messages from the service process are put in ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/log/lightning/diagnostic.log")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"By convention, most of the log files create on Linux are found under the directory ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/log/"),", a standard area where system messages are logged and recorded.")),(0,r.kt)("p",null,"Because normal output and error messages have their own channel, they can be handled independently of one another. Thus, we keep this in separate files that aggregate the output messages emitted by the Lightning process."),(0,r.kt)("h2",{id:"watch-logs"},"Watch logs"),(0,r.kt)("p",null,"The log files can be monitored in real-time for diagnosis and troubleshooting purposes and the tail command is the most basic way for this purpose."),(0,r.kt)("p",null,"You can watch the node standard output (stdout) by running the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/output.log\n")),(0,r.kt)("p",null,"Or, watch the standard error (stderr) for node diagnostics by running the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"tail -f /var/log/lightning/diagnostic.log\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you are controlling the Docker Container as a Systemd Service (Systemctl to start, stop or check the status) then the standard out (stdout) and standard error (stderr) logs are available as ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/log/lightning/*.log"),"."),(0,r.kt)("p",{parentName:"admonition"},"In any case, you can use the Docker command to analyze the logs. If you have stick with the default naming conventions it'd look like:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker logs -f lightning-node\n"))),(0,r.kt)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9f7d0305.ff0deaac.js b/assets/js/9f7d0305.ff0deaac.js new file mode 100644 index 000000000..17d473f4c --- /dev/null +++ b/assets/js/9f7d0305.ff0deaac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4713],{3890:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>g,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var s=t(5893),a=t(1151),o=t(3872);const i={title:"Analyzing logs",slug:"analyzing-logs",hide_title:!0,tags:["logs","diagnostic"]},r=void 0,l={id:"node/analyzing-logs",title:"Analyzing logs",description:"Analyzing Logs",source:"@site/docs/node/analyzing-logs.md",sourceDirName:"node",slug:"/node/analyzing-logs",permalink:"/docs/node/analyzing-logs",draft:!1,unlisted:!1,tags:[{label:"logs",permalink:"/docs/tags/logs"},{label:"diagnostic",permalink:"/docs/tags/diagnostic"}],version:"current",frontMatter:{title:"Analyzing logs",slug:"analyzing-logs",hide_title:!0,tags:["logs","diagnostic"]},sidebar:"docs",previous:{title:"Health check",permalink:"/docs/node/health-check"},next:{title:"Systemd Service",permalink:"/docs/node/systemd-service"}},d={},c=[{value:"Analyzing Logs",id:"analyzing-logs",level:2},{value:"Log types",id:"log-types",level:2},{value:"Watch logs",id:"watch-logs",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,a.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"analyzing-logs",children:"Analyzing Logs"}),"\n",(0,s.jsx)(n.p,{children:"The service logs provide a timeline of events for the Lightning service that is valuable for troubleshooting when encountering issues\u2013when issues arise, analyzing log files is the first thing a node operator needs to do."}),"\n",(0,s.jsxs)(n.p,{children:["If you've installed the Node via the ",(0,s.jsx)(n.a,{href:"/docs/node/install#assisted-installer",children:"assisted installer"}),", the logs are set up for you automatically. Otherwise, you have to follow the instructions provided in the ",(0,s.jsx)(n.a,{href:"/docs/node/install#manual-installation",children:"manual installation"})," section."]}),"\n",(0,s.jsx)(n.h2,{id:"log-types",children:"Log types"}),"\n",(0,s.jsx)(n.p,{children:"Standard out and standard error are two data streams created when we launch the Lightning process, on Lightning process activity we redirect the data streams to files as follows:"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Standard output"})," - The text output from the service process is put in ",(0,s.jsx)(n.code,{children:"/var/log/lightning/output.log"})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Standard error"})," - The error messages from the service process are put in ",(0,s.jsx)(n.code,{children:"/var/log/lightning/diagnostic.log"})]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["By convention, most of the log files create on Linux are found under the directory ",(0,s.jsx)(n.code,{children:"/var/log/"}),", a standard area where system messages are logged and recorded."]})}),"\n",(0,s.jsx)(n.p,{children:"Because normal output and error messages have their own channel, they can be handled independently of one another. Thus, we keep this in separate files that aggregate the output messages emitted by the Lightning process."}),"\n",(0,s.jsx)(n.h2,{id:"watch-logs",children:"Watch logs"}),"\n",(0,s.jsx)(n.p,{children:"The log files can be monitored in real-time for diagnosis and troubleshooting purposes and the tail command is the most basic way for this purpose."}),"\n",(0,s.jsx)(n.p,{children:"You can watch the node standard output (stdout) by running the command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/output.log\n"})}),"\n",(0,s.jsx)(n.p,{children:"Or, watch the standard error (stderr) for node diagnostics by running the command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"tail -f /var/log/lightning/diagnostic.log\n"})}),"\n",(0,s.jsxs)(n.admonition,{type:"tip",children:[(0,s.jsxs)(n.p,{children:["If you are controlling the Docker Container as a Systemd Service (Systemctl to start, stop or check the status) then the standard out (stdout) and standard error (stderr) logs are available as ",(0,s.jsx)(n.code,{children:"/var/log/lightning/*.log"}),"."]}),(0,s.jsx)(n.p,{children:"In any case, you can use the Docker command to analyze the logs. If you have stick with the default naming conventions it'd look like:"}),(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-sh",children:"sudo docker logs -f lightning-node\n"})})]}),"\n",(0,s.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function g(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>a});t(7294);var s=t(5893);const a=e=>{let{image:n,name:t,title:a,url:o,communityMember:i=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:o,target:"_blank",alt:t,children:(0,s.jsx)("img",{src:n,alt:t})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:o,target:"_blank",alt:t,children:t})}),(0,s.jsx)("span",{className:"title",children:a}),(0,s.jsxs)("span",{className:"discord",children:[i?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>r,a:()=>i});var s=t(7294);const a={},o=s.createContext(a);function i(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a13e0645.b94fc59c.js b/assets/js/a13e0645.94a2c40f.js similarity index 90% rename from assets/js/a13e0645.b94fc59c.js rename to assets/js/a13e0645.94a2c40f.js index 7220fc3cb..4ad03d886 100644 --- a/assets/js/a13e0645.b94fc59c.js +++ b/assets/js/a13e0645.94a2c40f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7136],{3120:e=>{e.exports=JSON.parse('{"label":"Codebase","permalink":"/docs/tags/codebase","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7136],{3120:e=>{e.exports=JSON.parse('{"label":"Codebase","permalink":"/docs/tags/codebase","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source","title":"Open-source","description":"Fleek Network\'s codebase.","permalink":"/docs/Open-source"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/a50e2e4f.1318cb1d.js b/assets/js/a50e2e4f.08511bd9.js similarity index 90% rename from assets/js/a50e2e4f.1318cb1d.js rename to assets/js/a50e2e4f.08511bd9.js index a007a2ddc..9980e0b1d 100644 --- a/assets/js/a50e2e4f.1318cb1d.js +++ b/assets/js/a50e2e4f.08511bd9.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7796],{2752:e=>{e.exports=JSON.parse('{"label":"awards","permalink":"/docs/tags/awards","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7796],{2752:e=>{e.exports=JSON.parse('{"label":"awards","permalink":"/docs/tags/awards","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/a626c4f3.9fea3752.js b/assets/js/a626c4f3.dee5a042.js similarity index 83% rename from assets/js/a626c4f3.9fea3752.js rename to assets/js/a626c4f3.dee5a042.js index 3ec513992..0f265b37d 100644 --- a/assets/js/a626c4f3.9fea3752.js +++ b/assets/js/a626c4f3.dee5a042.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[581],{4218:i=>{i.exports=JSON.parse('{"label":"lightning","permalink":"/docs/tags/lightning","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[581],{4218:e=>{e.exports=JSON.parse('{"label":"lightning","permalink":"/docs/tags/lightning","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.28469447.js b/assets/js/a6aa9e1f.28469447.js deleted file mode 100644 index 474af0165..000000000 --- a/assets/js/a6aa9e1f.28469447.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3089],{9703:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),r=a(5999),l=a(2244);function i(e){const{metadata:t}=e,{previousPage:a,nextPage:i}=t;return n.createElement("nav",{className:"pagination-nav","aria-label":(0,r.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"})},a&&n.createElement(l.Z,{permalink:a,title:n.createElement(r.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)"},"Newer Entries")}),i&&n.createElement(l.Z,{permalink:i,title:n.createElement(r.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)"},"Older Entries"),isNext:!0}))}},9985:(e,t,a)=>{a.d(t,{Z:()=>i});var n=a(7294),r=a(9460),l=a(390);function i(e){let{items:t,component:a=l.Z}=e;return n.createElement(n.Fragment,null,t.map((e=>{let{content:t}=e;return n.createElement(r.n,{key:t.metadata.permalink,content:t},n.createElement(a,null,n.createElement(t,null)))})))}},3402:(e,t,a)=>{a.r(t),a.d(t,{default:()=>E});var n=a(7294),r=a(6010),l=a(2263),i=a(833),s=a(5281),o=a(9058),c=a(9703),m=a(197),g=a(9985);const p=a.p+"assets/images/banner-engineering-fe62edcfd4235cdc38114d8e24aa9d1d.png";function d(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,l.Z)(),{blogDescription:r,blogTitle:s,permalink:o}=t,c="/"===o?a:s;return n.createElement(n.Fragment,null,n.createElement(i.d,{title:c,description:r}),n.createElement(m.Z,{tag:"blog_posts_list"}))}function u(e){const{metadata:t,items:a,sidebar:r}=e;return n.createElement(o.Z,{sidebar:r},n.createElement("div",null,n.createElement("img",{className:"banner",src:p})),n.createElement(g.Z,{items:a}),n.createElement(c.Z,{metadata:t}))}function E(e){return n.createElement(i.FG,{className:(0,r.Z)(s.k.wrapper.blogPages,s.k.page.blogListPage)},n.createElement(d,e),n.createElement(u,e))}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.e40508bd.js b/assets/js/a6aa9e1f.e40508bd.js new file mode 100644 index 000000000..62db3ff75 --- /dev/null +++ b/assets/js/a6aa9e1f.e40508bd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3089],{9703:(e,t,a)=>{a.d(t,{Z:()=>r});a(7294);var n=a(5999),s=a(2244),i=a(5893);function r(e){const{metadata:t}=e,{previousPage:a,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.I)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,i.jsx)(s.Z,{permalink:a,title:(0,i.jsx)(n.Z,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,i.jsx)(s.Z,{permalink:r,title:(0,i.jsx)(n.Z,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},9985:(e,t,a)=>{a.d(t,{Z:()=>r});a(7294);var n=a(9460),s=a(390),i=a(5893);function r(e){let{items:t,component:a=s.Z}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(n.n,{content:t,children:(0,i.jsx)(a,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},3402:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(7294);var n=a(512),s=a(2263),i=a(833),r=a(5281),l=a(1460),o=a(9703),d=a(197),g=a(9985);const c=a.p+"assets/images/banner-engineering-fe62edcfd4235cdc38114d8e24aa9d1d.png";var p=a(5893);function m(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,s.Z)(),{blogDescription:n,blogTitle:r,permalink:l}=t,o="/"===l?a:r;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(i.d,{title:o,description:n}),(0,p.jsx)(d.Z,{tag:"blog_posts_list"})]})}function x(e){const{metadata:t,items:a,sidebar:n}=e;return(0,p.jsxs)(l.Z,{sidebar:n,children:[(0,p.jsx)("div",{children:(0,p.jsx)("img",{className:"banner",src:c})}),(0,p.jsx)(g.Z,{items:a}),(0,p.jsx)(o.Z,{metadata:t})]})}function b(e){return(0,p.jsxs)(i.FG,{className:(0,n.Z)(r.k.wrapper.blogPages,r.k.page.blogListPage),children:[(0,p.jsx)(m,{...e}),(0,p.jsx)(x,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/a771de40.71ea664a.js b/assets/js/a771de40.cd72cf12.js similarity index 88% rename from assets/js/a771de40.71ea664a.js rename to assets/js/a771de40.cd72cf12.js index 0872b735c..084bad1ca 100644 --- a/assets/js/a771de40.71ea664a.js +++ b/assets/js/a771de40.cd72cf12.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6074],{8606:e=>{e.exports=JSON.parse('{"label":"control","permalink":"/docs/tags/control","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6074],{8606:e=>{e.exports=JSON.parse('{"label":"control","permalink":"/docs/tags/control","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/systemd-service","title":"Systemd Service","description":"Systemd Service","permalink":"/docs/node/systemd-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.928fb9e5.js b/assets/js/a7bd4aaa.928fb9e5.js new file mode 100644 index 000000000..3bceb9c6f --- /dev/null +++ b/assets/js/a7bd4aaa.928fb9e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8518],{8564:(n,e,s)=>{s.r(e),s.d(e,{default:()=>l});s(7294);var r=s(833),o=s(3320),t=s(4477),c=s(8790),i=s(197),a=s(5893);function u(n){const{version:e}=n;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.Z,{version:e.version,tag:(0,o.os)(e.pluginId,e.version)}),(0,a.jsx)(r.d,{children:e.noIndex&&(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function d(n){const{version:e,route:s}=n;return(0,a.jsx)(r.FG,{className:e.className,children:(0,a.jsx)(t.q,{version:e,children:(0,c.H)(s.routes)})})}function l(n){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(u,{...n}),(0,a.jsx)(d,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.1851859d.js b/assets/js/a94703ab.1851859d.js new file mode 100644 index 000000000..965c83a86 --- /dev/null +++ b/assets/js/a94703ab.1851859d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4368],{2674:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(7294),o=n(4334),i=n(833),s=n(5281),l=n(2802),r=n(1116),c=n(5999),d=n(2466),u=n(5936);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(5893);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.Ct)();return(0,d.RF)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a<t?o(!1):a+window.innerHeight<document.documentElement.scrollHeight&&o(!0))})),(0,u.S)((e=>{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.I)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.Z)("clean-btn",s.k.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(1442),x=n(6550),f=n(7524),j=n(6668),k=n(1327);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const v={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.I)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.I)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.Z)("button button--secondary button--outline",v.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:v.collapseSidebarButtonIcon})})}var C=n(9689),S=n(902);const I=Symbol("EmptyContext"),N=a.createContext(I);function T(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var B=n(6043),Z=n(8596),A=n(9960),L=n(2389);function y(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.I)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.I)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),type:"button",className:"clean-btn menu__caret",onClick:a})}function w(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.L)(),k=function(e){const t=(0,L.Z)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.LM)(e):void 0),[e,t])}(t),_=(0,l._F)(t,i),v=(0,Z.Mg)(x,i),{collapsed:g,setCollapsed:C}=(0,B.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:T,setExpandedItem:w}=function(){const e=(0,a.useContext)(N);if(e===I)throw new S.i6("DocSidebarItemsExpandedStateProvider");return e}(),E=function(e){void 0===e&&(e=!g),w(e?null:c),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.D9)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:E}),(0,a.useEffect)((()=>{h&&null!=T&&T!==c&&f&&C(!0)}),[h,T,c,C,f]),(0,b.jsxs)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemCategory,s.k.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.Z)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v}),children:[(0,b.jsx)(A.Z,{className:(0,o.Z)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?E(!1):(e.preventDefault(),E())}:()=>{n?.(t)},"aria-current":v?"page":void 0,"aria-expanded":h?!g:void 0,href:h?k??"#":k,...d,children:m}),x&&h&&(0,b.jsx)(y,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),E()}})]}),(0,b.jsx)(B.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(V,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var E=n(3919),H=n(9471);const M={menuExternalLink:"menuExternalLink_NmtK"};function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l._F)(t,a),x=(0,E.Z)(d);return(0,b.jsx)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemLink,s.k.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(A.Z,{className:(0,o.Z)("menu__link",!x&&M.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.Z,{})]})},u)}const W={menuHtmlItem:"menuHtmlItem_M9Kj"};function F(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.Z)(s.k.docs.docSidebarItemLink,s.k.docs.docSidebarItemLinkLevel(n),l&&[W.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function P(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(w,{item:t,...n});case"html":return(0,b.jsx)(F,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function D(e){let{items:t,...n}=e;const a=(0,l.f)(t,n.activePath);return(0,b.jsx)(T,{children:a.map(((e,t)=>(0,b.jsx)(P,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(D),U={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function K(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,C.nT)(),[t,n]=(0,a.useState)(e);return(0,d.RF)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.I)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.Z)("menu thin-scrollbar",U.menu,l&&U.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.Z)(s.k.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const Y="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",G="sidebarHidden_VK0M",O="sidebarLogo_isFc";function q(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.L)();return(0,b.jsxs)("div",{className:(0,o.Z)(Y,s&&z,i&&G),children:[s&&(0,b.jsx)(k.Z,{tabIndex:-1,className:O}),(0,b.jsx)(K,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const J=a.memo(q);var Q=n(3102),X=n(3163);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,X.e)();return(0,b.jsx)("ul",{className:(0,o.Z)(s.k.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(Q.Zo,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.i)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(J,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.I)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.I)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.V)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.TH)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.n)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.Z)(s.k.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.Z)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.V)();return(0,b.jsx)("main",{className:(0,o.Z)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.Z)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.V)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(5658);function be(e){const t=(0,l.SN)(e);if(!t)return(0,b.jsx)(me.Z,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.FG,{className:(0,o.Z)(s.k.page.docsDocPage),children:(0,b.jsx)(r.b,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},5658:(e,t,n)=>{n.d(t,{Z:()=>l});n(7294);var a=n(4334),o=n(5999),i=n(2503),s=n(5893);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.Z)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.Z,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.Z,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.Z,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.Z,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/a9a76bf7.5c10b5a8.js b/assets/js/a9a76bf7.6ebee837.js similarity index 83% rename from assets/js/a9a76bf7.5c10b5a8.js rename to assets/js/a9a76bf7.6ebee837.js index 456e8a803..b870afb0b 100644 --- a/assets/js/a9a76bf7.5c10b5a8.js +++ b/assets/js/a9a76bf7.6ebee837.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4356],{8826:e=>{e.exports=JSON.parse('{"label":"onboarding","permalink":"/docs/tags/onboarding","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4356],{8826:e=>{e.exports=JSON.parse('{"label":"onboarding","permalink":"/docs/tags/onboarding","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/aa81941d.9d9f9412.js b/assets/js/aa81941d.a884d55b.js similarity index 97% rename from assets/js/aa81941d.9d9f9412.js rename to assets/js/aa81941d.a884d55b.js index ffd9fed20..1b20b9e71 100644 --- a/assets/js/aa81941d.9d9f9412.js +++ b/assets/js/aa81941d.a884d55b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3012],{5689:e=>{e.exports=JSON.parse('{"label":"Edge Platform","permalink":"/docs/tags/edge-platform","allTagsPath":"/docs/tags","count":4,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3012],{5689:e=>{e.exports=JSON.parse('{"label":"Edge Platform","permalink":"/docs/tags/edge-platform","allTagsPath":"/docs/tags","count":4,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ad04e600.4cda4442.js b/assets/js/ad04e600.80dbb210.js similarity index 81% rename from assets/js/ad04e600.4cda4442.js rename to assets/js/ad04e600.80dbb210.js index 635f2b7c8..9cb1377b3 100644 --- a/assets/js/ad04e600.4cda4442.js +++ b/assets/js/ad04e600.80dbb210.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5844],{3998:e=>{e.exports=JSON.parse('{"label":"container","permalink":"/guides/tags/container","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","permalink":"/guides/Node Operators/running-a-node-in-docker"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5844],{3998:e=>{e.exports=JSON.parse('{"label":"container","permalink":"/guides/tags/container","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","permalink":"/guides/Node Operators/running-a-node-in-docker"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ae013ba6.4cc80cf7.js b/assets/js/ae013ba6.851e7143.js similarity index 86% rename from assets/js/ae013ba6.4cc80cf7.js rename to assets/js/ae013ba6.851e7143.js index 2e4e018d3..521cac1bf 100644 --- a/assets/js/ae013ba6.4cc80cf7.js +++ b/assets/js/ae013ba6.851e7143.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9981],{2879:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/references/tags/image","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9981],{2879:e=>{e.exports=JSON.parse('{"label":"image","permalink":"/references/tags/image","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ae70e824.246e99e9.js b/assets/js/ae70e824.0e6f6d61.js similarity index 88% rename from assets/js/ae70e824.246e99e9.js rename to assets/js/ae70e824.0e6f6d61.js index e311f5ece..b4847d5c7 100644 --- a/assets/js/ae70e824.246e99e9.js +++ b/assets/js/ae70e824.0e6f6d61.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1433],{360:e=>{e.exports=JSON.parse('{"label":"logs","permalink":"/guides/tags/logs","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/how-to-manage-logfiles","title":"How to manage log files","description":"Learn how to rotate, compress the log files","permalink":"/guides/Node Operators/how-to-manage-log-files"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1433],{360:e=>{e.exports=JSON.parse('{"label":"logs","permalink":"/guides/tags/logs","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/how-to-manage-logfiles","title":"How to manage log files","description":"Learn how to rotate, compress the log files","permalink":"/guides/Node Operators/how-to-manage-log-files"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/af6a11bf.4290cebc.js b/assets/js/af6a11bf.050de1e1.js similarity index 97% rename from assets/js/af6a11bf.4290cebc.js rename to assets/js/af6a11bf.050de1e1.js index a1b46c56d..5be27a74e 100644 --- a/assets/js/af6a11bf.4290cebc.js +++ b/assets/js/af6a11bf.050de1e1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3503],{5296:e=>{e.exports=JSON.parse('{"label":"help","permalink":"/references/tags/help","allTagsPath":"/references/tags","count":10,"items":[{"id":"index","title":"About references","description":"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.","permalink":"/references/"},{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","permalink":"/references/Lightning CLI/error-building-on-arm64"},{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"},{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3503],{5296:e=>{e.exports=JSON.parse('{"label":"help","permalink":"/references/tags/help","allTagsPath":"/references/tags","count":10,"items":[{"id":"index","title":"About references","description":"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.","permalink":"/references/"},{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/backing-up-the-keystore"},{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","permalink":"/references/Lightning CLI/error-building-on-arm64"},{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","permalink":"/references/Lightning CLI/restore-the-keystore"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"},{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"},{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/b02525a9.456b9285.js b/assets/js/b02525a9.4e924af7.js similarity index 82% rename from assets/js/b02525a9.456b9285.js rename to assets/js/b02525a9.4e924af7.js index a3a072012..261719f0f 100644 --- a/assets/js/b02525a9.456b9285.js +++ b/assets/js/b02525a9.4e924af7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6980],{3993:e=>{e.exports=JSON.parse('{"label":"Guides","permalink":"/guides/tags/guides","allTagsPath":"/guides/tags","count":1,"items":[{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","permalink":"/guides/"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6980],{3993:e=>{e.exports=JSON.parse('{"label":"Guides","permalink":"/guides/tags/guides","allTagsPath":"/guides/tags","count":1,"items":[{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","permalink":"/guides/"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/b03a0ac1.7c16d2b5.js b/assets/js/b03a0ac1.5e843cb3.js similarity index 93% rename from assets/js/b03a0ac1.7c16d2b5.js rename to assets/js/b03a0ac1.5e843cb3.js index 654965944..6c0ea0040 100644 --- a/assets/js/b03a0ac1.7c16d2b5.js +++ b/assets/js/b03a0ac1.5e843cb3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4785],{2312:e=>{e.exports=JSON.parse('{"label":"CDN","permalink":"/docs/tags/cdn","allTagsPath":"/docs/tags","count":4,"items":[{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4785],{2312:e=>{e.exports=JSON.parse('{"label":"CDN","permalink":"/docs/tags/cdn","allTagsPath":"/docs/tags","count":4,"items":[{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"},{"id":"whitepaper","title":"Whitepaper","description":"Fleek Network\'s whitepaper and codebase.","permalink":"/docs/whitepaper"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/b249ed45.77028740.js b/assets/js/b249ed45.77028740.js deleted file mode 100644 index 75bb00478..000000000 --- a/assets/js/b249ed45.77028740.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5767],{3905:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>h});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},m=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),d=s(n),p=o,h=d["".concat(c,".").concat(p)]||d[p]||u[p]||a;return n?r.createElement(h,i(i({ref:t},m),{},{components:n})):r.createElement(h,i({ref:t},m))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[d]="string"==typeof e?e:o,i[1]=l;for(var s=2;s<a;s++)i[s]=n[s];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}p.displayName="MDXCreateElement"},2915:(e,t,n)=>{n.d(t,{ZP:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={toc:[]},i="wrapper";function l(e){let{components:t,...n}=e;return(0,o.kt)(i,(0,r.Z)({},a,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"You have several ways of doing this:"),(0,o.kt)("ul",{parentName:"admonition"},(0,o.kt)("li",{parentName:"ul"},"Clone via HTTPS"),(0,o.kt)("li",{parentName:"ul"},"Clone via SSH"),(0,o.kt)("li",{parentName:"ul"},"Download via Github CLI"),(0,o.kt)("li",{parentName:"ul"},"Download the ",(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip"},"zip package")," from the repository")),(0,o.kt)("p",{parentName:"admonition"},"We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,o.kt)("a",{parentName:"p",href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh"},"here"),"."),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>\n")),(0,o.kt)("p",{parentName:"admonition"},"At time of writing, we are checking the branch name ",(0,o.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1")," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"))))}l.isMDXComponent=!0},6655:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>c,toc:()=>m});var r=n(7462),o=(n(7294),n(3905)),a=n(3872);n(2915);const i={title:"Uninstall Docker Setup",slug:"uninstall-docker-setup",hide_title:!0,tags:["references","help","docker","image","container"]},l=void 0,c={unversionedId:"Docker/uninstall-docker-setup",id:"Docker/uninstall-docker-setup",title:"Uninstall Docker Setup",description:"Remove the source code locally",source:"@site/references/Docker/uninstall-docker-setup.md",sourceDirName:"Docker",slug:"/Docker/uninstall-docker-setup",permalink:"/references/Docker/uninstall-docker-setup",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Docker/uninstall-docker-setup.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"docker",permalink:"/references/tags/docker"},{label:"image",permalink:"/references/tags/image"},{label:"container",permalink:"/references/tags/container"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Uninstall Docker Setup",slug:"uninstall-docker-setup",hide_title:!0,tags:["references","help","docker","image","container"]},sidebar:"defaultSidebar",previous:{title:"Frequently used commands for Docker setup",permalink:"/references/Docker/frequently-used-commands-for-docker-setup"},next:{title:"Error building on ARM64",permalink:"/references/Lightning CLI/error-building-on-arm64"}},s={},m=[{value:"Remove the source code locally",id:"remove-the-source-code-locally",level:2},{value:"Stop the Docker service",id:"stop-the-docker-service",level:2},{value:"Confirm the Docker service status",id:"confirm-the-docker-service-status",level:2},{value:"Reload the daemon",id:"reload-the-daemon",level:2},{value:"Remove the Systemd Service Unit file",id:"remove-the-systemd-service-unit-file",level:2},{value:"Delete the Docker image",id:"delete-the-docker-image",level:2},{value:"Uninstall Docker",id:"uninstall-docker",level:2},{value:"Manage keys",id:"manage-keys",level:2},{value:"Remove the logs",id:"remove-the-logs",level:2}],d={toc:m},u="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"remove-the-source-code-locally"},"Remove the source code locally"),(0,o.kt)("p",null,"For users who build the Docker image from source-code."),(0,o.kt)("p",null,"Assuming the default installation source-code path ",(0,o.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning"),", run the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"rm -rf ~/fleek-network/lightning\n")),(0,o.kt)("p",null,"If you have a custom path, you need to change the pathname to the correct path you have selected during your custom install."),(0,o.kt)("h2",{id:"stop-the-docker-service"},"Stop the Docker service"),(0,o.kt)("p",null,"The Fleek Network recommends systemctl to manage the services, either natively or docker. It's an interface that is easily to translate across the setups, and to communicate to the users in a common manner."),(0,o.kt)("p",null,"If you have followed the recommendations, you should have the Systemd Unit Service setup."),(0,o.kt)("p",null,"To stop the service run the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo systemctl stop docker-lightning\n")),(0,o.kt)("h2",{id:"confirm-the-docker-service-status"},"Confirm the Docker service status"),(0,o.kt)("p",null,"Check the status by:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo systemctl status docker-lightning\n")),(0,o.kt)("p",null,"Disable the service by:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo systemctl disable docker-lightning\n")),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Once stop, you can run the following command to confirm it is not running. If you have used the recommended container name ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning-node")," the command you'd have to execute is:"),(0,o.kt)("p",{parentName:"admonition"},"You can check the Docker container isn't running by running the following command. Notice that we are assuming that your docker container name is the default ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning-node"),". If you have customized the name use the correct selected name:"),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre"},"sudo docker container inspect -f '{{.State.Running}}' lightning-node\n"))),(0,o.kt)("h2",{id:"reload-the-daemon"},"Reload the daemon"),(0,o.kt)("p",null,"Reload the daemon by:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo systemctl daemon-reload\n")),(0,o.kt)("h2",{id:"remove-the-systemd-service-unit-file"},"Remove the Systemd Service Unit file"),(0,o.kt)("p",null,"If you have followed the recommendations, you should find the Systemd Service Unit file at:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/etc/systemd/system/docker-lightning\n")),(0,o.kt)("p",null,"To remove the file, run the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"sudo rm -f /etc/systemd/system/docker-lightning\n")),(0,o.kt)("h2",{id:"delete-the-docker-image"},"Delete the Docker image"),(0,o.kt)("p",null,"For our example, we'll assume that the Docker image for Fleek Network is the default ",(0,o.kt)("inlineCode",{parentName:"p"},"lightning-node"),". If you have created the image under a different name, change in accordance to your preference."),(0,o.kt)("p",null,"Delete the image by running the following command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker rmi $(docker images | grep 'lightning-node')\n")),(0,o.kt)("p",null,"To learn more about the docker image remove command, visit the official documentation ",(0,o.kt)("a",{parentName:"p",href:"https://docs.docker.com/engine/reference/commandline/image_rm/"},"here")),(0,o.kt)("h2",{id:"uninstall-docker"},"Uninstall Docker"),(0,o.kt)("p",null,"Uninstalling Docker should only be performed if you don't need in your system. If you already had Docker for some purpose, you should not have to uninstall it."),(0,o.kt)("p",null,"Visit the Docker official documentation site for uninstall instructions ",(0,o.kt)("a",{parentName:"p",href:"https://docs.docker.com/desktop/uninstall/"},"here"),"."),(0,o.kt)("h2",{id:"manage-keys"},"Manage keys"),(0,o.kt)("p",null,"The configuration directory of Fleek Network is in the host machine file system. This is the directory where you can find the ",(0,o.kt)("inlineCode",{parentName:"p"},"config.toml"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"keystore")," for the public keys, amongst others. "),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/home/<USERNAME>/.lightning\n")),(0,o.kt)("p",null,"For example, for the user ",(0,o.kt)("inlineCode",{parentName:"p"},"lgtn")," the location of these files is:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/home/lgtn/.lightning\n")),(0,o.kt)("admonition",{title:"warning",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The directory can be deleted but have in mind that the keystore is located here. If you need to backup the keystore, be careful as this is not possible to recover by anyone. The keys are your responsibility.")),(0,o.kt)("p",null,"To learn more about the keystore read the guide ",(0,o.kt)("a",{parentName:"p",href:"/guides/Node%20Operators/managing-the-keystore"},"managing the keystore"),"."),(0,o.kt)("p",null,"If you are happy to delete the directory, run the following command by replacing the ",(0,o.kt)("inlineCode",{parentName:"p"},"<USERNAME>")," by yours:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"rm -rf /home/<USERNAME>/.lightning\n")),(0,o.kt)("h2",{id:"remove-the-logs"},"Remove the logs"),(0,o.kt)("p",null,"The Docker container generates output to stdout and stderr. All the content is stored in the location:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"/var/log/lightning\n")),(0,o.kt)("p",null,"To completely remove the directory run the command:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"sudo rm -rf /var/log/lightning\n")),(0,o.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}p.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294);const o=e=>{let{image:t,name:n,title:o,url:a,communityMember:i=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:a,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:a,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},o),r.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/b249ed45.790c0dff.js b/assets/js/b249ed45.790c0dff.js new file mode 100644 index 000000000..ff14048b2 --- /dev/null +++ b/assets/js/b249ed45.790c0dff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5767],{3183:(e,n,t)=>{t.d(n,{ZP:()=>s});var r=t(5893),o=t(1151);function i(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsx)(n.p,{children:"You have several ways of doing this:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Clone via HTTPS"}),"\n",(0,r.jsx)(n.li,{children:"Clone via SSH"}),"\n",(0,r.jsx)(n.li,{children:"Download via Github CLI"}),"\n",(0,r.jsxs)(n.li,{children:["Download the ",(0,r.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip",children:"zip package"})," from the repository"]}),"\n"]}),(0,r.jsxs)(n.p,{children:["We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,r.jsx)(n.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh",children:"here"}),"."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>\n"})}),(0,r.jsxs)(n.p,{children:["At time of writing, we are checking the branch name ",(0,r.jsx)(n.code,{children:"testnet-alpha-1"})," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"})})]})}function s(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},1583:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>c,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var r=t(5893),o=t(1151),i=t(3872);t(3183);const s={title:"Uninstall Docker Setup",slug:"uninstall-docker-setup",hide_title:!0,tags:["references","help","docker","image","container"]},c=void 0,l={id:"Docker/uninstall-docker-setup",title:"Uninstall Docker Setup",description:"Remove the source code locally",source:"@site/references/Docker/uninstall-docker-setup.md",sourceDirName:"Docker",slug:"/Docker/uninstall-docker-setup",permalink:"/references/Docker/uninstall-docker-setup",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Docker/uninstall-docker-setup.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"docker",permalink:"/references/tags/docker"},{label:"image",permalink:"/references/tags/image"},{label:"container",permalink:"/references/tags/container"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Uninstall Docker Setup",slug:"uninstall-docker-setup",hide_title:!0,tags:["references","help","docker","image","container"]},sidebar:"defaultSidebar",previous:{title:"Frequently used commands for Docker setup",permalink:"/references/Docker/frequently-used-commands-for-docker-setup"},next:{title:"Error building on ARM64",permalink:"/references/Lightning CLI/error-building-on-arm64"}},a={},d=[{value:"Remove the source code locally",id:"remove-the-source-code-locally",level:2},{value:"Stop the Docker service",id:"stop-the-docker-service",level:2},{value:"Confirm the Docker service status",id:"confirm-the-docker-service-status",level:2},{value:"Reload the daemon",id:"reload-the-daemon",level:2},{value:"Remove the Systemd Service Unit file",id:"remove-the-systemd-service-unit-file",level:2},{value:"Delete the Docker image",id:"delete-the-docker-image",level:2},{value:"Uninstall Docker",id:"uninstall-docker",level:2},{value:"Manage keys",id:"manage-keys",level:2},{value:"Remove the logs",id:"remove-the-logs",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"remove-the-source-code-locally",children:"Remove the source code locally"}),"\n",(0,r.jsx)(n.p,{children:"For users who build the Docker image from source-code."}),"\n",(0,r.jsxs)(n.p,{children:["Assuming the default installation source-code path ",(0,r.jsx)(n.code,{children:"~/fleek-network/lightning"}),", run the command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"rm -rf ~/fleek-network/lightning\n"})}),"\n",(0,r.jsx)(n.p,{children:"If you have a custom path, you need to change the pathname to the correct path you have selected during your custom install."}),"\n",(0,r.jsx)(n.h2,{id:"stop-the-docker-service",children:"Stop the Docker service"}),"\n",(0,r.jsx)(n.p,{children:"The Fleek Network recommends systemctl to manage the services, either natively or docker. It's an interface that is easily to translate across the setups, and to communicate to the users in a common manner."}),"\n",(0,r.jsx)(n.p,{children:"If you have followed the recommendations, you should have the Systemd Unit Service setup."}),"\n",(0,r.jsx)(n.p,{children:"To stop the service run the command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sudo systemctl stop docker-lightning\n"})}),"\n",(0,r.jsx)(n.h2,{id:"confirm-the-docker-service-status",children:"Confirm the Docker service status"}),"\n",(0,r.jsx)(n.p,{children:"Check the status by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sudo systemctl status docker-lightning\n"})}),"\n",(0,r.jsx)(n.p,{children:"Disable the service by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sudo systemctl disable docker-lightning\n"})}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:["Once stop, you can run the following command to confirm it is not running. If you have used the recommended container name ",(0,r.jsx)(n.code,{children:"lightning-node"})," the command you'd have to execute is:"]}),(0,r.jsxs)(n.p,{children:["You can check the Docker container isn't running by running the following command. Notice that we are assuming that your docker container name is the default ",(0,r.jsx)(n.code,{children:"lightning-node"}),". If you have customized the name use the correct selected name:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sudo docker container inspect -f '{{.State.Running}}' lightning-node\n"})})]}),"\n",(0,r.jsx)(n.h2,{id:"reload-the-daemon",children:"Reload the daemon"}),"\n",(0,r.jsx)(n.p,{children:"Reload the daemon by:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sudo systemctl daemon-reload\n"})}),"\n",(0,r.jsx)(n.h2,{id:"remove-the-systemd-service-unit-file",children:"Remove the Systemd Service Unit file"}),"\n",(0,r.jsx)(n.p,{children:"If you have followed the recommendations, you should find the Systemd Service Unit file at:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/etc/systemd/system/docker-lightning\n"})}),"\n",(0,r.jsx)(n.p,{children:"To remove the file, run the command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"sudo rm -f /etc/systemd/system/docker-lightning\n"})}),"\n",(0,r.jsx)(n.h2,{id:"delete-the-docker-image",children:"Delete the Docker image"}),"\n",(0,r.jsxs)(n.p,{children:["For our example, we'll assume that the Docker image for Fleek Network is the default ",(0,r.jsx)(n.code,{children:"lightning-node"}),". If you have created the image under a different name, change in accordance to your preference."]}),"\n",(0,r.jsx)(n.p,{children:"Delete the image by running the following command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"sudo docker rmi $(docker images | grep 'lightning-node')\n"})}),"\n",(0,r.jsxs)(n.p,{children:["To learn more about the docker image remove command, visit the official documentation ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/image_rm/",children:"here"})]}),"\n",(0,r.jsx)(n.h2,{id:"uninstall-docker",children:"Uninstall Docker"}),"\n",(0,r.jsx)(n.p,{children:"Uninstalling Docker should only be performed if you don't need in your system. If you already had Docker for some purpose, you should not have to uninstall it."}),"\n",(0,r.jsxs)(n.p,{children:["Visit the Docker official documentation site for uninstall instructions ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/desktop/uninstall/",children:"here"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"manage-keys",children:"Manage keys"}),"\n",(0,r.jsxs)(n.p,{children:["The configuration directory of Fleek Network is in the host machine file system. This is the directory where you can find the ",(0,r.jsx)(n.code,{children:"config.toml"}),", ",(0,r.jsx)(n.code,{children:"keystore"})," for the public keys, amongst others."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/home/<USERNAME>/.lightning\n"})}),"\n",(0,r.jsxs)(n.p,{children:["For example, for the user ",(0,r.jsx)(n.code,{children:"lgtn"})," the location of these files is:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/home/lgtn/.lightning\n"})}),"\n",(0,r.jsx)(n.admonition,{title:"warning",type:"caution",children:(0,r.jsx)(n.p,{children:"The directory can be deleted but have in mind that the keystore is located here. If you need to backup the keystore, be careful as this is not possible to recover by anyone. The keys are your responsibility."})}),"\n",(0,r.jsxs)(n.p,{children:["To learn more about the keystore read the guide ",(0,r.jsx)(n.a,{href:"/guides/Node%20Operators/managing-the-keystore",children:"managing the keystore"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you are happy to delete the directory, run the following command by replacing the ",(0,r.jsx)(n.code,{children:"<USERNAME>"})," by yours:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"rm -rf /home/<USERNAME>/.lightning\n"})}),"\n",(0,r.jsx)(n.h2,{id:"remove-the-logs",children:"Remove the logs"}),"\n",(0,r.jsx)(n.p,{children:"The Docker container generates output to stdout and stderr. All the content is stored in the location:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"/var/log/lightning\n"})}),"\n",(0,r.jsx)(n.p,{children:"To completely remove the directory run the command:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"sudo rm -rf /var/log/lightning\n"})}),"\n",(0,r.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function m(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},3872:(e,n,t)=>{t.d(n,{Z:()=>o});t(7294);var r=t(5893);const o=e=>{let{image:n,name:t,title:o,url:i,communityMember:s=!1}=e;return(0,r.jsx)("section",{className:"author_card",children:(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"avatar",children:(0,r.jsx)("a",{href:i,target:"_blank",alt:t,children:(0,r.jsx)("img",{src:n,alt:t})})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"name",children:(0,r.jsx)("a",{href:i,target:"_blank",alt:t,children:t})}),(0,r.jsx)("span",{className:"title",children:o}),(0,r.jsxs)("span",{className:"discord",children:[s?"Join our community on":"Got questions? Find us on"," ",(0,r.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>s});var r=t(7294);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.1ddf11f7.js b/assets/js/b2f554cd.1ddf11f7.js new file mode 100644 index 000000000..f59e521b4 --- /dev/null +++ b/assets/js/b2f554cd.1ddf11f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1477],{10:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"bloom-and-cuckoo-filters-for-cache-summarization","metadata":{"permalink":"/blog/bloom-and-cuckoo-filters-for-cache-summarization","source":"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md","title":"Bloom Filters and Cuckoo Filters for Cache Summarization","description":"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.","date":"2023-11-01T18:03:13.000Z","formattedDate":"November 1, 2023","tags":[{"label":"fleek network","permalink":"/blog/tags/fleek-network"},{"label":"blog","permalink":"/blog/tags/blog"},{"label":"engineering","permalink":"/blog/tags/engineering"},{"label":"content routing","permalink":"/blog/tags/content-routing"}],"readingTime":10.37,"hasTruncateMarker":true,"authors":[{"name":"Matthias Wright","title":"Software Engineer","url":"https://github.com/matthias-wright","image_url":"https://github.com/matthias-wright.png","imageURL":"https://github.com/matthias-wright.png"}],"frontMatter":{"title":"Bloom Filters and Cuckoo Filters for Cache Summarization","description":"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.","slug":"bloom-and-cuckoo-filters-for-cache-summarization","image":"./assets/bloom-cuckoo/bloom.png?202301181528","authors":{"name":"Matthias Wright","title":"Software Engineer","url":"https://github.com/matthias-wright","image_url":"https://github.com/matthias-wright.png","imageURL":"https://github.com/matthias-wright.png"},"tags":["fleek network","blog","engineering","content routing"]},"unlisted":false},"content":"Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.\\n\\n\x3c!--truncate--\x3e\\n\\n## Background\\n\\nNodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.\\n\\nIf a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.\\n\\nWe are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.\\n\\n## Bloom Filters\\n\\nA Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries.\\nThe answer to an approximate set membership query is not `no` or `yes,` but rather `no` or `probably.` This `probably` is quantified with the false positive rate. \\n\\nOne of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate.\\nOf course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: `insert` and `contains.` \\n\\nA Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions.\\nThe resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren\'t already 1). \\nTo check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.\\n\\nIf all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.\\n\\nHowever, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play. \\n\\nSince we also need a `remove` operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters.\\nCounting Bloom filters retain most of the properties that regular Bloom filters have. The `remove` operation comes at the cost of an increased memory footprint.\\n\\nEach position in the array is no longer a single bit but a group of bits representing a counter.\\nWhenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.\\n\\n## Cuckoo Filters\\n\\nBloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters).\\nA relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.\\n\\nThey are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations `insert,` `contains,` and `remove,` and have configurable false positive rates. \\n\\nCuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets.\\nWe determine two candidate buckets for each element using two different hash functions, h1 and h2. \\n\\nThe `contains` operation will check if either bucket contains the element.\\nFor insertion, if either bucket is empty, the element will be inserted into the empty bucket.\\n\\nIf neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location.\\nThis may trigger another relocation if the alternate location is not empty. \\n\\nAlthough the insertion operation may perform a sequence of relocations, the amortized runtime is O(1). \\n\\nMost implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].\\n\\nFor Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element\'s hash - rather than key-value pairs.\\n\\nThe fingerprint size is derived from the desired false positive rate. \\nA problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.\\n\\nOf course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.\\n\\nThe solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element\'s alternate location using only its fingerprint. \\nFor a given element x, the two candidate buckets are computed as follows: \\n\\n\\n\x3c!-- \\nTODO: Install math forms renderer, till then use img\\n\\n$h_1(x) = \\\\text{hash}(x)$\\n\\n$h_2(x) = h_1(x) \\\\oplus \\\\text{hash}(\\\\text{fingerprint}(x))$\\n--\x3e\\n\\n![](./assets/bloom-cuckoo/math-formul.png?202301181528)\\n\\nAn important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.\\n\\n## Benchmarking\\n\\nAs this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.\\n\\nInstead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance. \\n\\nSpace efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.\\n\\nLookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck. \\n\\n## Experimental Setup\\n\\nWe are using our own Counting Bloom filter [implementation](https://github.com/fleek-network/ursa/blob/483f4d56cbaa5e83182454d2c1db6f6af7c54912/crates/ursa-network/src/utils/bloom_filter.rs#L11) and [scalable cuckoo filter](https://github.com/sile/scalable_cuckoo_filter?gh) Cuckoo filter implementation in Rust, the [original cuckoofilter](https://github.com/efficient/cuckoofilter?gh) implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.\\n\\n## Memory Footprint\\n\\nFor both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter\'s capacity and the desired false positive rate. In the first experiment, we examine the impact that\\nthese factors have on the memory footprint. \\n\\nTo this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. \\nThe size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].\\n\\n![](./assets/bloom-cuckoo/capacity-size.png?202301121718)\\n\\n> Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.\\n\\nNext, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.\\n\\nThe gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].\\n\\n![](./assets/bloom-cuckoo/fp-rate-size.png?202301121718)\\n\\n> Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.\\n\\n## Lookup Performance\\n\\nWe first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.\\n\\nA positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation. \\n\\nFig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1],\\nwhere Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.\\n\\nHowever, the performance difference is negligible.\\n\\n![](./assets/bloom-cuckoo/lookup.png?202301121718)\\n\\n> Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative.\\nThe shaded region indicates the standard deviation.\\n\\n## Insertion Performance\\n\\nLess critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels.\\nFig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.\\n\\nFor Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching. \\n\\n![](./assets/bloom-cuckoo/insert.png?202301121718)\\n\\n> Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.\\n\\n## Capacity and Scaling\\n\\nWe have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter\'s capacity is exceeded.\\nBloom filters and Cuckoo filters behave differently in this scenario.\\n\\nFor Bloom filters, the `insertion` operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter\'s capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of\\nrelocations that will be performed for an insertion. The `insertion` operation will return an error if more relocations are required. \\n\\nFor both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.\\n\\nFurthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes. \\n\\nFortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.\\n\\nThe proposed technique is also applicable to Cuckoo filters.\\n\\n## Other Filters\\n\\nWhile we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:\\n\\n* Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters. \\n\\n* XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added. \\n\\n## Conclusion\\n\\nWe examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.\\n\\nBoth filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case. \\n\\n### References\\n\\n[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom.\\nIn Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014. \\n\\n[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004. \\n\\n[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007. \\n\\n[4] Paulo S. Almeida, Carlos Baquero, Nuno Pregui\xe7a, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007. \\n\\n[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984. \\n\\n[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005. \\n \\n[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020."}]}')}}]); \ No newline at end of file diff --git a/assets/js/b2f554cd.295697e8.js b/assets/js/b2f554cd.295697e8.js deleted file mode 100644 index 6f6bb4e8b..000000000 --- a/assets/js/b2f554cd.295697e8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1477],{10:e=>{e.exports=JSON.parse('{"blogPosts":[{"id":"bloom-and-cuckoo-filters-for-cache-summarization","metadata":{"permalink":"/blog/bloom-and-cuckoo-filters-for-cache-summarization","source":"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md","title":"Bloom Filters and Cuckoo Filters for Cache Summarization","description":"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.","date":"2023-10-31T18:15:43.000Z","formattedDate":"October 31, 2023","tags":[{"label":"fleek network","permalink":"/blog/tags/fleek-network"},{"label":"blog","permalink":"/blog/tags/blog"},{"label":"engineering","permalink":"/blog/tags/engineering"},{"label":"content routing","permalink":"/blog/tags/content-routing"}],"readingTime":10.37,"hasTruncateMarker":true,"authors":[{"name":"Matthias Wright","title":"Software Engineer","url":"https://github.com/matthias-wright","image_url":"https://github.com/matthias-wright.png","imageURL":"https://github.com/matthias-wright.png"}],"frontMatter":{"title":"Bloom Filters and Cuckoo Filters for Cache Summarization","description":"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.","slug":"bloom-and-cuckoo-filters-for-cache-summarization","image":"./assets/bloom-cuckoo/bloom.png?202301181528","authors":{"name":"Matthias Wright","title":"Software Engineer","url":"https://github.com/matthias-wright","image_url":"https://github.com/matthias-wright.png","imageURL":"https://github.com/matthias-wright.png"},"tags":["fleek network","blog","engineering","content routing"]}},"content":"Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.\\n\\n\x3c!--truncate--\x3e\\n\\n## Background\\n\\nNodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.\\n\\nIf a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.\\n\\nWe are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.\\n\\n## Bloom Filters\\n\\nA Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries.\\nThe answer to an approximate set membership query is not `no` or `yes,` but rather `no` or `probably.` This `probably` is quantified with the false positive rate. \\n\\nOne of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate.\\nOf course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: `insert` and `contains.` \\n\\nA Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions.\\nThe resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren\'t already 1). \\nTo check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.\\n\\nIf all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.\\n\\nHowever, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play. \\n\\nSince we also need a `remove` operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters.\\nCounting Bloom filters retain most of the properties that regular Bloom filters have. The `remove` operation comes at the cost of an increased memory footprint.\\n\\nEach position in the array is no longer a single bit but a group of bits representing a counter.\\nWhenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.\\n\\n## Cuckoo Filters\\n\\nBloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters).\\nA relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.\\n\\nThey are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations `insert,` `contains,` and `remove,` and have configurable false positive rates. \\n\\nCuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets.\\nWe determine two candidate buckets for each element using two different hash functions, h1 and h2. \\n\\nThe `contains` operation will check if either bucket contains the element.\\nFor insertion, if either bucket is empty, the element will be inserted into the empty bucket.\\n\\nIf neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location.\\nThis may trigger another relocation if the alternate location is not empty. \\n\\nAlthough the insertion operation may perform a sequence of relocations, the amortized runtime is O(1). \\n\\nMost implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].\\n\\nFor Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element\'s hash - rather than key-value pairs.\\n\\nThe fingerprint size is derived from the desired false positive rate. \\nA problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.\\n\\nOf course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.\\n\\nThe solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element\'s alternate location using only its fingerprint. \\nFor a given element x, the two candidate buckets are computed as follows: \\n\\n\\n\x3c!-- \\nTODO: Install math forms renderer, till then use img\\n\\n$h_1(x) = \\\\text{hash}(x)$\\n\\n$h_2(x) = h_1(x) \\\\oplus \\\\text{hash}(\\\\text{fingerprint}(x))$\\n--\x3e\\n\\n![](./assets/bloom-cuckoo/math-formul.png?202301181528)\\n\\nAn important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.\\n\\n## Benchmarking\\n\\nAs this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.\\n\\nInstead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance. \\n\\nSpace efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.\\n\\nLookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck. \\n\\n## Experimental Setup\\n\\nWe are using our own Counting Bloom filter [implementation](https://github.com/fleek-network/ursa/blob/483f4d56cbaa5e83182454d2c1db6f6af7c54912/crates/ursa-network/src/utils/bloom_filter.rs#L11) and [scalable cuckoo filter](https://github.com/sile/scalable_cuckoo_filter?gh) Cuckoo filter implementation in Rust, the [original cuckoofilter](https://github.com/efficient/cuckoofilter?gh) implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.\\n\\n## Memory Footprint\\n\\nFor both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter\'s capacity and the desired false positive rate. In the first experiment, we examine the impact that\\nthese factors have on the memory footprint. \\n\\nTo this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. \\nThe size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].\\n\\n![](./assets/bloom-cuckoo/capacity-size.png?202301121718)\\n\\n> Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.\\n\\nNext, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.\\n\\nThe gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].\\n\\n![](./assets/bloom-cuckoo/fp-rate-size.png?202301121718)\\n\\n> Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.\\n\\n## Lookup Performance\\n\\nWe first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.\\n\\nA positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation. \\n\\nFig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1],\\nwhere Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.\\n\\nHowever, the performance difference is negligible.\\n\\n![](./assets/bloom-cuckoo/lookup.png?202301121718)\\n\\n> Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative.\\nThe shaded region indicates the standard deviation.\\n\\n## Insertion Performance\\n\\nLess critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels.\\nFig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.\\n\\nFor Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching. \\n\\n![](./assets/bloom-cuckoo/insert.png?202301121718)\\n\\n> Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.\\n\\n## Capacity and Scaling\\n\\nWe have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter\'s capacity is exceeded.\\nBloom filters and Cuckoo filters behave differently in this scenario.\\n\\nFor Bloom filters, the `insertion` operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter\'s capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of\\nrelocations that will be performed for an insertion. The `insertion` operation will return an error if more relocations are required. \\n\\nFor both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.\\n\\nFurthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes. \\n\\nFortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.\\n\\nThe proposed technique is also applicable to Cuckoo filters.\\n\\n## Other Filters\\n\\nWhile we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:\\n\\n* Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters. \\n\\n* XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added. \\n\\n## Conclusion\\n\\nWe examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.\\n\\nBoth filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case. \\n\\n### References\\n\\n[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom.\\nIn Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014. \\n\\n[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004. \\n\\n[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007. \\n\\n[4] Paulo S. Almeida, Carlos Baquero, Nuno Pregui\xe7a, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007. \\n\\n[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984. \\n\\n[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005. \\n \\n[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020."}]}')}}]); \ No newline at end of file diff --git a/assets/js/b35f1b7f.e3527fb9.js b/assets/js/b35f1b7f.e3527fb9.js new file mode 100644 index 000000000..28e54e3a2 --- /dev/null +++ b/assets/js/b35f1b7f.e3527fb9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7706],{9747:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>d,toc:()=>a});var n=t(5893),r=t(1151),i=t(3872);const c={title:"User service",slug:"user-service",hide_title:!0,tags:["references","help","user service","unit","systemctl","systemd"]},l=void 0,d={id:"Systemd/user-service",title:"User service",description:"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.",source:"@site/references/Systemd/user-service.md",sourceDirName:"Systemd",slug:"/Systemd/user-service",permalink:"/references/Systemd/user-service",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Systemd/user-service.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"user service",permalink:"/references/tags/user-service"},{label:"unit",permalink:"/references/tags/unit"},{label:"systemctl",permalink:"/references/tags/systemctl"},{label:"systemd",permalink:"/references/tags/systemd"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"User service",slug:"user-service",hide_title:!0,tags:["references","help","user service","unit","systemctl","systemd"]},sidebar:"defaultSidebar",previous:{title:"Shutting down persistance",permalink:"/references/Systemd/shutting-down-persistance"}},o={},a=[{value:"Check <code>--user</code> support",id:"check---user-support",level:2},{value:"Put the service unit in the user service",id:"put-the-service-unit-in-the-user-service",level:2},{value:"Reload daemon",id:"reload-daemon",level:2},{value:"Systemd service control as <code>--user</code>",id:"systemd-service-control-as---user",level:2},{value:"Problem statement",id:"problem-statement",level:2}];function h(e){const s={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(s.p,{children:["A user should have the ability to run a Systemd user service unit without having to use ",(0,n.jsx)(s.code,{children:"sudo"})," to control it."]}),"\n",(0,n.jsxs)(s.h2,{id:"check---user-support",children:["Check ",(0,n.jsx)(s.code,{children:"--user"})," support"]}),"\n",(0,n.jsxs)(s.p,{children:["Use the ",(0,n.jsx)(s.code,{children:"--user"})," flag when getting the list of unit files."]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user list-unit-files\n"})}),"\n",(0,n.jsx)(s.p,{children:"It should return a list of unit files."}),"\n",(0,n.jsx)(s.h2,{id:"put-the-service-unit-in-the-user-service",children:"Put the service unit in the user service"}),"\n",(0,n.jsx)(s.p,{children:"Create the Systemd user units directory:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo mkdir -p /etc/systemd/system/user\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Move the ",(0,n.jsx)(s.code,{children:"lightning.service"})," to the system user unit service directory:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"mv /etc/systemd/system/lightning.service /etc/systemd/system/user/lightning.service\n"})}),"\n",(0,n.jsxs)(s.p,{children:["Check the ",(0,n.jsx)(s.strong,{children:"Load path when running in user mode (--user)"})," in ",(0,n.jsx)(s.a,{href:"https://www.freedesktop.org/software/systemd/man/systemd.unit.html",children:"Systemd unit"})," for other alternative user paths, or to understand how it works to customize your server accordingly."]}),"\n",(0,n.jsx)(s.h2,{id:"reload-daemon",children:"Reload daemon"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,n.jsxs)(s.h2,{id:"systemd-service-control-as---user",children:["Systemd service control as ",(0,n.jsx)(s.code,{children:"--user"})]}),"\n",(0,n.jsx)(s.p,{children:"Reload the Systemctl daemon by executing the command:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user daemon-reload\n"})}),"\n",(0,n.jsx)(s.p,{children:"Enable the service for starting up on system boot:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user enable lightning.service\n"})}),"\n",(0,n.jsx)(s.p,{children:"Start the service by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user start lightning\n"})}),"\n",(0,n.jsx)(s.p,{children:"Stop the service by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user stop lightning\n"})}),"\n",(0,n.jsx)(s.p,{children:"Restart the service by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user restart lightning\n"})}),"\n",(0,n.jsx)(s.p,{children:"Check the service status by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user status lightning.service\n"})}),"\n",(0,n.jsx)(s.h2,{id:"problem-statement",children:"Problem statement"}),"\n",(0,n.jsxs)(s.p,{children:["On tests done in a DigitalOcean Ubuntu 22.x, we had set up user-level services which were operated with ",(0,n.jsx)(s.code,{children:"--user"}),". When the commands were executed as ",(0,n.jsx)(s.code,{children:"--user"})," it failed with:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)\n"})}),"\n",(0,n.jsx)(s.p,{children:"The user should be able to operate as user, it shouldn't be required to connect on behalf of other users. This means that even for a simple command, such as to retrieve the list of unit files:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"systemctl --user list-unit-files\n"})}),"\n",(0,n.jsx)(s.p,{children:"We'd get the error:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)\n"})}),"\n",(0,n.jsxs)(s.p,{children:["For any of the supported user unit locations e.g. $HOME/.config/systemd/user as documented in ",(0,n.jsx)(s.a,{href:"https://www.freedesktop.org/software/systemd/man/systemd.unit.html",children:"Systemd unit documentation"}),", the result is the error above."]}),"\n",(0,n.jsxs)(s.p,{children:["This is related to the load paths when running in user mode (--user), as described in the discussion ",(0,n.jsx)(s.a,{href:"https://unix.stackexchange.com/questions/224992/where-do-i-put-my-systemd-unit-file/367237#367237",children:"here"}),"."]}),"\n",(0,n.jsx)(s.p,{children:(0,n.jsx)(s.strong,{children:"User-dependent"})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"$XDG_CONFIG_HOME/systemd/user"})," User configuration (only used when $XDG_CONFIG_HOME is set)"]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"$HOME/.config/systemd/user"})," User configuration (only used when $XDG_CONFIG_HOME is not set)"]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"$XDG_RUNTIME_DIR/systemd/user"})," Runtime units (only used when $XDG_RUNTIME_DIR is set)"]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"$XDG_DATA_HOME/systemd/user"})," Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is set)"]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"$HOME/.local/share/systemd/user"})," Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is not set)"]}),"\n",(0,n.jsxs)(s.p,{children:["For example, if we check the ",(0,n.jsx)(s.code,{children:"$XDG_RUNTIME_DIR"})," in a DigitalOcean box, we get the following output:"]}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"/run/user/0\n"})}),"\n",(0,n.jsx)(s.p,{children:"For this reason and to provide support for a wider audience of users and systems, we've stuck to sudo to execute the service, but this should not be a requirement and is not recommended."}),"\n",(0,n.jsx)(i.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:s}={...(0,r.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3872:(e,s,t)=>{t.d(s,{Z:()=>r});t(7294);var n=t(5893);const r=e=>{let{image:s,name:t,title:r,url:i,communityMember:c=!1}=e;return(0,n.jsx)("section",{className:"author_card",children:(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"avatar",children:(0,n.jsx)("a",{href:i,target:"_blank",alt:t,children:(0,n.jsx)("img",{src:s,alt:t})})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"name",children:(0,n.jsx)("a",{href:i,target:"_blank",alt:t,children:t})}),(0,n.jsx)("span",{className:"title",children:r}),(0,n.jsxs)("span",{className:"discord",children:[c?"Join our community on":"Got questions? Find us on"," ",(0,n.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>c});var n=t(7294);const r={},i=n.createContext(r);function c(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b35f1b7f.eab94299.js b/assets/js/b35f1b7f.eab94299.js deleted file mode 100644 index 34aee63f3..000000000 --- a/assets/js/b35f1b7f.eab94299.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7706],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var s=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,s)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,s,n=function(e,t){if(null==e)return{};var r,s,n={},a=Object.keys(e);for(s=0;s<a.length;s++)r=a[s],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(s=0;s<a.length;s++)r=a[s],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var o=s.createContext({}),u=function(e){var t=s.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},c=function(e){var t=u(e.components);return s.createElement(o.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return s.createElement(s.Fragment,{},t)}},d=s.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,o=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(r),d=n,h=p["".concat(o,".").concat(d)]||p[d]||m[d]||a;return r?s.createElement(h,l(l({ref:t},c),{},{components:r})):s.createElement(h,l({ref:t},c))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,l=new Array(a);l[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[p]="string"==typeof e?e:n,l[1]=i;for(var u=2;u<a;u++)l[u]=r[u];return s.createElement.apply(null,l)}return s.createElement.apply(null,r)}d.displayName="MDXCreateElement"},5733:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var s=r(7462),n=(r(7294),r(3905)),a=r(3872);const l={title:"User service",slug:"user-service",hide_title:!0,tags:["references","help","user service","unit","systemctl","systemd"]},i=void 0,o={unversionedId:"Systemd/user-service",id:"Systemd/user-service",title:"User service",description:"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.",source:"@site/references/Systemd/user-service.md",sourceDirName:"Systemd",slug:"/Systemd/user-service",permalink:"/references/Systemd/user-service",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Systemd/user-service.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"user service",permalink:"/references/tags/user-service"},{label:"unit",permalink:"/references/tags/unit"},{label:"systemctl",permalink:"/references/tags/systemctl"},{label:"systemd",permalink:"/references/tags/systemd"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"User service",slug:"user-service",hide_title:!0,tags:["references","help","user service","unit","systemctl","systemd"]},sidebar:"defaultSidebar",previous:{title:"Shutting down persistance",permalink:"/references/Systemd/shutting-down-persistance"}},u={},c=[{value:"Check <code>--user</code> support",id:"check---user-support",level:2},{value:"Put the service unit in the user service",id:"put-the-service-unit-in-the-user-service",level:2},{value:"Reload daemon",id:"reload-daemon",level:2},{value:"Systemd service control as <code>--user</code>",id:"systemd-service-control-as---user",level:2},{value:"Problem statement",id:"problem-statement",level:2}],p={toc:c},m="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(m,(0,s.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"A user should have the ability to run a Systemd user service unit without having to use ",(0,n.kt)("inlineCode",{parentName:"p"},"sudo")," to control it."),(0,n.kt)("h2",{id:"check---user-support"},"Check ",(0,n.kt)("inlineCode",{parentName:"h2"},"--user")," support"),(0,n.kt)("p",null,"Use the ",(0,n.kt)("inlineCode",{parentName:"p"},"--user")," flag when getting the list of unit files."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user list-unit-files\n")),(0,n.kt)("p",null,"It should return a list of unit files."),(0,n.kt)("h2",{id:"put-the-service-unit-in-the-user-service"},"Put the service unit in the user service"),(0,n.kt)("p",null,"Create the Systemd user units directory:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"sudo mkdir -p /etc/systemd/system/user\n")),(0,n.kt)("p",null,"Move the ",(0,n.kt)("inlineCode",{parentName:"p"},"lightning.service")," to the system user unit service directory:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"mv /etc/systemd/system/lightning.service /etc/systemd/system/user/lightning.service\n")),(0,n.kt)("p",null,"Check the ",(0,n.kt)("strong",{parentName:"p"},"Load path when running in user mode (--user)")," in ",(0,n.kt)("a",{parentName:"p",href:"https://www.freedesktop.org/software/systemd/man/systemd.unit.html"},"Systemd unit")," for other alternative user paths, or to understand how it works to customize your server accordingly."),(0,n.kt)("h2",{id:"reload-daemon"},"Reload daemon"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,n.kt)("h2",{id:"systemd-service-control-as---user"},"Systemd service control as ",(0,n.kt)("inlineCode",{parentName:"h2"},"--user")),(0,n.kt)("p",null,"Reload the Systemctl daemon by executing the command:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user daemon-reload\n")),(0,n.kt)("p",null,"Enable the service for starting up on system boot:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user enable lightning.service\n")),(0,n.kt)("p",null,"Start the service by:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user start lightning\n")),(0,n.kt)("p",null,"Stop the service by:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user stop lightning\n")),(0,n.kt)("p",null,"Restart the service by:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user restart lightning\n")),(0,n.kt)("p",null,"Check the service status by:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user status lightning.service\n")),(0,n.kt)("h2",{id:"problem-statement"},"Problem statement"),(0,n.kt)("p",null,"On tests done in a DigitalOcean Ubuntu 22.x, we had set up user-level services which were operated with ",(0,n.kt)("inlineCode",{parentName:"p"},"--user"),". When the commands were executed as ",(0,n.kt)("inlineCode",{parentName:"p"},"--user")," it failed with:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)\n")),(0,n.kt)("p",null,"The user should be able to operate as user, it shouldn't be required to connect on behalf of other users. This means that even for a simple command, such as to retrieve the list of unit files:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"systemctl --user list-unit-files\n")),(0,n.kt)("p",null,"We'd get the error:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)\n")),(0,n.kt)("p",null,"For any of the supported user unit locations e.g. $HOME/.config/systemd/user as documented in ",(0,n.kt)("a",{parentName:"p",href:"https://www.freedesktop.org/software/systemd/man/systemd.unit.html"},"Systemd unit documentation"),", the result is the error above."),(0,n.kt)("p",null,"This is related to the load paths when running in user mode (--user), as described in the discussion ",(0,n.kt)("a",{parentName:"p",href:"https://unix.stackexchange.com/questions/224992/where-do-i-put-my-systemd-unit-file/367237#367237"},"here"),"."),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"User-dependent")),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"$XDG_CONFIG_HOME/systemd/user")," User configuration (only used when $XDG_CONFIG_HOME is set)"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"$HOME/.config/systemd/user")," User configuration (only used when $XDG_CONFIG_HOME is not set)"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"$XDG_RUNTIME_DIR/systemd/user")," Runtime units (only used when $XDG_RUNTIME_DIR is set)"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"$XDG_DATA_HOME/systemd/user")," Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is set)"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"$HOME/.local/share/systemd/user")," Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is not set)"),(0,n.kt)("p",null,"For example, if we check the ",(0,n.kt)("inlineCode",{parentName:"p"},"$XDG_RUNTIME_DIR")," in a DigitalOcean box, we get the following output:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-sh"},"/run/user/0\n")),(0,n.kt)("p",null,"For this reason and to provide support for a wider audience of users and systems, we've stuck to sudo to execute the service, but this should not be a requirement and is not recommended."),(0,n.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}d.isMDXComponent=!0},3872:(e,t,r)=>{r.d(t,{Z:()=>n});var s=r(7294);const n=e=>{let{image:t,name:r,title:n,url:a,communityMember:l=!1}=e;return s.createElement("section",{className:"author_card"},s.createElement("div",null,s.createElement("span",{className:"avatar"},s.createElement("a",{href:a,target:"_blank",alt:r},s.createElement("img",{src:t,alt:r}))),s.createElement("div",null,s.createElement("span",{className:"name"},s.createElement("a",{href:a,target:"_blank",alt:r},r)),s.createElement("span",{className:"title"},n),s.createElement("span",{className:"discord"},l?"Join our community on":"Got questions? Find us on"," ",s.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/b40daf0f.2f5ab135.js b/assets/js/b40daf0f.2f5ab135.js new file mode 100644 index 000000000..e25cd6aee --- /dev/null +++ b/assets/js/b40daf0f.2f5ab135.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2126],{9303:(n,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>u});var e=o(5893),i=o(1151);const r={title:"Configuration",tags:["Configuration"],sidebarCollapsible:!1},a=void 0,s={id:"node/configuration",title:"Configuration",description:"TODO: Configuration",source:"@site/docs/node/configuration.md",sourceDirName:"node",slug:"/node/configuration",permalink:"/docs/node/configuration",draft:!1,unlisted:!1,tags:[{label:"Configuration",permalink:"/docs/tags/configuration"}],version:"current",frontMatter:{title:"Configuration",tags:["Configuration"],sidebarCollapsible:!1}},c={},u=[];function f(n){const t={p:"p",...(0,i.a)(),...n.components};return(0,e.jsx)(t.p,{children:"TODO: Configuration"})}function d(n={}){const{wrapper:t}={...(0,i.a)(),...n.components};return t?(0,e.jsx)(t,{...n,children:(0,e.jsx)(f,{...n})}):f(n)}},1151:(n,t,o)=>{o.d(t,{Z:()=>s,a:()=>a});var e=o(7294);const i={},r=e.createContext(i);function a(n){const t=e.useContext(r);return e.useMemo((function(){return"function"==typeof n?n(t):{...t,...n}}),[t,n])}function s(n){let t;return t=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:a(n.components),e.createElement(r.Provider,{value:t},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/b40daf0f.f8f42c37.js b/assets/js/b40daf0f.f8f42c37.js deleted file mode 100644 index 0f521c6e2..000000000 --- a/assets/js/b40daf0f.f8f42c37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2126],{3905:(e,t,n)=>{n.d(t,{Zo:()=>f,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function c(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var u=r.createContext({}),l=function(e){var t=r.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},f=function(e){var t=l(e.components);return r.createElement(u.Provider,{value:t},e.children)},p="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,u=e.parentName,f=c(e,["components","mdxType","originalType","parentName"]),p=l(n),d=o,g=p["".concat(u,".").concat(d)]||p[d]||s[d]||a;return n?r.createElement(g,i(i({ref:t},f),{},{components:n})):r.createElement(g,i({ref:t},f))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c[p]="string"==typeof e?e:o,i[1]=c;for(var l=2;l<a;l++)i[l]=n[l];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},6332:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a={title:"Configuration",tags:["Configuration"],sidebarCollapsible:!1},i=void 0,c={unversionedId:"node/configuration",id:"node/configuration",title:"Configuration",description:"TODO: Configuration",source:"@site/docs/node/configuration.md",sourceDirName:"node",slug:"/node/configuration",permalink:"/docs/node/configuration",draft:!1,tags:[{label:"Configuration",permalink:"/docs/tags/configuration"}],version:"current",frontMatter:{title:"Configuration",tags:["Configuration"],sidebarCollapsible:!1}},u={},l=[],f={toc:l},p="wrapper";function s(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"TODO: Configuration"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b5954e33.0de601d3.js b/assets/js/b5954e33.0de601d3.js deleted file mode 100644 index f2b6b1275..000000000 --- a/assets/js/b5954e33.0de601d3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2114],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function l(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},o=Object.keys(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)n=o[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),d=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=d(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=d(n),m=r,h=p["".concat(s,".").concat(m)]||p[m]||u[m]||o;return n?a.createElement(h,i(i({ref:t},c),{},{components:n})):a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:r,i[1]=l;for(var d=2;d<o;d++)i[d]=n[d];return a.createElement.apply(null,i)}return a.createElement.apply(null,n)}m.displayName="MDXCreateElement"},4692:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var a=n(7462),r=(n(7294),n(3905));const o={title:"Token and economics",slug:"token-and-economics",hide_title:!0,description:"Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.",tags:["tokenomics","token","economics","rewards","awards","incentives"],sidebarCollapsible:!1,sidebar_position:1},i=void 0,l={unversionedId:"learn/token-and-economics",id:"learn/token-and-economics",title:"Token and economics",description:"Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.",source:"@site/docs/learn/token-and-economics.md",sourceDirName:"learn",slug:"/learn/token-and-economics",permalink:"/docs/learn/token-and-economics",draft:!1,tags:[{label:"tokenomics",permalink:"/docs/tags/tokenomics"},{label:"token",permalink:"/docs/tags/token"},{label:"economics",permalink:"/docs/tags/economics"},{label:"rewards",permalink:"/docs/tags/rewards"},{label:"awards",permalink:"/docs/tags/awards"},{label:"incentives",permalink:"/docs/tags/incentives"}],version:"current",sidebarPosition:1,frontMatter:{title:"Token and economics",slug:"token-and-economics",hide_title:!0,description:"Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.",tags:["tokenomics","token","economics","rewards","awards","incentives"],sidebarCollapsible:!1,sidebar_position:1},sidebar:"docs",previous:{title:"Delivery Acknowledgements",permalink:"/docs/learn/delivery-acknowledgements"},next:{title:"Services",permalink:"/docs/learn/services"}},s={},d=[{value:"Overview",id:"overview",level:2},{value:"The Utility Token",id:"the-utility-token",level:2},{value:"Stable token for payments",id:"stable-token-for-payments",level:2},{value:"Resource Pricing",id:"resource-pricing",level:2},{value:"The FLK Token:",id:"the-flk-token",level:2},{value:"Algorithmic Economic System",id:"algorithmic-economic-system",level:2},{value:"Protocol-Owned Liquidity",id:"protocol-owned-liquidity",level:2},{value:"FLK Token Distribution",id:"flk-token-distribution",level:2},{value:"Overall Distribution",id:"overall-distribution",level:3},{value:"Community Distribution",id:"community-distribution",level:3}],c={toc:d},p="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,a.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"overview"},"Overview"),(0,r.kt)("p",null,"The Fleek Network runs on an incentivized economy model that rewards node operators who provide resources that form the network. Currently, the economic model is to be considered a first draft, subject to change based on the data and feedback collected throughout all phases of testnet. The purpose of sharing a first draft is to provide clarity to prospective node operators and developers interested in participating in any pre-mainnet activities. You can find the complete breakdown of this information in this ",(0,r.kt)("a",{parentName:"p",href:"https://blog.fleek.network/post/fleek-network-testnet-plans/"},"article")),(0,r.kt)("h2",{id:"the-utility-token"},"The Utility Token"),(0,r.kt)("p",null,"Fleek Network has a utility token named FLK, an ERC-20 token issued on Ethereum (L1). The Fleek Network interacts with it as native to the protocol, given that the token intent is user accessibility and familiarity, making the interactions in the system as frictionless as possible. To accomplish this, the network has a Proof-of-Consensus bridge that facilitates entry and exit from Fleek Network\u2014a Zero Knowledge Proof (ZKP) bridge that enables token retrieval."),(0,r.kt)("h2",{id:"stable-token-for-payments"},"Stable token for payments"),(0,r.kt)("p",null,"The primary income for Account Holders is derived from a set of stable cryptocurrencies, which are easily tradable and highly liquid. For example, node operators receive rewards from stable coins (USD rate), ensuring a stable and predictable income stream. Note, that the network employs an inflationary mechanism, providing additional rewards for stakeholders via the minting of FLK tokens."),(0,r.kt)("h2",{id:"resource-pricing"},"Resource Pricing"),(0,r.kt)("p",null,"To start, Fleek Network only plans to charge for bandwidth and CPU cycles consumed. Pricing will be set at the network level, and resources will be priced and paid for in USD-denominated stablecoins. The exact pricing methodology will be determined and finalized throughout the testnet phases based on different factors. Those factors include:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Cost data the Foundation collects from node operators during testnet"),(0,r.kt)("li",{parentName:"ul"},"The final specs of the SDK (which will determine what data the protocol can verifiably collect from nodes and reliably charge for)")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Please be aware, there will be no fees paid during any of the testnet phases, the above is solely for illustrative purposes")," to give nodes a better understanding of the current thinking and what the process to finalize resource pricing might look like. We will work collaboratively with node operators throughout testnet to fairly determine resource pricing to ensure appropriate node incentivization while offering competitive pricing to developers."),(0,r.kt)("p",null,"It\u2019s also important to note that node operators are independent of the Foundation, the network, and each other. They are responsible for managing their own economics, including any taxes payable in any jurisdiction relevant to them due to their participation in the network."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"the-flk-token"},"The FLK Token:"),(0,r.kt)("p",null,"FLK is a staking token that is an integral part of the Fleek Network. Nodes running the Fleek Network client software are required to obtain and stake FLK in order to participate in the network and to have the opportunity to earn fees for providing work. Below is some high-level information on the anticipated characteristics of the FLK token:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Stake amount per node is set/managed at the protocol level, and consistent across all nodes"),(0,r.kt)("li",{parentName:"ul"},"Work is allocated based on location (latency) and reputation (performance)"),(0,r.kt)("li",{parentName:"ul"},"Resources on the network are priced and paid by users in USD denominated stablecoins",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Pricing of resources happens at the network level."))),(0,r.kt)("li",{parentName:"ul"},"Nodes only receive rewards related to work they perform, based on resources used/consumed (including FLK rewards)"),(0,r.kt)("li",{parentName:"ul"},"FLK rewards are paid out per epoch (~24 hours). The FLK reward pool for each epoch is split proportionally between nodes who performed work during that epoch, calculated by the amount of USD revenue each node earned compared to the total revenue earned during that epoch."),(0,r.kt)("li",{parentName:"ul"},"20% of the total FLK token supply is set aside for staking/rewards. The actual rate of rewards/inflation will be algorithmically controlled and updated based on network usage and other factors such as the market price of FLK.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"DISCLAIMER"),": All information in this post about the FLK token and other elements of the Fleek Network is being provided solely for informational purposes and does not constitute an offer to sell FLK tokens, or a request for such offers, in any jurisdiction. There are currently no plans to sell FLK tokens. If FLK tokens do become available, you should not rely on the information in this blog post in making purchasing decisions, as the blog post was not prepared for that purpose and there will be important additional information to consider. In addition, we will likely publish further blog posts with updated information about the platform launch."),(0,r.kt)("u",null,"ALTHOUGH THERE ARE NO PLANS TO SELL FLK TOKENS AT THIS TIME, FOR THE AVOIDANCE OF DOUBT, IF FLK TOKENS EVER WERE TO BE SOLD, THEY WOULD BE OFFERED FOR SALE ONLY OUTSIDE OF THE UNITED STATES TO NON\u2010U.S. PERSONS, PURSUANT TO THE PROVISIONS OF REGULATION S OF THE U.S. SECURITIES ACT OF 1933, AS AMENDED (THE \u201cSECURITIES ACT\u201d). THE OFFER AND SALE OF FLK TOKENS WILL NOT BE REGISTERED UNDER THE SECURITIES ACT, AND MAY NOT BE OFFERED OR SOLD IN THE UNITED STATES ABSENT REGISTRATION OR AN APPLICABLE EXEMPTION FROM THE REGISTRATION REQUIREMENTS."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"algorithmic-economic-system"},"Algorithmic Economic System"),(0,r.kt)("p",null,"The TLDR of the current implementation being discussed is that the network will handle the economic system/inflation algorithmically, using a concept we are calling ",(0,r.kt)("strong",{parentName:"p"},"NME, which stands for ","[N]","et present value (npv) ","[M]","arket price ","[E]","quillibrium.")),(0,r.kt)("p",null,"The algorithmic economic system has several goals, listed below in order of priority:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Provide an opportunity for receiving consistent blended earnings to node operators based on their work in most market conditions",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"\u201cBlended\u201d means taking into account both the USD stable coin fees that nodes are earning, and the FLK rewards they are earning (including factoring in the time-weighted average market price of FLK)."),(0,r.kt)("li",{parentName:"ul"},"This means if network usage/revenue increases, FLK rewards will likely decrease, and vice versa. This also means that if the time-weighted average market price of FLK increases, nodes should reasonably expect that the amount of FLK rewards will decrease, but the value of FLK rewards received (in USD terms) will remain approximately the same."))),(0,r.kt)("li",{parentName:"ul"},"Don\u2019t overcompensate nodes, especially in times of market volatility",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"If the market price of FLK deviates from the NPV calculated in-protocol based on time-weighted average protocol-level revenue, nodes should reasonably expect that FLK rewards by number would be reduced."))),(0,r.kt)("li",{parentName:"ul"},"Keep the network economy in equilibrium in most market conditions"),(0,r.kt)("li",{parentName:"ul"},"Provide better incentives to node operators that are long-term aligned")),(0,r.kt)("p",null,"The algorithm driving the above system will run autonomously in-protocol. However, we anticipate that certain parameters of the algorithm may be treated as parameters that can be adjusted/updated with a network governance proposal, as needed. We currently anticipate that the parameters that can be adjusted will be:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Maximum FLK inflation/reward rate"),(0,r.kt)("li",{parentName:"ul"},"Resource pricing (bandwidth, compute, etc.)"),(0,r.kt)("li",{parentName:"ul"},"Average cost of running a node"),(0,r.kt)("li",{parentName:"ul"},"Target node margin rate"),(0,r.kt)("li",{parentName:"ul"},"Stake amount (# of FLK) per node"),(0,r.kt)("li",{parentName:"ul"},"Discount rate"),(0,r.kt)("li",{parentName:"ul"},"Time-weighted average market price of FLK"),(0,r.kt)("li",{parentName:"ul"},"Maximum stake lock time"),(0,r.kt)("li",{parentName:"ul"},"Stake lock multiplier")),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"protocol-owned-liquidity"},"Protocol-Owned Liquidity"),(0,r.kt)("p",null,"In addition to the in-protocol algorithmic network economic system, the DAO/protocol will also manage 5% of the FLK token supply, which we anticipate will be set aside specifically to allow the community to take certain actions intended to provide long-term benefits to the network\u2019s ecosystem and to help maintain the intended balance in the network economy. It will behave based on predetermined conditions and rules that are publicly auditable. The high level function would be the following:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Set limit asks to sell tranches of FLK tokens at different price levels in the event of a market price increase that deviates from NPV"),(0,r.kt)("li",{parentName:"ul"},"Set limit buys to buy FLK tokens in the event of a price decrease where market price is lower than the current NPV")),(0,r.kt)("p",null,"Benefits:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Helps keep the economic system in equilibrium by using protocol-owned FLK inventory to absorb volatility"),(0,r.kt)("li",{parentName:"ul"},"Generates additional revenue for the protocol by capturing fees related to these activities"),(0,r.kt)("li",{parentName:"ul"},"Provides better liquidity for node operators who might want to liquidate a portion of their FLK rewards"),(0,r.kt)("li",{parentName:"ul"},"Smooths out volatility/price changes in periods of extreme market fear/greed")),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"flk-token-distribution"},"FLK Token Distribution"),(0,r.kt)("p",null,"The following is an initial rough draft of the potential FLK token distribution, subject to adjustments or revisions."),(0,r.kt)("h3",{id:"overall-distribution"},"Overall Distribution"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Overall"),(0,r.kt)("th",{parentName:"tr",align:null},"Percentage (%)"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Community"),(0,r.kt)("td",{parentName:"tr",align:null},"66%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Core Contributors (current and future)"),(0,r.kt)("td",{parentName:"tr",align:null},"17%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Backers/Node operators"),(0,r.kt)("td",{parentName:"tr",align:null},"17%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Total"),(0,r.kt)("td",{parentName:"tr",align:null},"100%")))),(0,r.kt)("h3",{id:"community-distribution"},"Community Distribution"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Community member"),(0,r.kt)("th",{parentName:"tr",align:null},"Percentage (%)"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Staking and rewards"),(0,r.kt)("td",{parentName:"tr",align:null},"20%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Ecosystem funds (Airdrop, grants, etc)"),(0,r.kt)("td",{parentName:"tr",align:null},"20%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"DAO"),(0,r.kt)("td",{parentName:"tr",align:null},"10%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Foundation"),(0,r.kt)("td",{parentName:"tr",align:null},"10%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Protocol Owned Liquidity"),(0,r.kt)("td",{parentName:"tr",align:null},"5%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Pre-Mainnet Community"),(0,r.kt)("td",{parentName:"tr",align:null},"1%")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Total"),(0,r.kt)("td",{parentName:"tr",align:null},"66%")))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b5954e33.3422a378.js b/assets/js/b5954e33.3422a378.js new file mode 100644 index 000000000..4ebdbf85b --- /dev/null +++ b/assets/js/b5954e33.3422a378.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2114],{852:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=n(5893),o=n(1151);const r={title:"Token and economics",slug:"token-and-economics",hide_title:!0,description:"Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.",tags:["tokenomics","token","economics","rewards","awards","incentives"],sidebarCollapsible:!1,sidebar_position:1},s=void 0,a={id:"learn/token-and-economics",title:"Token and economics",description:"Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.",source:"@site/docs/learn/token-and-economics.md",sourceDirName:"learn",slug:"/learn/token-and-economics",permalink:"/docs/learn/token-and-economics",draft:!1,unlisted:!1,tags:[{label:"tokenomics",permalink:"/docs/tags/tokenomics"},{label:"token",permalink:"/docs/tags/token"},{label:"economics",permalink:"/docs/tags/economics"},{label:"rewards",permalink:"/docs/tags/rewards"},{label:"awards",permalink:"/docs/tags/awards"},{label:"incentives",permalink:"/docs/tags/incentives"}],version:"current",sidebarPosition:1,frontMatter:{title:"Token and economics",slug:"token-and-economics",hide_title:!0,description:"Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.",tags:["tokenomics","token","economics","rewards","awards","incentives"],sidebarCollapsible:!1,sidebar_position:1},sidebar:"docs",previous:{title:"Delivery Acknowledgements",permalink:"/docs/learn/delivery-acknowledgements"},next:{title:"Services",permalink:"/docs/learn/services"}},l={},d=[{value:"Overview",id:"overview",level:2},{value:"The Utility Token",id:"the-utility-token",level:2},{value:"Stable token for payments",id:"stable-token-for-payments",level:2},{value:"Resource Pricing",id:"resource-pricing",level:2},{value:"The FLK Token:",id:"the-flk-token",level:2},{value:"Algorithmic Economic System",id:"algorithmic-economic-system",level:2},{value:"Protocol-Owned Liquidity",id:"protocol-owned-liquidity",level:2},{value:"FLK Token Distribution",id:"flk-token-distribution",level:2},{value:"Overall Distribution",id:"overall-distribution",level:3},{value:"Community Distribution",id:"community-distribution",level:3}];function c(e){const t={a:"a",h2:"h2",h3:"h3",hr:"hr",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(t.p,{children:["The Fleek Network runs on an incentivized economy model that rewards node operators who provide resources that form the network. Currently, the economic model is to be considered a first draft, subject to change based on the data and feedback collected throughout all phases of testnet. The purpose of sharing a first draft is to provide clarity to prospective node operators and developers interested in participating in any pre-mainnet activities. You can find the complete breakdown of this information in this ",(0,i.jsx)(t.a,{href:"https://blog.fleek.network/post/fleek-network-testnet-plans/",children:"article"})]}),"\n",(0,i.jsx)(t.h2,{id:"the-utility-token",children:"The Utility Token"}),"\n",(0,i.jsx)(t.p,{children:"Fleek Network has a utility token named FLK, an ERC-20 token issued on Ethereum (L1). The Fleek Network interacts with it as native to the protocol, given that the token intent is user accessibility and familiarity, making the interactions in the system as frictionless as possible. To accomplish this, the network has a Proof-of-Consensus bridge that facilitates entry and exit from Fleek Network\u2014a Zero Knowledge Proof (ZKP) bridge that enables token retrieval."}),"\n",(0,i.jsx)(t.h2,{id:"stable-token-for-payments",children:"Stable token for payments"}),"\n",(0,i.jsx)(t.p,{children:"The primary income for Account Holders is derived from a set of stable cryptocurrencies, which are easily tradable and highly liquid. For example, node operators receive rewards from stable coins (USD rate), ensuring a stable and predictable income stream. Note, that the network employs an inflationary mechanism, providing additional rewards for stakeholders via the minting of FLK tokens."}),"\n",(0,i.jsx)(t.h2,{id:"resource-pricing",children:"Resource Pricing"}),"\n",(0,i.jsx)(t.p,{children:"To start, Fleek Network only plans to charge for bandwidth and CPU cycles consumed. Pricing will be set at the network level, and resources will be priced and paid for in USD-denominated stablecoins. The exact pricing methodology will be determined and finalized throughout the testnet phases based on different factors. Those factors include:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Cost data the Foundation collects from node operators during testnet"}),"\n",(0,i.jsx)(t.li,{children:"The final specs of the SDK (which will determine what data the protocol can verifiably collect from nodes and reliably charge for)"}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"Please be aware, there will be no fees paid during any of the testnet phases, the above is solely for illustrative purposes"})," to give nodes a better understanding of the current thinking and what the process to finalize resource pricing might look like. We will work collaboratively with node operators throughout testnet to fairly determine resource pricing to ensure appropriate node incentivization while offering competitive pricing to developers."]}),"\n",(0,i.jsx)(t.p,{children:"It\u2019s also important to note that node operators are independent of the Foundation, the network, and each other. They are responsible for managing their own economics, including any taxes payable in any jurisdiction relevant to them due to their participation in the network."}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h2,{id:"the-flk-token",children:"The FLK Token:"}),"\n",(0,i.jsx)(t.p,{children:"FLK is a staking token that is an integral part of the Fleek Network. Nodes running the Fleek Network client software are required to obtain and stake FLK in order to participate in the network and to have the opportunity to earn fees for providing work. Below is some high-level information on the anticipated characteristics of the FLK token:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Stake amount per node is set/managed at the protocol level, and consistent across all nodes"}),"\n",(0,i.jsx)(t.li,{children:"Work is allocated based on location (latency) and reputation (performance)"}),"\n",(0,i.jsxs)(t.li,{children:["Resources on the network are priced and paid by users in USD denominated stablecoins","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Pricing of resources happens at the network level."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.li,{children:"Nodes only receive rewards related to work they perform, based on resources used/consumed (including FLK rewards)"}),"\n",(0,i.jsx)(t.li,{children:"FLK rewards are paid out per epoch (~24 hours). The FLK reward pool for each epoch is split proportionally between nodes who performed work during that epoch, calculated by the amount of USD revenue each node earned compared to the total revenue earned during that epoch."}),"\n",(0,i.jsx)(t.li,{children:"20% of the total FLK token supply is set aside for staking/rewards. The actual rate of rewards/inflation will be algorithmically controlled and updated based on network usage and other factors such as the market price of FLK."}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"DISCLAIMER"}),": All information in this post about the FLK token and other elements of the Fleek Network is being provided solely for informational purposes and does not constitute an offer to sell FLK tokens, or a request for such offers, in any jurisdiction. There are currently no plans to sell FLK tokens. If FLK tokens do become available, you should not rely on the information in this blog post in making purchasing decisions, as the blog post was not prepared for that purpose and there will be important additional information to consider. In addition, we will likely publish further blog posts with updated information about the platform launch."]}),"\n",(0,i.jsx)("u",{children:"ALTHOUGH THERE ARE NO PLANS TO SELL FLK TOKENS AT THIS TIME, FOR THE AVOIDANCE OF DOUBT, IF FLK TOKENS EVER WERE TO BE SOLD, THEY WOULD BE OFFERED FOR SALE ONLY OUTSIDE OF THE UNITED STATES TO NON\u2010U.S. PERSONS, PURSUANT TO THE PROVISIONS OF REGULATION S OF THE U.S. SECURITIES ACT OF 1933, AS AMENDED (THE \u201cSECURITIES ACT\u201d). THE OFFER AND SALE OF FLK TOKENS WILL NOT BE REGISTERED UNDER THE SECURITIES ACT, AND MAY NOT BE OFFERED OR SOLD IN THE UNITED STATES ABSENT REGISTRATION OR AN APPLICABLE EXEMPTION FROM THE REGISTRATION REQUIREMENTS."}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h2,{id:"algorithmic-economic-system",children:"Algorithmic Economic System"}),"\n",(0,i.jsxs)(t.p,{children:["The TLDR of the current implementation being discussed is that the network will handle the economic system/inflation algorithmically, using a concept we are calling ",(0,i.jsx)(t.strong,{children:"NME, which stands for [N]et present value (npv) [M]arket price [E]quillibrium."})]}),"\n",(0,i.jsx)(t.p,{children:"The algorithmic economic system has several goals, listed below in order of priority:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Provide an opportunity for receiving consistent blended earnings to node operators based on their work in most market conditions","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"\u201cBlended\u201d means taking into account both the USD stable coin fees that nodes are earning, and the FLK rewards they are earning (including factoring in the time-weighted average market price of FLK)."}),"\n",(0,i.jsx)(t.li,{children:"This means if network usage/revenue increases, FLK rewards will likely decrease, and vice versa. This also means that if the time-weighted average market price of FLK increases, nodes should reasonably expect that the amount of FLK rewards will decrease, but the value of FLK rewards received (in USD terms) will remain approximately the same."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["Don\u2019t overcompensate nodes, especially in times of market volatility","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"If the market price of FLK deviates from the NPV calculated in-protocol based on time-weighted average protocol-level revenue, nodes should reasonably expect that FLK rewards by number would be reduced."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.li,{children:"Keep the network economy in equilibrium in most market conditions"}),"\n",(0,i.jsx)(t.li,{children:"Provide better incentives to node operators that are long-term aligned"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"The algorithm driving the above system will run autonomously in-protocol. However, we anticipate that certain parameters of the algorithm may be treated as parameters that can be adjusted/updated with a network governance proposal, as needed. We currently anticipate that the parameters that can be adjusted will be:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Maximum FLK inflation/reward rate"}),"\n",(0,i.jsx)(t.li,{children:"Resource pricing (bandwidth, compute, etc.)"}),"\n",(0,i.jsx)(t.li,{children:"Average cost of running a node"}),"\n",(0,i.jsx)(t.li,{children:"Target node margin rate"}),"\n",(0,i.jsx)(t.li,{children:"Stake amount (# of FLK) per node"}),"\n",(0,i.jsx)(t.li,{children:"Discount rate"}),"\n",(0,i.jsx)(t.li,{children:"Time-weighted average market price of FLK"}),"\n",(0,i.jsx)(t.li,{children:"Maximum stake lock time"}),"\n",(0,i.jsx)(t.li,{children:"Stake lock multiplier"}),"\n"]}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h2,{id:"protocol-owned-liquidity",children:"Protocol-Owned Liquidity"}),"\n",(0,i.jsx)(t.p,{children:"In addition to the in-protocol algorithmic network economic system, the DAO/protocol will also manage 5% of the FLK token supply, which we anticipate will be set aside specifically to allow the community to take certain actions intended to provide long-term benefits to the network\u2019s ecosystem and to help maintain the intended balance in the network economy. It will behave based on predetermined conditions and rules that are publicly auditable. The high level function would be the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Set limit asks to sell tranches of FLK tokens at different price levels in the event of a market price increase that deviates from NPV"}),"\n",(0,i.jsx)(t.li,{children:"Set limit buys to buy FLK tokens in the event of a price decrease where market price is lower than the current NPV"}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Benefits:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Helps keep the economic system in equilibrium by using protocol-owned FLK inventory to absorb volatility"}),"\n",(0,i.jsx)(t.li,{children:"Generates additional revenue for the protocol by capturing fees related to these activities"}),"\n",(0,i.jsx)(t.li,{children:"Provides better liquidity for node operators who might want to liquidate a portion of their FLK rewards"}),"\n",(0,i.jsx)(t.li,{children:"Smooths out volatility/price changes in periods of extreme market fear/greed"}),"\n"]}),"\n",(0,i.jsx)(t.hr,{}),"\n",(0,i.jsx)(t.h2,{id:"flk-token-distribution",children:"FLK Token Distribution"}),"\n",(0,i.jsx)(t.p,{children:"The following is an initial rough draft of the potential FLK token distribution, subject to adjustments or revisions."}),"\n",(0,i.jsx)(t.h3,{id:"overall-distribution",children:"Overall Distribution"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Overall"}),(0,i.jsx)(t.th,{children:"Percentage (%)"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Community"}),(0,i.jsx)(t.td,{children:"66%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Core Contributors (current and future)"}),(0,i.jsx)(t.td,{children:"17%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Backers/Node operators"}),(0,i.jsx)(t.td,{children:"17%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Total"}),(0,i.jsx)(t.td,{children:"100%"})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"community-distribution",children:"Community Distribution"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Community member"}),(0,i.jsx)(t.th,{children:"Percentage (%)"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Staking and rewards"}),(0,i.jsx)(t.td,{children:"20%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Ecosystem funds (Airdrop, grants, etc)"}),(0,i.jsx)(t.td,{children:"20%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"DAO"}),(0,i.jsx)(t.td,{children:"10%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Foundation"}),(0,i.jsx)(t.td,{children:"10%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Protocol Owned Liquidity"}),(0,i.jsx)(t.td,{children:"5%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Pre-Mainnet Community"}),(0,i.jsx)(t.td,{children:"1%"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Total"}),(0,i.jsx)(t.td,{children:"66%"})]})]})]})]})}function h(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>s});var i=n(7294);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b696d13b.1c632dae.js b/assets/js/b696d13b.67d6433c.js similarity index 86% rename from assets/js/b696d13b.1c632dae.js rename to assets/js/b696d13b.67d6433c.js index b9661213f..0efc2f748 100644 --- a/assets/js/b696d13b.1c632dae.js +++ b/assets/js/b696d13b.67d6433c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[327],{5212:e=>{e.exports=JSON.parse('{"label":"verification","permalink":"/docs/tags/verification","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","permalink":"/docs/node/health-check"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[327],{5212:e=>{e.exports=JSON.parse('{"label":"verification","permalink":"/docs/tags/verification","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/health-check","title":"Health check","description":"TL;DR: Run the command","permalink":"/docs/node/health-check"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/b8466c91.eed55eb6.js b/assets/js/b8466c91.bdc01329.js similarity index 96% rename from assets/js/b8466c91.eed55eb6.js rename to assets/js/b8466c91.bdc01329.js index 4f30b7464..76230cde2 100644 --- a/assets/js/b8466c91.eed55eb6.js +++ b/assets/js/b8466c91.bdc01329.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4939],{942:e=>{e.exports=JSON.parse('{"label":"setup","permalink":"/guides/tags/setup","allTagsPath":"/guides/tags","count":2,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"},{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4939],{942:e=>{e.exports=JSON.parse('{"label":"setup","permalink":"/guides/tags/setup","allTagsPath":"/guides/tags","count":2,"items":[{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","permalink":"/guides/Node Operators/transfering-setup-ownership"},{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/b8c37621.03680a1b.js b/assets/js/b8c37621.3fb7580a.js similarity index 97% rename from assets/js/b8c37621.03680a1b.js rename to assets/js/b8c37621.3fb7580a.js index a597418a7..643e4c924 100644 --- a/assets/js/b8c37621.03680a1b.js +++ b/assets/js/b8c37621.3fb7580a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[920],{3908:e=>{e.exports=JSON.parse('{"label":"Guide","permalink":"/docs/tags/guide","allTagsPath":"/docs/tags","count":4,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[920],{3908:e=>{e.exports=JSON.parse('{"label":"Guide","permalink":"/docs/tags/guide","allTagsPath":"/docs/tags","count":4,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"node/install","title":"Install","description":"The Fleek Network Lightning CLI installation walkthrough","permalink":"/docs/node/install"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/b9b7817e.d1ea4071.js b/assets/js/b9b7817e.8ebc058f.js similarity index 95% rename from assets/js/b9b7817e.d1ea4071.js rename to assets/js/b9b7817e.8ebc058f.js index c69a7c988..f959ce824 100644 --- a/assets/js/b9b7817e.d1ea4071.js +++ b/assets/js/b9b7817e.8ebc058f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1476],{7913:e=>{e.exports=JSON.parse('{"label":"docker","permalink":"/references/tags/docker","allTagsPath":"/references/tags","count":3,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1476],{7913:e=>{e.exports=JSON.parse('{"label":"docker","permalink":"/references/tags/docker","allTagsPath":"/references/tags","count":3,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","permalink":"/references/Docker/frequently-used-commands-for-docker-setup"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/bd59af11.470c9730.js b/assets/js/bd59af11.82aec483.js similarity index 88% rename from assets/js/bd59af11.470c9730.js rename to assets/js/bd59af11.82aec483.js index 55bba53d4..1bb709782 100644 --- a/assets/js/bd59af11.470c9730.js +++ b/assets/js/bd59af11.82aec483.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9188],{7522:s=>{s.exports=JSON.parse('{"label":"Diagnostics","permalink":"/docs/tags/diagnostics","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/diagnostics","title":"Diagnostics","description":"TODO: Diagnostics","permalink":"/docs/node/diagnostics"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9188],{7522:s=>{s.exports=JSON.parse('{"label":"Diagnostics","permalink":"/docs/tags/diagnostics","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/diagnostics","title":"Diagnostics","description":"TODO: Diagnostics","permalink":"/docs/node/diagnostics"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/bea6e15b.5e98adf3.js b/assets/js/bea6e15b.422e763d.js similarity index 93% rename from assets/js/bea6e15b.5e98adf3.js rename to assets/js/bea6e15b.422e763d.js index 3b589eff1..fedab2d7d 100644 --- a/assets/js/bea6e15b.5e98adf3.js +++ b/assets/js/bea6e15b.422e763d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8754],{815:e=>{e.exports=JSON.parse('{"label":"fix","permalink":"/references/tags/fix","allTagsPath":"/references/tags","count":3,"items":[{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","permalink":"/references/Lightning CLI/error-building-on-arm64"},{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8754],{815:e=>{e.exports=JSON.parse('{"label":"fix","permalink":"/references/tags/fix","allTagsPath":"/references/tags","count":3,"items":[{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","permalink":"/references/Lightning CLI/error-building-on-arm64"},{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","permalink":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"},{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","permalink":"/references/Lightning CLI/update-cli-from-source-code"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/c222de09.301bcc1f.js b/assets/js/c222de09.301bcc1f.js new file mode 100644 index 000000000..6c9d03523 --- /dev/null +++ b/assets/js/c222de09.301bcc1f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7563],{4342:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>n,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=a(5893),o=a(1151);const i={draft:!1,title:"Whitepaper",date:new Date("2023-01-15T09:00:00.000Z"),description:"Fleek Network's whitepaper and codebase.",hide_title:!0,category:"Documentation",keywords:["whitepaper"],tags:["Edge Platform","CDN","Fleek Network","Whitepaper"]},n=void 0,s={id:"whitepaper",title:"Whitepaper",description:"Fleek Network's whitepaper and codebase.",source:"@site/docs/whitepaper.md",sourceDirName:".",slug:"/whitepaper",permalink:"/docs/whitepaper",draft:!1,unlisted:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"},{label:"Whitepaper",permalink:"/docs/tags/whitepaper"}],version:"current",frontMatter:{draft:!1,title:"Whitepaper",date:"2023-01-15T09:00:00.000Z",description:"Fleek Network's whitepaper and codebase.",hide_title:!0,category:"Documentation",keywords:["whitepaper"],tags:["Edge Platform","CDN","Fleek Network","Whitepaper"]},sidebar:"docs",previous:{title:"Repositories",permalink:"/docs/Open-source/repositories"}},p={},l=[{value:"Whitepaper",id:"whitepaper",level:2}];function c(e){const t={a:"a",h2:"h2",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"This section provides in-depth documentation and materials about the Fleek Network technology stack."}),"\n",(0,r.jsx)(t.h2,{id:"whitepaper",children:"Whitepaper"}),"\n",(0,r.jsx)(t.p,{children:"The whitepaper outlines the technology that makes the Fleek Network Edge Computing Platform possible. It illustrates the foundation that makes it possible to reimagine the user experience for Decentralized Web Services and how to develop a fairer economy and ecosystem in collaboration with humans."}),"\n",(0,r.jsx)(t.p,{children:"The latest whitepaper is available on this page, and it describes the protocol architecture, general operation, and characteristics."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"https://whitepaper.fleek.network/",children:"Read the Whitepaper"})}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,t,a)=>{a.d(t,{Z:()=>s,a:()=>n});var r=a(7294);const o={},i=r.createContext(o);function n(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:n(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c222de09.ec3d20c2.js b/assets/js/c222de09.ec3d20c2.js deleted file mode 100644 index f539d811d..000000000 --- a/assets/js/c222de09.ec3d20c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7563],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,a,n=function(e,t){if(null==e)return{};var r,a,n={},o=Object.keys(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a<o.length;a++)r=o[a],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),c=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),d=c(r),h=n,f=d["".concat(l,".").concat(h)]||d[h]||u[h]||o;return r?a.createElement(f,i(i({ref:t},s),{},{components:r})):a.createElement(f,i({ref:t},s))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=h;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[d]="string"==typeof e?e:n,i[1]=p;for(var c=2;c<o;c++)i[c]=r[c];return a.createElement.apply(null,i)}return a.createElement.apply(null,r)}h.displayName="MDXCreateElement"},5534:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>p,toc:()=>c});var a=r(7462),n=(r(7294),r(3905));const o={draft:!1,title:"Whitepaper",date:new Date("2023-01-15T09:00:00.000Z"),description:"Fleek Network's whitepaper and codebase.",hide_title:!0,category:"Documentation",keywords:["whitepaper"],tags:["Edge Platform","CDN","Fleek Network","Whitepaper"]},i=void 0,p={unversionedId:"whitepaper",id:"whitepaper",title:"Whitepaper",description:"Fleek Network's whitepaper and codebase.",source:"@site/docs/whitepaper.md",sourceDirName:".",slug:"/whitepaper",permalink:"/docs/whitepaper",draft:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"CDN",permalink:"/docs/tags/cdn"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"},{label:"Whitepaper",permalink:"/docs/tags/whitepaper"}],version:"current",frontMatter:{draft:!1,title:"Whitepaper",date:"2023-01-15T09:00:00.000Z",description:"Fleek Network's whitepaper and codebase.",hide_title:!0,category:"Documentation",keywords:["whitepaper"],tags:["Edge Platform","CDN","Fleek Network","Whitepaper"]},sidebar:"docs",previous:{title:"Repositories",permalink:"/docs/Open-source/repositories"}},l={},c=[{value:"Whitepaper",id:"whitepaper",level:2}],s={toc:c},d="wrapper";function u(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"This section provides in-depth documentation and materials about the Fleek Network technology stack."),(0,n.kt)("h2",{id:"whitepaper"},"Whitepaper"),(0,n.kt)("p",null,"The whitepaper outlines the technology that makes the Fleek Network Edge Computing Platform possible. It illustrates the foundation that makes it possible to reimagine the user experience for Decentralized Web Services and how to develop a fairer economy and ecosystem in collaboration with humans."),(0,n.kt)("p",null,"The latest whitepaper is available on this page, and it describes the protocol architecture, general operation, and characteristics."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://whitepaper.fleek.network/"},"Read the Whitepaper"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c377a04b.a63d0c15.js b/assets/js/c377a04b.a63d0c15.js deleted file mode 100644 index 62b8184fa..000000000 --- a/assets/js/c377a04b.a63d0c15.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6971],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var d=r.createContext({}),c=function(e){var t=r.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=c(e.components);return r.createElement(d.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,d=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=o,f=p["".concat(d,".").concat(m)]||p[m]||u[m]||a;return n?r.createElement(f,i(i({ref:t},l),{},{components:n})):r.createElement(f,i({ref:t},l))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var d in t)hasOwnProperty.call(t,d)&&(s[d]=t[d]);s.originalType=e,s[p]="string"==typeof e?e:o,i[1]=s;for(var c=2;c<a;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6453:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const a=n.p+"assets/images/banner-docs-c183370b6739d1066f08b02bef0af2c3.png",i={draft:!1,title:"About",sidebarCollapsible:!1,sidebar_position:1,hide_title:!0,date:new Date("2023-08-15T09:00:00.000Z"),description:"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.",category:"Documentation",keywords:["introduction","documentation","getting started"],tags:["Edge Platform","Guide","Learn","Fleek Network"]},s=void 0,d={unversionedId:"index",id:"index",title:"About",description:"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Learn",permalink:"/docs/tags/learn"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"}],version:"current",sidebarPosition:1,frontMatter:{draft:!1,title:"About",sidebarCollapsible:!1,sidebar_position:1,hide_title:!0,date:"2023-08-15T09:00:00.000Z",description:"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.",category:"Documentation",keywords:["introduction","documentation","getting started"],tags:["Edge Platform","Guide","Learn","Fleek Network"]},sidebar:"docs",next:{title:"Introduction",permalink:"/docs/learn/introduction"}},c={},l=[{value:"Roadmap",id:"roadmap",level:2},{value:"Need help?",id:"need-help",level:2},{value:"Found an issue?",id:"found-an-issue",level:2}],p={toc:l},u="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("img",{className:"banner",src:a}),(0,o.kt)("p",null,"Fleek Network is an open-source Edge Computing Platform to accelerate the development and execution of decentralized Web Services."),(0,o.kt)("p",null,"The system builds on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators who can operate nodes, build services that use the network\u2019s resources, or consume Fleek Network services on the Edge."),(0,o.kt)("p",null,"Applications, platforms and protocols build and utilize decentralized services on Fleek Network to optimize performance and reduce dependency on centralized cloud providers. Developers can build faster and launch better products by offloading parts of the stack to the Edge to focus on core features."),(0,o.kt)("admonition",{type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"To participate in the ",(0,o.kt)("a",{parentName:"p",href:"/docs/roadmap"},"alpha Testnet"),", you can begin by setting up and running nodes. Check the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/requirements"},"requirements")," and find the ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/testnet-onboarding"},"onboarding instructions")," to enable you to ",(0,o.kt)("a",{parentName:"p",href:"/docs/node/install"},"install")," a network node successfully.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The Fleek Network's documentation is organized as follows:"),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("a",{parentName:"p",href:"/docs"},"Documentation")," brief breakdown of the Fleek Network."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("a",{parentName:"p",href:"/blog"},"Engineering")," offers a deeper look into how our engineering team works, research, and technology behind Fleek Network."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("a",{parentName:"p",href:"/guides"},"Guides")," provide step-by-step instructions for performing specific tasks."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("a",{parentName:"p",href:"/references"},"References")," section provides short materials for Fleek Network command-line interfaces (CLIs), and application programming interfaces (APIs) for managing the resources and development. It is assumed that you already have a basic understanding of important concepts.")),(0,o.kt)("h2",{id:"roadmap"},"Roadmap"),(0,o.kt)("p",null,"We aim to bring computation to where demand is. You can find Fleek Network's public ",(0,o.kt)("a",{parentName:"p",href:"/docs/roadmap"},"roadmap")," here."),(0,o.kt)("h2",{id:"need-help"},"Need help?"),(0,o.kt)("p",null,"Be part of a community! Join the Fleek Network ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"discord")," if you want to ask a question, require help or exchange ideas."),(0,o.kt)("h2",{id:"found-an-issue"},"Found an issue?"),(0,o.kt)("p",null,"Issues can be reported in the correspondent repositories ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/fleek-network"},"here")," and any other reports by messaging us on ",(0,o.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"discord"),"."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c377a04b.b8a439ee.js b/assets/js/c377a04b.b8a439ee.js new file mode 100644 index 000000000..5505809f4 --- /dev/null +++ b/assets/js/c377a04b.b8a439ee.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6971],{4606:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var o=t(5893),i=t(1151);const r=t.p+"assets/images/banner-docs-c183370b6739d1066f08b02bef0af2c3.png",s={draft:!1,title:"About",sidebarCollapsible:!1,sidebar_position:1,hide_title:!0,date:new Date("2023-08-15T09:00:00.000Z"),description:"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.",category:"Documentation",keywords:["introduction","documentation","getting started"],tags:["Edge Platform","Guide","Learn","Fleek Network"]},a=void 0,d={id:"index",title:"About",description:"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.",source:"@site/docs/index.md",sourceDirName:".",slug:"/",permalink:"/docs/",draft:!1,unlisted:!1,tags:[{label:"Edge Platform",permalink:"/docs/tags/edge-platform"},{label:"Guide",permalink:"/docs/tags/guide"},{label:"Learn",permalink:"/docs/tags/learn"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"}],version:"current",sidebarPosition:1,frontMatter:{draft:!1,title:"About",sidebarCollapsible:!1,sidebar_position:1,hide_title:!0,date:"2023-08-15T09:00:00.000Z",description:"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.",category:"Documentation",keywords:["introduction","documentation","getting started"],tags:["Edge Platform","Guide","Learn","Fleek Network"]},sidebar:"docs",next:{title:"Introduction",permalink:"/docs/learn/introduction"}},c={},l=[{value:"Roadmap",id:"roadmap",level:2},{value:"Need help?",id:"need-help",level:2},{value:"Found an issue?",id:"found-an-issue",level:2}];function h(e){const n={a:"a",admonition:"admonition",h2:"h2",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("img",{className:"banner",src:r}),"\n",(0,o.jsx)(n.p,{children:"Fleek Network is an open-source Edge Computing Platform to accelerate the development and execution of decentralized Web Services."}),"\n",(0,o.jsx)(n.p,{children:"The system builds on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators who can operate nodes, build services that use the network\u2019s resources, or consume Fleek Network services on the Edge."}),"\n",(0,o.jsx)(n.p,{children:"Applications, platforms and protocols build and utilize decentralized services on Fleek Network to optimize performance and reduce dependency on centralized cloud providers. Developers can build faster and launch better products by offloading parts of the stack to the Edge to focus on core features."}),"\n",(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["To participate in the ",(0,o.jsx)(n.a,{href:"/docs/roadmap",children:"alpha Testnet"}),", you can begin by setting up and running nodes. Check the ",(0,o.jsx)(n.a,{href:"/docs/node/requirements",children:"requirements"})," and find the ",(0,o.jsx)(n.a,{href:"/docs/node/testnet-onboarding",children:"onboarding instructions"})," to enable you to ",(0,o.jsx)(n.a,{href:"/docs/node/install",children:"install"})," a network node successfully."]})}),"\n",(0,o.jsxs)(n.admonition,{type:"info",children:[(0,o.jsx)(n.p,{children:"The Fleek Network's documentation is organized as follows:"}),(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"/docs",children:"Documentation"})," brief breakdown of the Fleek Network."]}),(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"/blog",children:"Engineering"})," offers a deeper look into how our engineering team works, research, and technology behind Fleek Network."]}),(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"/guides",children:"Guides"})," provide step-by-step instructions for performing specific tasks."]}),(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"/references",children:"References"})," section provides short materials for Fleek Network command-line interfaces (CLIs), and application programming interfaces (APIs) for managing the resources and development. It is assumed that you already have a basic understanding of important concepts."]})]}),"\n",(0,o.jsx)(n.h2,{id:"roadmap",children:"Roadmap"}),"\n",(0,o.jsxs)(n.p,{children:["We aim to bring computation to where demand is. You can find Fleek Network's public ",(0,o.jsx)(n.a,{href:"/docs/roadmap",children:"roadmap"})," here."]}),"\n",(0,o.jsx)(n.h2,{id:"need-help",children:"Need help?"}),"\n",(0,o.jsxs)(n.p,{children:["Be part of a community! Join the Fleek Network ",(0,o.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"discord"})," if you want to ask a question, require help or exchange ideas."]}),"\n",(0,o.jsx)(n.h2,{id:"found-an-issue",children:"Found an issue?"}),"\n",(0,o.jsxs)(n.p,{children:["Issues can be reported in the correspondent repositories ",(0,o.jsx)(n.a,{href:"https://github.com/fleek-network",children:"here"})," and any other reports by messaging us on ",(0,o.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"discord"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>s});var o=t(7294);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c3f5dd14.c34d5bde.js b/assets/js/c3f5dd14.74ce3614.js similarity index 91% rename from assets/js/c3f5dd14.c34d5bde.js rename to assets/js/c3f5dd14.74ce3614.js index 1c1082790..f4bf1b13f 100644 --- a/assets/js/c3f5dd14.c34d5bde.js +++ b/assets/js/c3f5dd14.74ce3614.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1345],{9826:e=>{e.exports=JSON.parse('{"label":"Clean","permalink":"/references/tags/clean","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1345],{9826:e=>{e.exports=JSON.parse('{"label":"Clean","permalink":"/references/tags/clean","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/caaedc90.7e4aa2bd.js b/assets/js/caaedc90.0c254351.js similarity index 83% rename from assets/js/caaedc90.7e4aa2bd.js rename to assets/js/caaedc90.0c254351.js index 523745732..53fa6b89c 100644 --- a/assets/js/caaedc90.7e4aa2bd.js +++ b/assets/js/caaedc90.0c254351.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[572],{8988:e=>{e.exports=JSON.parse('{"label":"unit","permalink":"/references/tags/unit","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[572],{8988:e=>{e.exports=JSON.parse('{"label":"unit","permalink":"/references/tags/unit","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","permalink":"/references/Systemd/user-service"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/cc8e0b88.61c83c7a.js b/assets/js/cc8e0b88.32340495.js similarity index 81% rename from assets/js/cc8e0b88.61c83c7a.js rename to assets/js/cc8e0b88.32340495.js index 95000c562..ff2677f21 100644 --- a/assets/js/cc8e0b88.61c83c7a.js +++ b/assets/js/cc8e0b88.32340495.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6310],{2560:e=>{e.exports=JSON.parse('{"label":"pledge","permalink":"/docs/tags/pledge","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6310],{2560:e=>{e.exports=JSON.parse('{"label":"pledge","permalink":"/docs/tags/pledge","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.084c8d77.js b/assets/js/ccc49370.084c8d77.js deleted file mode 100644 index 49f784ccd..000000000 --- a/assets/js/ccc49370.084c8d77.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6103],{5203:(e,t,n)=>{n.r(t),n.d(t,{default:()=>h});var a=n(7294),l=n(6010),o=n(833),r=n(5281),i=n(9460),c=n(9058),s=n(390),m=n(7462),d=n(5999),u=n(2244);function g(e){const{nextItem:t,prevItem:n}=e;return a.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,d.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},n&&a.createElement(u.Z,(0,m.Z)({},n,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")})),t&&a.createElement(u.Z,(0,m.Z)({},t,{subLabel:a.createElement(d.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post"),isNext:!0})))}function f(){const{assets:e,metadata:t}=(0,i.C)(),{title:n,description:l,date:r,tags:c,authors:s,frontMatter:m}=t,{keywords:d}=m,u=e.image??m.image;return a.createElement(o.d,{title:n,description:l,keywords:d,image:u},a.createElement("meta",{property:"og:type",content:"article"}),a.createElement("meta",{property:"article:published_time",content:r}),s.some((e=>e.url))&&a.createElement("meta",{property:"article:author",content:s.map((e=>e.url)).filter(Boolean).join(",")}),c.length>0&&a.createElement("meta",{property:"article:tag",content:c.map((e=>e.label)).join(",")}))}var v=n(9407);function p(e){let{sidebar:t,children:n}=e;const{metadata:l,toc:o}=(0,i.C)(),{nextItem:r,prevItem:m,frontMatter:d}=l,{hide_table_of_contents:u,toc_min_heading_level:f,toc_max_heading_level:p}=d;return a.createElement(c.Z,{sidebar:t,toc:!u&&o.length>0?a.createElement(v.Z,{toc:o,minHeadingLevel:f,maxHeadingLevel:p}):void 0},a.createElement(s.Z,null,n),(r||m)&&a.createElement(g,{nextItem:r,prevItem:m}))}function h(e){const t=e.content;return a.createElement(i.n,{content:e.content,isBlogPostPage:!0},a.createElement(o.FG,{className:(0,l.Z)(r.k.wrapper.blogPages,r.k.page.blogPostPage)},a.createElement(f,null),a.createElement(p,{sidebar:e.sidebar},a.createElement(t,null))))}},9407:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(7462),l=n(7294),o=n(6010),r=n(3743);const i={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"},c="table-of-contents__link toc-highlight",s="table-of-contents__link--active";function m(e){let{className:t,...n}=e;return l.createElement("div",{className:(0,o.Z)(i.tableOfContents,"thin-scrollbar",t)},l.createElement(r.Z,(0,a.Z)({},n,{linkClassName:c,linkActiveClassName:s})))}},3743:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(7462),l=n(7294),o=n(6668);function r(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const a=n.slice(2,e.level);e.parentIndex=Math.max(...a),n[e.level]=t}));const a=[];return t.forEach((e=>{const{parentIndex:n,...l}=e;n>=0?t[n].children.push(l):a.push(l)})),a}function i(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return t.flatMap((e=>{const t=i({toc:e.children,minHeadingLevel:n,maxHeadingLevel:a});return function(e){return e.level>=n&&e.level<=a}(e)?[{...e,children:t}]:t}))}function c(e){const t=e.getBoundingClientRect();return t.top===t.bottom?c(e.parentNode):t}function s(e,t){let{anchorTopOffset:n}=t;const a=e.find((e=>c(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(c(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function m(){const e=(0,l.useRef)(0),{navbar:{hideOnScroll:t}}=(0,o.L)();return(0,l.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,l.useRef)(void 0),n=m();(0,l.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:l,minHeadingLevel:o,maxHeadingLevel:r}=e;function i(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),i=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const a=[];for(let l=t;l<=n;l+=1)a.push(`h${l}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:o,maxHeadingLevel:r}),c=s(i,{anchorTopOffset:n.current}),m=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(l),e.classList.add(l),t.current=e):e.classList.remove(l)}(e,e===m)}))}return document.addEventListener("scroll",i),document.addEventListener("resize",i),i(),()=>{document.removeEventListener("scroll",i),document.removeEventListener("resize",i)}}),[e,n])}function u(e){let{toc:t,className:n,linkClassName:a,isChild:o}=e;return t.length?l.createElement("ul",{className:o?void 0:n},t.map((e=>l.createElement("li",{key:e.id},l.createElement("a",{href:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),l.createElement(u,{isChild:!0,toc:e.children,className:n,linkClassName:a}))))):null}const g=l.memo(u);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:c="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:m,maxHeadingLevel:u,...f}=e;const v=(0,o.L)(),p=m??v.tableOfContents.minHeadingLevel,h=u??v.tableOfContents.maxHeadingLevel,b=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,l.useMemo)((()=>i({toc:r(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:h});return d((0,l.useMemo)((()=>{if(c&&s)return{linkClassName:c,linkActiveClassName:s,minHeadingLevel:p,maxHeadingLevel:h}}),[c,s,p,h])),l.createElement(g,(0,a.Z)({toc:b,className:n,linkClassName:c},f))}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.152e84b2.js b/assets/js/ccc49370.152e84b2.js new file mode 100644 index 000000000..0e2e9439a --- /dev/null +++ b/assets/js/ccc49370.152e84b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6103],{5203:(e,n,t)=>{t.r(n),t.d(n,{default:()=>p});t(7294);var a=t(4334),i=t(833),s=t(5281),o=t(9460),l=t(1460),r=t(390),c=t(5999),d=t(2244),u=t(5893);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.Z,{...t,subLabel:(0,u.jsx)(c.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),n&&(0,u.jsx)(d.Z,{...n,subLabel:(0,u.jsx)(c.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function g(){const{assets:e,metadata:n}=(0,o.C)(),{title:t,description:a,date:s,tags:l,authors:r,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(i.d,{title:t,description:a,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),r.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:r.map((e=>e.url)).filter(Boolean).join(",")}),l.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:l.map((e=>e.label)).join(",")})]})}var h=t(9407),f=t(2212);function v(e){let{sidebar:n,children:t}=e;const{metadata:a,toc:i}=(0,o.C)(),{nextItem:s,prevItem:c,frontMatter:d,unlisted:g}=a,{hide_table_of_contents:v,toc_min_heading_level:p,toc_max_heading_level:x}=d;return(0,u.jsxs)(l.Z,{sidebar:n,toc:!v&&i.length>0?(0,u.jsx)(h.Z,{toc:i,minHeadingLevel:p,maxHeadingLevel:x}):void 0,children:[g&&(0,u.jsx)(f.Z,{}),(0,u.jsx)(r.Z,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function p(e){const n=e.content;return(0,u.jsx)(o.n,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(i.FG,{className:(0,a.Z)(s.k.wrapper.blogPages,s.k.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(v,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},9407:(e,n,t)=>{t.d(n,{Z:()=>c});t(7294);var a=t(4334),i=t(3743);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var o=t(5893);const l="table-of-contents__link toc-highlight",r="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,o.jsx)("div",{className:(0,a.Z)(s.tableOfContents,"thin-scrollbar",n),children:(0,o.jsx)(i.Z,{...t,linkClassName:l,linkActiveClassName:r})})}},3743:(e,n,t)=>{t.d(n,{Z:()=>f});var a=t(7294),i=t(6668);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const a=t.slice(2,e.level);e.parentIndex=Math.max(...a),t[e.level]=n}));const a=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):a.push(i)})),a}function o(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=o({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function l(e){const n=e.getBoundingClientRect();return n.top===n.bottom?l(e.parentNode):n}function r(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>l(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(l(a))?a:e[e.indexOf(a)-1]??null}return e[e.length-1]??null}function c(){const e=(0,a.useRef)(0),{navbar:{hideOnScroll:n}}=(0,i.L)();return(0,a.useEffect)((()=>{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,a.useRef)(void 0),t=c();(0,a.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:a,linkActiveClassName:i,minHeadingLevel:s,maxHeadingLevel:o}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(a),l=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const a=[];for(let i=n;i<=t;i+=1)a.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(a.join()))}({minHeadingLevel:s,maxHeadingLevel:o}),c=r(l,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===d)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,t])}var u=t(9960),m=t(5893);function g(e){let{toc:n,className:t,linkClassName:a,isChild:i}=e;return n.length?(0,m.jsx)("ul",{className:i?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.Z,{to:`#${e.id}`,className:a??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:t,linkClassName:a})]},e.id)))}):null}const h=a.memo(g);function f(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:l="table-of-contents__link",linkActiveClassName:r,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const f=(0,i.L)(),v=c??f.tableOfContents.minHeadingLevel,p=u??f.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return(0,a.useMemo)((()=>o({toc:s(n),minHeadingLevel:t,maxHeadingLevel:i})),[n,t,i])}({toc:n,minHeadingLevel:v,maxHeadingLevel:p});return d((0,a.useMemo)((()=>{if(l&&r)return{linkClassName:l,linkActiveClassName:r,minHeadingLevel:v,maxHeadingLevel:p}}),[l,r,v,p])),(0,m.jsx)(h,{toc:x,className:t,linkClassName:l,...g})}},2212:(e,n,t)=>{t.d(n,{Z:()=>g});t(7294);var a=t(4334),i=t(5999),s=t(5742),o=t(5893);function l(){return(0,o.jsx)(i.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,o.jsx)(i.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,o.jsx)(s.Z,{children:(0,o.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(5281),u=t(9047);function m(e){let{className:n}=e;return(0,o.jsx)(u.Z,{type:"caution",title:(0,o.jsx)(l,{}),className:(0,a.Z)(n,d.k.common.unlistedBanner),children:(0,o.jsx)(r,{})})}function g(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(c,{}),(0,o.jsx)(m,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/ce321ae3.bd881c9e.js b/assets/js/ce321ae3.8a69b8f3.js similarity index 86% rename from assets/js/ce321ae3.bd881c9e.js rename to assets/js/ce321ae3.8a69b8f3.js index 245997ffb..c23be9599 100644 --- a/assets/js/ce321ae3.bd881c9e.js +++ b/assets/js/ce321ae3.8a69b8f3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1837],{2141:o=>{o.exports=JSON.parse('{"label":"Configuration","permalink":"/docs/tags/configuration","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/configuration","title":"Configuration","description":"TODO: Configuration","permalink":"/docs/node/configuration"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1837],{2141:o=>{o.exports=JSON.parse('{"label":"Configuration","permalink":"/docs/tags/configuration","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/configuration","title":"Configuration","description":"TODO: Configuration","permalink":"/docs/node/configuration"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ce4635d7.d356d916.js b/assets/js/ce4635d7.2f6e9cd8.js similarity index 92% rename from assets/js/ce4635d7.d356d916.js rename to assets/js/ce4635d7.2f6e9cd8.js index 621ac7a34..456b07c1a 100644 --- a/assets/js/ce4635d7.d356d916.js +++ b/assets/js/ce4635d7.2f6e9cd8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9395],{6062:e=>{e.exports=JSON.parse('{"label":"lost keys","permalink":"/references/tags/lost-keys","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9395],{6062:e=>{e.exports=JSON.parse('{"label":"lost keys","permalink":"/references/tags/lost-keys","allTagsPath":"/references/tags","count":2,"items":[{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","permalink":"/references/Lightning CLI/keys-not-found"},{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","permalink":"/references/Lightning CLI/node-secret-key-does-not-exist"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ceabd901.affbfa3f.js b/assets/js/ceabd901.23077e58.js similarity index 83% rename from assets/js/ceabd901.affbfa3f.js rename to assets/js/ceabd901.23077e58.js index 26c82b565..1544696b4 100644 --- a/assets/js/ceabd901.affbfa3f.js +++ b/assets/js/ceabd901.23077e58.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1354],{5e3:e=>{e.exports=JSON.parse('{"label":"update","permalink":"/guides/tags/update","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1354],{5e3:e=>{e.exports=JSON.parse('{"label":"update","permalink":"/guides/tags/update","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","permalink":"/guides/Node Operators/updating-lightning"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/d16f6fc6.a492f280.js b/assets/js/d16f6fc6.dcce69ae.js similarity index 91% rename from assets/js/d16f6fc6.a492f280.js rename to assets/js/d16f6fc6.dcce69ae.js index 8b014713f..2fd2a3fdb 100644 --- a/assets/js/d16f6fc6.a492f280.js +++ b/assets/js/d16f6fc6.dcce69ae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5530],{8316:e=>{e.exports=JSON.parse('{"label":"Clear","permalink":"/references/tags/clear","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5530],{8316:e=>{e.exports=JSON.parse('{"label":"Clear","permalink":"/references/tags/clear","allTagsPath":"/references/tags","count":1,"items":[{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","permalink":"/references/Lightning CLI/uninstall-lightning-node"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/d1b78a4d.8e6e2837.js b/assets/js/d1b78a4d.8e6e2837.js deleted file mode 100644 index a98861c0d..000000000 --- a/assets/js/d1b78a4d.8e6e2837.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3023],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>f});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),s=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},m=function(e){var t=s(e.components);return o.createElement(c.Provider,{value:t},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=s(r),p=n,f=u["".concat(c,".").concat(p)]||u[p]||g[p]||i;return r?o.createElement(f,a(a({ref:t},m),{},{components:r})):o.createElement(f,a({ref:t},m))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=p;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:n,a[1]=l;for(var s=2;s<i;s++)a[s]=r[s];return o.createElement.apply(null,a)}return o.createElement.apply(null,r)}p.displayName="MDXCreateElement"},1850:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>g,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var o=r(7462),n=(r(7294),r(3905));const i={title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]},a=void 0,l={permalink:"/blog/bloom-and-cuckoo-filters-for-cache-summarization",source:"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md",title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",date:"2023-10-31T18:15:43.000Z",formattedDate:"October 31, 2023",tags:[{label:"fleek network",permalink:"/blog/tags/fleek-network"},{label:"blog",permalink:"/blog/tags/blog"},{label:"engineering",permalink:"/blog/tags/engineering"},{label:"content routing",permalink:"/blog/tags/content-routing"}],readingTime:10.37,hasTruncateMarker:!0,authors:[{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"}],frontMatter:{title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]}},c={image:r(4221).Z,authorsImageUrls:[void 0]},s=[],m={toc:s},u="wrapper";function g(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,o.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case."))}g.isMDXComponent=!0},4221:(e,t,r)=>{r.d(t,{Z:()=>o});const o=r.p+"assets/images/bloom-79da0db687b4fb2060758838b9c44513.png"}}]); \ No newline at end of file diff --git a/assets/js/d1b78a4d.c349bda3.js b/assets/js/d1b78a4d.c349bda3.js new file mode 100644 index 000000000..57f73c5db --- /dev/null +++ b/assets/js/d1b78a4d.c349bda3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3023],{756:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>m});var i=o(5893),n=o(1151);const r={title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]},a=void 0,s={permalink:"/blog/bloom-and-cuckoo-filters-for-cache-summarization",source:"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md",title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",date:"2023-11-01T18:03:13.000Z",formattedDate:"November 1, 2023",tags:[{label:"fleek network",permalink:"/blog/tags/fleek-network"},{label:"blog",permalink:"/blog/tags/blog"},{label:"engineering",permalink:"/blog/tags/engineering"},{label:"content routing",permalink:"/blog/tags/content-routing"}],readingTime:10.37,hasTruncateMarker:!0,authors:[{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"}],frontMatter:{title:"Bloom Filters and Cuckoo Filters for Cache Summarization",description:"Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.",slug:"bloom-and-cuckoo-filters-for-cache-summarization",image:"./assets/bloom-cuckoo/bloom.png?202301181528",authors:{name:"Matthias Wright",title:"Software Engineer",url:"https://github.com/matthias-wright",image_url:"https://github.com/matthias-wright.png",imageURL:"https://github.com/matthias-wright.png"},tags:["fleek network","blog","engineering","content routing"]},unlisted:!1},l={image:o(9969).Z,authorsImageUrls:[void 0]},m=[];function c(t){const e={p:"p",...(0,n.a)(),...t.components};return(0,i.jsx)(e.p,{children:"Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case."})}function u(t={}){const{wrapper:e}={...(0,n.a)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(c,{...t})}):c(t)}},9969:(t,e,o)=>{o.d(e,{Z:()=>i});const i=o.p+"assets/images/bloom-79da0db687b4fb2060758838b9c44513.png"},1151:(t,e,o)=>{o.d(e,{Z:()=>s,a:()=>a});var i=o(7294);const n={},r=i.createContext(n);function a(t){const e=i.useContext(r);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:a(t.components),i.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/d1d29319.ebda8846.js b/assets/js/d1d29319.bcaebf14.js similarity index 86% rename from assets/js/d1d29319.ebda8846.js rename to assets/js/d1d29319.bcaebf14.js index a74c58835..4cb988c00 100644 --- a/assets/js/d1d29319.ebda8846.js +++ b/assets/js/d1d29319.bcaebf14.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2027],{9887:e=>{e.exports=JSON.parse('{"label":"service error","permalink":"/references/tags/service-error","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2027],{9887:e=>{e.exports=JSON.parse('{"label":"service error","permalink":"/references/tags/service-error","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/d23df0ea.1d84ae69.js b/assets/js/d23df0ea.1d84ae69.js new file mode 100644 index 000000000..05dbae6b1 --- /dev/null +++ b/assets/js/d23df0ea.1d84ae69.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5548],{3183:(e,n,r)=>{r.d(n,{ZP:()=>l});var t=r(5893),i=r(1151);function o(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(n.admonition,{type:"tip",children:[(0,t.jsx)(n.p,{children:"You have several ways of doing this:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Clone via HTTPS"}),"\n",(0,t.jsx)(n.li,{children:"Clone via SSH"}),"\n",(0,t.jsx)(n.li,{children:"Download via Github CLI"}),"\n",(0,t.jsxs)(n.li,{children:["Download the ",(0,t.jsx)(n.a,{href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip",children:"zip package"})," from the repository"]}),"\n"]}),(0,t.jsxs)(n.p,{children:["We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,t.jsx)(n.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh",children:"here"}),"."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>\n"})}),(0,t.jsxs)(n.p,{children:["At time of writing, we are checking the branch name ",(0,t.jsx)(n.code,{children:"testnet-alpha-1"})," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"})})]})}function l(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(o,{...e})}):o(e)}},5081:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>g,frontMatter:()=>s,metadata:()=>a,toc:()=>h});var t=r(5893),i=r(1151),o=r(3872),l=r(3183);const s={title:"Build and run in Docker",slug:"build-and-run-in-docker",hide_title:!0,tags:["references","help","docker","build","image","container"]},c=void 0,a={id:"Docker/build-and-run-in-docker",title:"Build and run in Docker",description:"Clone the source code locally",source:"@site/references/Docker/build-and-run-in-docker.md",sourceDirName:"Docker",slug:"/Docker/build-and-run-in-docker",permalink:"/references/Docker/build-and-run-in-docker",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Docker/build-and-run-in-docker.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"docker",permalink:"/references/tags/docker"},{label:"build",permalink:"/references/tags/build"},{label:"image",permalink:"/references/tags/image"},{label:"container",permalink:"/references/tags/container"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Build and run in Docker",slug:"build-and-run-in-docker",hide_title:!0,tags:["references","help","docker","build","image","container"]},sidebar:"defaultSidebar",previous:{title:"About references",permalink:"/references/"},next:{title:"Frequently used commands for Docker setup",permalink:"/references/Docker/frequently-used-commands-for-docker-setup"}},d={},h=[{value:"Clone the source code locally",id:"clone-the-source-code-locally",level:2},{value:"Change directory to Lightning source code",id:"change-directory-to-lightning-source-code",level:2},{value:"Install Docker",id:"install-docker",level:2},{value:"Docker setup verification",id:"docker-setup-verification",level:2},{value:"Check the Dockerfile",id:"check-the-dockerfile",level:2},{value:"Build the Docker image",id:"build-the-docker-image",level:2},{value:"Generate keys",id:"generate-keys",level:2},{value:"Docker Container",id:"docker-container",level:2},{value:"View logs",id:"view-logs",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"clone-the-source-code-locally",children:"Clone the source code locally"}),"\n",(0,t.jsx)(l.ZP,{}),"\n",(0,t.jsx)(n.h2,{id:"change-directory-to-lightning-source-code",children:"Change directory to Lightning source code"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"cd ~/fleek-network/lightning\n"})}),"\n",(0,t.jsx)(n.h2,{id:"install-docker",children:"Install Docker"}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["We're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems ",(0,t.jsx)(n.a,{href:"/docs/node/requirements#server",children:"here"}),"."]})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo apt update\n"})}),"\n",(0,t.jsx)(n.p,{children:"Next, install the required packages to let apt use packages over HTTPS:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo apt install \\\n apt-transport-https \\\n ca-certificates \\\n software-properties-common\n"})}),"\n",(0,t.jsx)(n.p,{children:"Add the GPG key for the official Docker repository to your system:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\n"})}),"\n",(0,t.jsx)(n.p,{children:"Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:'sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Set to install from the Docker repo instead of the default Ubuntu repo:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"apt-cache policy docker-ce\n"})}),"\n",(0,t.jsx)(n.p,{children:"Finally, install Docker:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo apt install docker-ce\n"})}),"\n",(0,t.jsx)(n.p,{children:"Once complete you should be able to run it via the CLI, as such:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"docker -v\n"})}),"\n",(0,t.jsx)(n.p,{children:"Here's the output (versions might differ a bit from the time of writing):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"Docker version 24.0.6, build ed223bc\n"})}),"\n",(0,t.jsx)(n.h2,{id:"docker-setup-verification",children:"Docker setup verification"}),"\n",(0,t.jsx)(n.p,{children:"The following command's output will indicate if Docker's working correctly:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker run hello-world\n"})}),"\n",(0,t.jsx)(n.p,{children:'You should get a "Hello from Docker!".'}),"\n",(0,t.jsx)(n.h2,{id:"check-the-dockerfile",children:"Check the Dockerfile"}),"\n",(0,t.jsxs)(n.p,{children:["You should have ",(0,t.jsx)(n.a,{href:"#change-directory-to-lightning-source-code",children:"changed directory"})," to the projecto directory."]}),"\n",(0,t.jsxs)(n.p,{children:["If you run a ",(0,t.jsx)(n.code,{children:"cat Dockerfile"}),", you should have content similar to:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"FROM rust:latest as builder\nARG PROFILE=release\nWORKDIR /lightning\n\nRUN apt-get update\nRUN apt-get install -y \\\n build-essential \\\n cmake \\\n clang \\\n pkg-config \\\n libssl-dev \\\n gcc \\\n protobuf-compiler\n\n...\n"})}),"\n",(0,t.jsx)(n.h2,{id:"build-the-docker-image",children:"Build the Docker image"}),"\n",(0,t.jsxs)(n.p,{children:["Build the image named as ",(0,t.jsx)(n.code,{children:"lightning"})," from our Dockerfile:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker build -t lightning -f ./Dockerfile .\n"})}),"\n",(0,t.jsx)(n.h2,{id:"generate-keys",children:"Generate keys"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker exec -it lightning-node lgtn keys generate\n"})}),"\n",(0,t.jsx)(n.h2,{id:"docker-container",children:"Docker Container"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it lightning\n"})}),"\n",(0,t.jsx)(n.h2,{id:"view-logs",children:"View logs"}),"\n",(0,t.jsx)(n.p,{children:"To view the logs of a Docker container in real time, use the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"sudo docker logs -f lightning-node\n"})}),"\n",(0,t.jsx)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function g(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},3872:(e,n,r)=>{r.d(n,{Z:()=>i});r(7294);var t=r(5893);const i=e=>{let{image:n,name:r,title:i,url:o,communityMember:l=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:o,target:"_blank",alt:r,children:(0,t.jsx)("img",{src:n,alt:r})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:o,target:"_blank",alt:r,children:r})}),(0,t.jsx)("span",{className:"title",children:i}),(0,t.jsxs)("span",{className:"discord",children:[l?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,r)=>{r.d(n,{Z:()=>s,a:()=>l});var t=r(7294);const i={},o=t.createContext(i);function l(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d23df0ea.892d5604.js b/assets/js/d23df0ea.892d5604.js deleted file mode 100644 index 262d2ab4b..000000000 --- a/assets/js/d23df0ea.892d5604.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5548],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=s(n),m=a,k=u["".concat(c,".").concat(m)]||u[m]||p[m]||o;return n?r.createElement(k,l(l({ref:t},d),{},{components:n})):r.createElement(k,l({ref:t},d))}));function k(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:a,l[1]=i;for(var s=2;s<o;s++)l[s]=n[s];return r.createElement.apply(null,l)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},2915:(e,t,n)=>{n.d(t,{ZP:()=>i});var r=n(7462),a=(n(7294),n(3905));const o={toc:[]},l="wrapper";function i(e){let{components:t,...n}=e;return(0,a.kt)(l,(0,r.Z)({},o,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"You have several ways of doing this:"),(0,a.kt)("ul",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ul"},"Clone via HTTPS"),(0,a.kt)("li",{parentName:"ul"},"Clone via SSH"),(0,a.kt)("li",{parentName:"ul"},"Download via Github CLI"),(0,a.kt)("li",{parentName:"ul"},"Download the ",(0,a.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/archive/refs/heads/main.zip"},"zip package")," from the repository")),(0,a.kt)("p",{parentName:"admonition"},"We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this.\nAlthough, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it ",(0,a.kt)("a",{parentName:"p",href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh"},"here"),"."),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>\n")),(0,a.kt)("p",{parentName:"admonition"},"At time of writing, we are checking the branch name ",(0,a.kt)("inlineCode",{parentName:"p"},"testnet-alpha-1")," that corresponds to the testnet phase.\nHere's an example of what it'd look like when sticking to the recommended path location:"),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning\n"))))}i.isMDXComponent=!0},2321:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>k,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var r=n(7462),a=(n(7294),n(3905)),o=n(3872),l=n(2915);const i={title:"Build and run in Docker",slug:"build-and-run-in-docker",hide_title:!0,tags:["references","help","docker","build","image","container"]},c=void 0,s={unversionedId:"Docker/build-and-run-in-docker",id:"Docker/build-and-run-in-docker",title:"Build and run in Docker",description:"Clone the source code locally",source:"@site/references/Docker/build-and-run-in-docker.md",sourceDirName:"Docker",slug:"/Docker/build-and-run-in-docker",permalink:"/references/Docker/build-and-run-in-docker",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Docker/build-and-run-in-docker.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"docker",permalink:"/references/tags/docker"},{label:"build",permalink:"/references/tags/build"},{label:"image",permalink:"/references/tags/image"},{label:"container",permalink:"/references/tags/container"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Build and run in Docker",slug:"build-and-run-in-docker",hide_title:!0,tags:["references","help","docker","build","image","container"]},sidebar:"defaultSidebar",previous:{title:"About references",permalink:"/references/"},next:{title:"Frequently used commands for Docker setup",permalink:"/references/Docker/frequently-used-commands-for-docker-setup"}},d={},u=[{value:"Clone the source code locally",id:"clone-the-source-code-locally",level:2},{value:"Change directory to Lightning source code",id:"change-directory-to-lightning-source-code",level:2},{value:"Install Docker",id:"install-docker",level:2},{value:"Docker setup verification",id:"docker-setup-verification",level:2},{value:"Check the Dockerfile",id:"check-the-dockerfile",level:2},{value:"Build the Docker image",id:"build-the-docker-image",level:2},{value:"Generate keys",id:"generate-keys",level:2},{value:"Docker Container",id:"docker-container",level:2},{value:"View logs",id:"view-logs",level:2}],p={toc:u},m="wrapper";function k(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"clone-the-source-code-locally"},"Clone the source code locally"),(0,a.kt)(l.ZP,{mdxType:"GitCloneOptions"}),(0,a.kt)("h2",{id:"change-directory-to-lightning-source-code"},"Change directory to Lightning source code"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"cd ~/fleek-network/lightning\n")),(0,a.kt)("h2",{id:"install-docker"},"Install Docker"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"We're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems ",(0,a.kt)("a",{parentName:"p",href:"/docs/node/requirements#server"},"here"),".")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt update\n")),(0,a.kt)("p",null,"Next, install the required packages to let apt use packages over HTTPS:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install \\\n apt-transport-https \\\n ca-certificates \\\n software-properties-common\n")),(0,a.kt)("p",null,"Add the GPG key for the official Docker repository to your system:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -\n")),(0,a.kt)("p",null,"Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"\n')),(0,a.kt)("p",null,"Set to install from the Docker repo instead of the default Ubuntu repo:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"apt-cache policy docker-ce\n")),(0,a.kt)("p",null,"Finally, install Docker:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install docker-ce\n")),(0,a.kt)("p",null,"Once complete you should be able to run it via the CLI, as such:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"docker -v\n")),(0,a.kt)("p",null,"Here's the output (versions might differ a bit from the time of writing):"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"Docker version 24.0.6, build ed223bc\n")),(0,a.kt)("h2",{id:"docker-setup-verification"},"Docker setup verification"),(0,a.kt)("p",null,"The following command's output will indicate if Docker's working correctly:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker run hello-world\n")),(0,a.kt)("p",null,'You should get a "Hello from Docker!".'),(0,a.kt)("h2",{id:"check-the-dockerfile"},"Check the Dockerfile"),(0,a.kt)("p",null,"You should have ",(0,a.kt)("a",{parentName:"p",href:"#change-directory-to-lightning-source-code"},"changed directory")," to the projecto directory."),(0,a.kt)("p",null,"If you run a ",(0,a.kt)("inlineCode",{parentName:"p"},"cat Dockerfile"),", you should have content similar to:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"FROM rust:latest as builder\nARG PROFILE=release\nWORKDIR /lightning\n\nRUN apt-get update\nRUN apt-get install -y \\\n build-essential \\\n cmake \\\n clang \\\n pkg-config \\\n libssl-dev \\\n gcc \\\n protobuf-compiler\n\n...\n")),(0,a.kt)("h2",{id:"build-the-docker-image"},"Build the Docker image"),(0,a.kt)("p",null,"Build the image named as ",(0,a.kt)("inlineCode",{parentName:"p"},"lightning")," from our Dockerfile:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker build -t lightning -f ./Dockerfile .\n")),(0,a.kt)("h2",{id:"generate-keys"},"Generate keys"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker exec -it lightning-node lgtn keys generate\n")),(0,a.kt)("h2",{id:"docker-container"},"Docker Container"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker run \\\n -p 4200-4299:4200-4299 \\\n -p 4300-4399:4300-4399 \\\n --mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \\\n --mount type=bind,source=/var/tmp,target=/var/tmp \\\n --name lightning-node \\\n -it lightning\n")),(0,a.kt)("h2",{id:"view-logs"},"View logs"),(0,a.kt)("p",null,"To view the logs of a Docker container in real time, use the following command:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"sudo docker logs -f lightning-node\n")),(0,a.kt)(o.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}k.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(7294);const a=e=>{let{image:t,name:n,title:a,url:o,communityMember:l=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:o,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:o,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},a),r.createElement("span",{className:"discord"},l?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/d464210a.31238def.js b/assets/js/d464210a.3e507ebe.js similarity index 92% rename from assets/js/d464210a.31238def.js rename to assets/js/d464210a.3e507ebe.js index 743ea9bac..76205b8a6 100644 --- a/assets/js/d464210a.31238def.js +++ b/assets/js/d464210a.3e507ebe.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2023],{4075:o=>{o.exports=JSON.parse('{"label":"code of conduct","permalink":"/docs/tags/code-of-conduct","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2023],{4075:o=>{o.exports=JSON.parse('{"label":"code of conduct","permalink":"/docs/tags/code-of-conduct","allTagsPath":"/docs/tags","count":1,"items":[{"id":"Open-source/code-of-conduct","title":"Code of Conduct","description":"Contributor Covenant Code of Conduct","permalink":"/docs/Open-source/code-of-conduct"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/d7d81bf6.be572449.js b/assets/js/d7d81bf6.be572449.js deleted file mode 100644 index 4318d78b9..000000000 --- a/assets/js/d7d81bf6.be572449.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2918],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function o(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,g=p["".concat(s,".").concat(d)]||p[d]||m[d]||l;return n?r.createElement(g,i(i({ref:t},u),{},{components:n})):r.createElement(g,i({ref:t},u))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,i=new Array(l);i[0]=d;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[p]="string"==typeof e?e:a,i[1]=o;for(var c=2;c<l;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},9760:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var r=n(7462),a=(n(7294),n(3905)),l=n(3872);const i={title:"Error building on ARM64",slug:"error-building-on-arm64",hide_title:!0,tags:["references","help","fix"]},o=void 0,s={unversionedId:"Lightning CLI/error-building-on-arm64",id:"Lightning CLI/error-building-on-arm64",title:"Error building on ARM64",description:"Building on the ARM64 (aarch64)",source:"@site/references/Lightning CLI/error-building-on-arm64.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/error-building-on-arm64",permalink:"/references/Lightning CLI/error-building-on-arm64",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/error-building-on-arm64.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"fix",permalink:"/references/tags/fix"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Error building on ARM64",slug:"error-building-on-arm64",hide_title:!0,tags:["references","help","fix"]},sidebar:"defaultSidebar",previous:{title:"Uninstall Docker Setup",permalink:"/references/Docker/uninstall-docker-setup"},next:{title:"Error linking with cc",permalink:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"}},c={},u=[{value:"Building on the ARM64 (aarch64)",id:"building-on-the-arm64-aarch64",level:2}],p={toc:u},m="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(m,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"building-on-the-arm64-aarch64"},"Building on the ARM64 (aarch64)"),(0,a.kt)("p",null,"ARM64 platform has its own specifics, and currently consists of requiring ",(0,a.kt)("inlineCode",{parentName:"p"},"gcc"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install gcc\n")),(0,a.kt)("p",null,"On cargo build, the error ",(0,a.kt)("inlineCode",{parentName:"p"},"error: linking with "),"cc",(0,a.kt)("inlineCode",{parentName:"p"}," failed: exit status: 1")," occurs, as demonstrated in the output below:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"error: linking with `cc` failed: exit status: 1\n# ... wall of text\n# ... the key error is \u21b4\n= note: /usr/bin/ld: /home/ubuntu/fleek-network/lightning/target/release/deps/libblake3-a927e9b36d695ff0.rlib(blake3-a927e9b36d695ff0.blake3.91a53ea05847a7a5-cgu.0.rcgu.o): in function `blake3_compress_in_place_portable':\n /home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/blake3-1.4.1/src/ffi_neon.rs:45: multiple definition of `blake3_compress_in_place_portable'; /home/ubuntu/fleek-network/lightning/target/release/deps/libfleek_blake3-990c4c0cfb4eaa87.rlib(fleek_blake3-990c4c0cfb4eaa87.fleek_blake3.4f11e9370af31773-cgu.0.rcgu.o):/home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/fleek-blake3-1.4.1/src/ffi_neon.rs:45: first defined here\n")),(0,a.kt)("p",null,"As a result of the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/ryssroad/fleek-aarch64-build"},"research")," by the community member ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/ryssroad"},"ryssroad"),", the following solution was shared."),(0,a.kt)("p",null,"Open the ",(0,a.kt)("inlineCode",{parentName:"p"},"cargo.toml")," file in ",(0,a.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning/Cargo.toml")," and find the ",(0,a.kt)("inlineCode",{parentName:"p"},"lto")," key."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"lto = true\n")),(0,a.kt)("p",null,"Change the ",(0,a.kt)("inlineCode",{parentName:"p"},"lto")," key value from ",(0,a.kt)("inlineCode",{parentName:"p"},"true")," to ",(0,a.kt)("inlineCode",{parentName:"p"},"thin"),":"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},'...\n[profile.release]\n# currently enabled, may increase build time, but runtime faster, can set to `"thin"`.\nlto = "thin"\n')),(0,a.kt)("p",null,"Set ",(0,a.kt)("inlineCode",{parentName:"p"},"RUSTFLAGS")," on build, as follows:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},'RUSTFLAGS="-Clink-arg=-Wl,--allow-multiple-definition" cargo +stable build --release \n')),(0,a.kt)("p",null,"Once the build completes, you should find the generated binary ",(0,a.kt)("inlineCode",{parentName:"p"},"lightning-node")," under the directory ",(0,a.kt)("inlineCode",{parentName:"p"},"~/fleek-network/lightning/target/release/lightning-node"),"."),(0,a.kt)("p",null,"As an example, execute:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"~/fleek-network/lightning/target/release/lightning-node help\n")),(0,a.kt)("p",null,"To find the help output:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-sh"},"Usage: lightning-node [OPTIONS] <COMMAND>\n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n")),(0,a.kt)(l.Z,{name:"Road aka @road",image:"https://github.com/ryssroad.png",title:"Community member",url:"https://github.com/ryssroad",communityMember:"true",mdxType:"Author"}))}d.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(7294);const a=e=>{let{image:t,name:n,title:a,url:l,communityMember:i=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:l,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:l,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},a),r.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/d7d81bf6.dfef0ceb.js b/assets/js/d7d81bf6.dfef0ceb.js new file mode 100644 index 000000000..adad47dcb --- /dev/null +++ b/assets/js/d7d81bf6.dfef0ceb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2918],{6710:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>d});var t=r(5893),i=r(1151),s=r(3872);const l={title:"Error building on ARM64",slug:"error-building-on-arm64",hide_title:!0,tags:["references","help","fix"]},a=void 0,o={id:"Lightning CLI/error-building-on-arm64",title:"Error building on ARM64",description:"Building on the ARM64 (aarch64)",source:"@site/references/Lightning CLI/error-building-on-arm64.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/error-building-on-arm64",permalink:"/references/Lightning CLI/error-building-on-arm64",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/error-building-on-arm64.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"fix",permalink:"/references/tags/fix"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Error building on ARM64",slug:"error-building-on-arm64",hide_title:!0,tags:["references","help","fix"]},sidebar:"defaultSidebar",previous:{title:"Uninstall Docker Setup",permalink:"/references/Docker/uninstall-docker-setup"},next:{title:"Error linking with cc",permalink:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1"}},c={},d=[{value:"Building on the ARM64 (aarch64)",id:"building-on-the-arm64-aarch64",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"building-on-the-arm64-aarch64",children:"Building on the ARM64 (aarch64)"}),"\n",(0,t.jsxs)(n.p,{children:["ARM64 platform has its own specifics, and currently consists of requiring ",(0,t.jsx)(n.code,{children:"gcc"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"sudo apt install gcc\n"})}),"\n",(0,t.jsxs)(n.p,{children:["On cargo build, the error ",(0,t.jsx)(n.code,{children:"error: linking with "}),"cc",(0,t.jsx)(n.code,{children:" failed: exit status: 1"})," occurs, as demonstrated in the output below:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"error: linking with `cc` failed: exit status: 1\n# ... wall of text\n# ... the key error is \u21b4\n= note: /usr/bin/ld: /home/ubuntu/fleek-network/lightning/target/release/deps/libblake3-a927e9b36d695ff0.rlib(blake3-a927e9b36d695ff0.blake3.91a53ea05847a7a5-cgu.0.rcgu.o): in function `blake3_compress_in_place_portable':\n /home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/blake3-1.4.1/src/ffi_neon.rs:45: multiple definition of `blake3_compress_in_place_portable'; /home/ubuntu/fleek-network/lightning/target/release/deps/libfleek_blake3-990c4c0cfb4eaa87.rlib(fleek_blake3-990c4c0cfb4eaa87.fleek_blake3.4f11e9370af31773-cgu.0.rcgu.o):/home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/fleek-blake3-1.4.1/src/ffi_neon.rs:45: first defined here\n"})}),"\n",(0,t.jsxs)(n.p,{children:["As a result of the ",(0,t.jsx)(n.a,{href:"https://github.com/ryssroad/fleek-aarch64-build",children:"research"})," by the community member ",(0,t.jsx)(n.a,{href:"https://github.com/ryssroad",children:"ryssroad"}),", the following solution was shared."]}),"\n",(0,t.jsxs)(n.p,{children:["Open the ",(0,t.jsx)(n.code,{children:"cargo.toml"})," file in ",(0,t.jsx)(n.code,{children:"~/fleek-network/lightning/Cargo.toml"})," and find the ",(0,t.jsx)(n.code,{children:"lto"})," key."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"lto = true\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Change the ",(0,t.jsx)(n.code,{children:"lto"})," key value from ",(0,t.jsx)(n.code,{children:"true"})," to ",(0,t.jsx)(n.code,{children:"thin"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:'...\n[profile.release]\n# currently enabled, may increase build time, but runtime faster, can set to `"thin"`.\nlto = "thin"\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Set ",(0,t.jsx)(n.code,{children:"RUSTFLAGS"})," on build, as follows:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'RUSTFLAGS="-Clink-arg=-Wl,--allow-multiple-definition" cargo +stable build --release \n'})}),"\n",(0,t.jsxs)(n.p,{children:["Once the build completes, you should find the generated binary ",(0,t.jsx)(n.code,{children:"lightning-node"})," under the directory ",(0,t.jsx)(n.code,{children:"~/fleek-network/lightning/target/release/lightning-node"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"As an example, execute:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"~/fleek-network/lightning/target/release/lightning-node help\n"})}),"\n",(0,t.jsx)(n.p,{children:"To find the help output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-sh",children:"Usage: lightning-node [OPTIONS] <COMMAND>\n\nCommands:\n run Start the node\n keys Handle keys\n print-config Print the loaded configuration\n help Print this message or the help of the given subcommand(s)\n\nOptions:\n -c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]\n --with-mock-consensus Determines that we should be using the mock consensus backend\n -v... Increases the level of verbosity (the max level is -vvv)\n --log-location Print code location on console logs\n -h, --help Print help\n -V, --version Print version\n"})}),"\n",(0,t.jsx)(s.Z,{name:"Road aka @road",image:"https://github.com/ryssroad.png",title:"Community member",url:"https://github.com/ryssroad",communityMember:"true"})]})}function u(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},3872:(e,n,r)=>{r.d(n,{Z:()=>i});r(7294);var t=r(5893);const i=e=>{let{image:n,name:r,title:i,url:s,communityMember:l=!1}=e;return(0,t.jsx)("section",{className:"author_card",children:(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"avatar",children:(0,t.jsx)("a",{href:s,target:"_blank",alt:r,children:(0,t.jsx)("img",{src:n,alt:r})})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{className:"name",children:(0,t.jsx)("a",{href:s,target:"_blank",alt:r,children:r})}),(0,t.jsx)("span",{className:"title",children:i}),(0,t.jsxs)("span",{className:"discord",children:[l?"Join our community on":"Got questions? Find us on"," ",(0,t.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,r)=>{r.d(n,{Z:()=>a,a:()=>l});var t=r(7294);const i={},s=t.createContext(i);function l(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d8be0e5a.ea934156.js b/assets/js/d8be0e5a.ea934156.js new file mode 100644 index 000000000..7518010fa --- /dev/null +++ b/assets/js/d8be0e5a.ea934156.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1706],{4751:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>u,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var r=i(5893),t=i(1151),s=i(3872);const l={title:"Error linking with cc",slug:"error-linking-with-cc-failed-exist-status-1",hide_title:!0,tags:["references","help","update","upgrade","fix"]},a=void 0,c={id:"Lightning CLI/error-linking-with-cc-failed",title:"Error linking with cc",description:"Check if CPU is supported",source:"@site/references/Lightning CLI/error-linking-with-cc-failed.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/error-linking-with-cc-failed-exist-status-1",permalink:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/error-linking-with-cc-failed.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"update",permalink:"/references/tags/update"},{label:"upgrade",permalink:"/references/tags/upgrade"},{label:"fix",permalink:"/references/tags/fix"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Error linking with cc",slug:"error-linking-with-cc-failed-exist-status-1",hide_title:!0,tags:["references","help","update","upgrade","fix"]},sidebar:"defaultSidebar",previous:{title:"Error building on ARM64",permalink:"/references/Lightning CLI/error-building-on-arm64"},next:{title:"File permissions and Ownership",permalink:"/references/Lightning CLI/file-permissions-and-ownership"}},o={},d=[{value:"Check if CPU is supported",id:"check-if-cpu-is-supported",level:2},{value:"Linking with cc error",id:"linking-with-cc-error",level:2},{value:"Update",id:"update",level:2},{value:"Install <code>gcc</code>:",id:"install-gcc",level:2},{value:"Remove previous installation files",id:"remove-previous-installation-files",level:2},{value:"Run the installation script",id:"run-the-installation-script",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"check-if-cpu-is-supported",children:"Check if CPU is supported"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"uname -i\n"})}),"\n",(0,r.jsxs)(n.admonition,{title:"WARNING",type:"caution",children:[(0,r.jsxs)(n.p,{children:["Given the ",(0,r.jsx)(n.a,{href:"https://docs.fleek.network/docs/node/requirements/#specs",children:"CPU requirements"}),", currently we're mainly supporting ",(0,r.jsx)(n.code,{children:"GenuineIntel"})," and there have been reports of failure to build the binary on ",(0,r.jsx)(n.code,{children:"AMD"}),". The ",(0,r.jsx)(n.code,{children:"ARM64"})," is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference ",(0,r.jsx)(n.a,{href:"/references/Lightning%20CLI/error-building-on-arm64",children:"error building on ARM64"}),"."]}),(0,r.jsxs)(n.p,{children:["Any contribution or feedback to provide support is appreciated. Feel free to let us know on our ",(0,r.jsx)(n.a,{href:"https://discord.gg/fleekxyz",children:"Discord channel"}),"."]})]}),"\n",(0,r.jsx)(n.h2,{id:"linking-with-cc-error",children:"Linking with cc error"}),"\n",(0,r.jsxs)(n.p,{children:["A user who finds the error ",(0,r.jsx)(n.code,{children:"linking with cc failed"}),", will have to install the required dependencies."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"error: linking with `cc` failed: exit status: 1\nerror: could not compile `fleek-service-ping-example` (lib) due to previous error\n"})}),"\n",(0,r.jsx)(n.h2,{id:"update",children:"Update"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"sudo apt-get update\n"})}),"\n",(0,r.jsxs)(n.h2,{id:"install-gcc",children:["Install ",(0,r.jsx)(n.code,{children:"gcc"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"sudo apt-get install gcc\n"})}),"\n",(0,r.jsx)(n.h2,{id:"remove-previous-installation-files",children:"Remove previous installation files"}),"\n",(0,r.jsxs)(n.p,{children:["You can re-run the installation process. If you are using the assisted installer, it'll complain that the source code directory already exists. Since you've probably cloned the source code repository locally, you'll have to remove it manually. If you need help, find the instructions in the ",(0,r.jsx)(n.a,{href:"/references/Lightning%20CLI/uninstall-lightning-node",children:"reference"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"run-the-installation-script",children:"Run the installation script"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-sh",children:"curl https://get.fleek.network | bash\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Alternatively, read the ",(0,r.jsx)(n.a,{href:"/docs/node/install#manual-installation",children:"manual installation instructions"})," for more information."]}),"\n",(0,r.jsx)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},3872:(e,n,i)=>{i.d(n,{Z:()=>t});i(7294);var r=i(5893);const t=e=>{let{image:n,name:i,title:t,url:s,communityMember:l=!1}=e;return(0,r.jsx)("section",{className:"author_card",children:(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"avatar",children:(0,r.jsx)("a",{href:s,target:"_blank",alt:i,children:(0,r.jsx)("img",{src:n,alt:i})})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("span",{className:"name",children:(0,r.jsx)("a",{href:s,target:"_blank",alt:i,children:i})}),(0,r.jsx)("span",{className:"title",children:t}),(0,r.jsxs)("span",{className:"discord",children:[l?"Join our community on":"Got questions? Find us on"," ",(0,r.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>l});var r=i(7294);const t={},s=r.createContext(t);function l(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d8be0e5a.f9e6cd73.js b/assets/js/d8be0e5a.f9e6cd73.js deleted file mode 100644 index 5e52ba701..000000000 --- a/assets/js/d8be0e5a.f9e6cd73.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1706],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){i(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function o(e,t){if(null==e)return{};var r,n,i=function(e,t){if(null==e)return{};var r,n,i={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),u=c(r),m=i,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||a;return r?n.createElement(f,l(l({ref:t},p),{},{components:r})):n.createElement(f,l({ref:t},p))}));function f(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,l=new Array(a);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:i,l[1]=o;for(var c=2;c<a;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}m.displayName="MDXCreateElement"},4458:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var n=r(7462),i=(r(7294),r(3905)),a=r(3872);const l={title:"Error linking with cc",slug:"error-linking-with-cc-failed-exist-status-1",hide_title:!0,tags:["references","help","update","upgrade","fix"]},o=void 0,s={unversionedId:"Lightning CLI/error-linking-with-cc-failed",id:"Lightning CLI/error-linking-with-cc-failed",title:"Error linking with cc",description:"Check if CPU is supported",source:"@site/references/Lightning CLI/error-linking-with-cc-failed.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/error-linking-with-cc-failed-exist-status-1",permalink:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/error-linking-with-cc-failed.md",tags:[{label:"references",permalink:"/references/tags/references"},{label:"help",permalink:"/references/tags/help"},{label:"update",permalink:"/references/tags/update"},{label:"upgrade",permalink:"/references/tags/upgrade"},{label:"fix",permalink:"/references/tags/fix"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Error linking with cc",slug:"error-linking-with-cc-failed-exist-status-1",hide_title:!0,tags:["references","help","update","upgrade","fix"]},sidebar:"defaultSidebar",previous:{title:"Error building on ARM64",permalink:"/references/Lightning CLI/error-building-on-arm64"},next:{title:"File permissions and Ownership",permalink:"/references/Lightning CLI/file-permissions-and-ownership"}},c={},p=[{value:"Check if CPU is supported",id:"check-if-cpu-is-supported",level:2},{value:"Linking with cc error",id:"linking-with-cc-error",level:2},{value:"Update",id:"update",level:2},{value:"Install <code>gcc</code>:",id:"install-gcc",level:2},{value:"Remove previous installation files",id:"remove-previous-installation-files",level:2},{value:"Run the installation script",id:"run-the-installation-script",level:2}],u={toc:p},d="wrapper";function m(e){let{components:t,...r}=e;return(0,i.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"check-if-cpu-is-supported"},"Check if CPU is supported"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"uname -i\n")),(0,i.kt)("admonition",{title:"WARNING",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Given the ",(0,i.kt)("a",{parentName:"p",href:"https://docs.fleek.network/docs/node/requirements/#specs"},"CPU requirements"),", currently we're mainly supporting ",(0,i.kt)("inlineCode",{parentName:"p"},"GenuineIntel")," and there have been reports of failure to build the binary on ",(0,i.kt)("inlineCode",{parentName:"p"},"AMD"),". The ",(0,i.kt)("inlineCode",{parentName:"p"},"ARM64")," is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference ",(0,i.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/error-building-on-arm64"},"error building on ARM64"),"."),(0,i.kt)("p",{parentName:"admonition"},"Any contribution or feedback to provide support is appreciated. Feel free to let us know on our ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"Discord channel"),".")),(0,i.kt)("h2",{id:"linking-with-cc-error"},"Linking with cc error"),(0,i.kt)("p",null,"A user who finds the error ",(0,i.kt)("inlineCode",{parentName:"p"},"linking with cc failed"),", will have to install the required dependencies."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"error: linking with `cc` failed: exit status: 1\nerror: could not compile `fleek-service-ping-example` (lib) due to previous error\n")),(0,i.kt)("h2",{id:"update"},"Update"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get update\n")),(0,i.kt)("h2",{id:"install-gcc"},"Install ",(0,i.kt)("inlineCode",{parentName:"h2"},"gcc"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install gcc\n")),(0,i.kt)("h2",{id:"remove-previous-installation-files"},"Remove previous installation files"),(0,i.kt)("p",null,"You can re-run the installation process. If you are using the assisted installer, it'll complain that the source code directory already exists. Since you've probably cloned the source code repository locally, you'll have to remove it manually. If you need help, find the instructions in the ",(0,i.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/uninstall-lightning-node"},"reference"),"."),(0,i.kt)("h2",{id:"run-the-installation-script"},"Run the installation script"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://get.fleek.network | bash\n")),(0,i.kt)("p",null,"Alternatively, read the ",(0,i.kt)("a",{parentName:"p",href:"/docs/node/install#manual-installation"},"manual installation instructions")," for more information."),(0,i.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}m.isMDXComponent=!0},3872:(e,t,r)=>{r.d(t,{Z:()=>i});var n=r(7294);const i=e=>{let{image:t,name:r,title:i,url:a,communityMember:l=!1}=e;return n.createElement("section",{className:"author_card"},n.createElement("div",null,n.createElement("span",{className:"avatar"},n.createElement("a",{href:a,target:"_blank",alt:r},n.createElement("img",{src:t,alt:r}))),n.createElement("div",null,n.createElement("span",{className:"name"},n.createElement("a",{href:a,target:"_blank",alt:r},r)),n.createElement("span",{className:"title"},i),n.createElement("span",{className:"discord"},l?"Join our community on":"Got questions? Find us on"," ",n.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/da002ab0.79cb2336.js b/assets/js/da002ab0.4e4f882b.js similarity index 82% rename from assets/js/da002ab0.79cb2336.js rename to assets/js/da002ab0.4e4f882b.js index cc64a97ec..f372075dd 100644 --- a/assets/js/da002ab0.79cb2336.js +++ b/assets/js/da002ab0.4e4f882b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5888],{831:e=>{e.exports=JSON.parse('{"label":"fleek network","permalink":"/blog/tags/fleek-network","allTagsPath":"/blog/tags","count":1}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5888],{831:e=>{e.exports=JSON.parse('{"label":"fleek network","permalink":"/blog/tags/fleek-network","allTagsPath":"/blog/tags","count":1,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/dc2776f2.224fc2b8.js b/assets/js/dc2776f2.224fc2b8.js deleted file mode 100644 index 24211c301..000000000 --- a/assets/js/dc2776f2.224fc2b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8644],{3905:(e,t,r)=>{r.d(t,{Zo:()=>l,kt:()=>y});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function s(e,t){if(null==e)return{};var r,o,n=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++)r=i[o],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),p=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},l=function(e){var t=p(e.components);return o.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},f=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),u=p(r),f=n,y=u["".concat(c,".").concat(f)]||u[f]||d[f]||i;return r?o.createElement(y,a(a({ref:t},l),{},{components:r})):o.createElement(y,a({ref:t},l))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[u]="string"==typeof e?e:n,a[1]=s;for(var p=2;p<i;p++)a[p]=r[p];return o.createElement.apply(null,a)}return o.createElement.apply(null,r)}f.displayName="MDXCreateElement"},93:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var o=r(7462),n=(r(7294),r(3905));const i={draft:!1,title:"Repositories",hide_title:!1,date:new Date("2023-01-15T09:00:00.000Z"),description:"Repositories",category:"Documentation",keywords:["repositories"],tags:["repository"]},a=void 0,s={unversionedId:"Open-source/repositories",id:"Open-source/repositories",title:"Repositories",description:"Repositories",source:"@site/docs/Open-source/repositories.md",sourceDirName:"Open-source",slug:"/Open-source/repositories",permalink:"/docs/Open-source/repositories",draft:!1,tags:[{label:"repository",permalink:"/docs/tags/repository"}],version:"current",frontMatter:{draft:!1,title:"Repositories",hide_title:!1,date:"2023-01-15T09:00:00.000Z",description:"Repositories",category:"Documentation",keywords:["repositories"],tags:["repository"]},sidebar:"docs",previous:{title:"Contributing",permalink:"/docs/Open-source/contributing"},next:{title:"Whitepaper",permalink:"/docs/whitepaper"}},c={},p=[],l={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,o.Z)({},l,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"The Fleek Network's repositories contain a collection of source code, libraries, and other software artifacts that are used to build and maintain our products collaboratively."),(0,n.kt)("p",null,"These repositories are carefully managed and versioned to ensure that developers can easily collaborate and work together on code changes. They are also regularly audited to ensure that only high-quality software is included and that security vulnerabilities are quickly identified and addressed."),(0,n.kt)("p",null,"Overall, our open-source repositories are an essential part of our development process and help us deliver reliable and secure products to our community."),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/"},"Find all our repositories on Github")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dc2776f2.a0c19ad7.js b/assets/js/dc2776f2.a0c19ad7.js new file mode 100644 index 000000000..b024143a5 --- /dev/null +++ b/assets/js/dc2776f2.a0c19ad7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[8644],{8864:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>n,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var r=o(5893),s=o(1151);const i={draft:!1,title:"Repositories",hide_title:!1,date:new Date("2023-01-15T09:00:00.000Z"),description:"Repositories",category:"Documentation",keywords:["repositories"],tags:["repository"]},n=void 0,a={id:"Open-source/repositories",title:"Repositories",description:"Repositories",source:"@site/docs/Open-source/repositories.md",sourceDirName:"Open-source",slug:"/Open-source/repositories",permalink:"/docs/Open-source/repositories",draft:!1,unlisted:!1,tags:[{label:"repository",permalink:"/docs/tags/repository"}],version:"current",frontMatter:{draft:!1,title:"Repositories",hide_title:!1,date:"2023-01-15T09:00:00.000Z",description:"Repositories",category:"Documentation",keywords:["repositories"],tags:["repository"]},sidebar:"docs",previous:{title:"Contributing",permalink:"/docs/Open-source/contributing"},next:{title:"Whitepaper",permalink:"/docs/whitepaper"}},c={},d=[];function p(e){const t={a:"a",p:"p",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"The Fleek Network's repositories contain a collection of source code, libraries, and other software artifacts that are used to build and maintain our products collaboratively."}),"\n",(0,r.jsx)(t.p,{children:"These repositories are carefully managed and versioned to ensure that developers can easily collaborate and work together on code changes. They are also regularly audited to ensure that only high-quality software is included and that security vulnerabilities are quickly identified and addressed."}),"\n",(0,r.jsx)(t.p,{children:"Overall, our open-source repositories are an essential part of our development process and help us deliver reliable and secure products to our community."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.a,{href:"https://github.com/fleek-network/",children:"Find all our repositories on Github"})})]})}function l(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>a,a:()=>n});var r=o(7294);const s={},i=r.createContext(s);function n(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:n(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dd97a9bc.316666d0.js b/assets/js/dd97a9bc.316666d0.js deleted file mode 100644 index 6c47eaf7c..000000000 --- a/assets/js/dd97a9bc.316666d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9707],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function s(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?s(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):s(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function o(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},s=Object.keys(e);for(n=0;n<s.length;n++)a=s[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)a=s[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},m="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=c(a),u=r,h=m["".concat(l,".").concat(u)]||m[u]||p[u]||s;return a?n.createElement(h,i(i({ref:t},d),{},{components:a})):n.createElement(h,i({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=a.length,i=new Array(s);i[0]=u;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[m]="string"==typeof e?e:r,i[1]=o;for(var c=2;c<s;c++)i[c]=a[c];return n.createElement.apply(null,i)}return n.createElement.apply(null,a)}u.displayName="MDXCreateElement"},3872:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(7294);const r=e=>{let{image:t,name:a,title:r,url:s,communityMember:i=!1}=e;return n.createElement("section",{className:"author_card"},n.createElement("div",null,n.createElement("span",{className:"avatar"},n.createElement("a",{href:s,target:"_blank",alt:a},n.createElement("img",{src:t,alt:a}))),n.createElement("div",null,n.createElement("span",{className:"name"},n.createElement("a",{href:s,target:"_blank",alt:a},a)),n.createElement("span",{className:"title"},r),n.createElement("span",{className:"discord"},i?"Join our community on":"Got questions? Find us on"," ",n.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}},3634:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var n=a(7462),r=(a(7294),a(3905)),s=a(3872);const i={title:"Systemd Service",slug:"systemd-service",hide_title:!0,tags:["systemd","systemctl","control","manage"]},o=void 0,l={unversionedId:"node/systemd-service",id:"node/systemd-service",title:"Systemd Service",description:"Systemd Service",source:"@site/docs/node/systemd-service.md",sourceDirName:"node",slug:"/node/systemd-service",permalink:"/docs/node/systemd-service",draft:!1,tags:[{label:"systemd",permalink:"/docs/tags/systemd"},{label:"systemctl",permalink:"/docs/tags/systemctl"},{label:"control",permalink:"/docs/tags/control"},{label:"manage",permalink:"/docs/tags/manage"}],version:"current",frontMatter:{title:"Systemd Service",slug:"systemd-service",hide_title:!0,tags:["systemd","systemctl","control","manage"]},sidebar:"docs",previous:{title:"Analyzing logs",permalink:"/docs/node/analyzing-logs"},next:{title:"Lightning CLI",permalink:"/docs/node/lightning-cli"}},c={},d=[{value:"Systemd Service",id:"systemd-service",level:2},{value:"Reload the daemon",id:"reload-the-daemon",level:3},{value:"Enable",id:"enable",level:3},{value:"Disable",id:"disable",level:3},{value:"Start",id:"start",level:3},{value:"Stop",id:"stop",level:3},{value:"Restart",id:"restart",level:3},{value:"Status",id:"status",level:3}],m={toc:d},p="wrapper";function u(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,n.Z)({},m,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"systemd-service"},"Systemd Service"),(0,r.kt)("p",null,"In this section we describe how to enable, disable, start, stop the Systemd Service."),(0,r.kt)("p",null,"The service is set up by the ",(0,r.kt)("a",{parentName:"p",href:"#assisted-installer"},"assisted installer")," automatically, or manually as described in the ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#manual-installation"},"manual installation")," and ",(0,r.kt)("a",{parentName:"p",href:"/docs/node/install#docker-installation"},"docker install"),"."),(0,r.kt)("h3",{id:"reload-the-daemon"},"Reload the daemon"),(0,r.kt)("p",null,"Reload the Systemctl daemon by executing the command:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl daemon-reload\n")),(0,r.kt)("h3",{id:"enable"},"Enable"),(0,r.kt)("p",null,"Enable the service for starting up on system boot:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable lightning.service\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,r.kt)("inlineCode",{parentName:"p"},"docker-"),"."),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl enable docker-lightning\n"))),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"You shouldn't have prefixed the systemctl command with ",(0,r.kt)("strong",{parentName:"p"},"sudo")," when start/stop/status the service. Due to some VPS providers modifying the operating system, we had to present the examples prefixed with sudo for the wider audience. If you'd like to learn more about controlling Systemd services as a ",(0,r.kt)("inlineCode",{parentName:"p"},"user")," check the reference ",(0,r.kt)("a",{parentName:"p",href:"/references/Systemd/user-service"},"Systemd user-service"),".")),(0,r.kt)("h3",{id:"disable"},"Disable"),(0,r.kt)("p",null,"Disable the service for starting up on system boot:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl disable lightning.service\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you have installed or setup the Service as a Docker Container, prefix the service name with ",(0,r.kt)("inlineCode",{parentName:"p"},"docker-"),"."),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl disable docker-lightning\n"))),(0,r.kt)("h3",{id:"start"},"Start"),(0,r.kt)("p",null,"Start the service by:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning.service\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"When naming the service, the *.service can be omitted. For this reason the command can be typed as follows:"),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start lightning\n"))),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,r.kt)("inlineCode",{parentName:"p"},"docker-"),"."),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl start docker-lightning\n"))),(0,r.kt)("h3",{id:"stop"},"Stop"),(0,r.kt)("p",null,"Stop the service by:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl stop lightning\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,r.kt)("inlineCode",{parentName:"p"},"docker-"),"."),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl stop docker-lightning\n"))),(0,r.kt)("h3",{id:"restart"},"Restart"),(0,r.kt)("p",null,"Restart the service by:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl restart lightning\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,r.kt)("inlineCode",{parentName:"p"},"docker-"),"."),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl restart docker-lightning\n"))),(0,r.kt)("h3",{id:"status"},"Status"),(0,r.kt)("p",null,"Check the service status by:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl status lightning.service\n")),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,r.kt)("inlineCode",{parentName:"p"},"docker-"),"."),(0,r.kt)("pre",{parentName:"admonition"},(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"sudo systemctl status docker-lightning\n"))),(0,r.kt)(s.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/dd97a9bc.8892f4a2.js b/assets/js/dd97a9bc.8892f4a2.js new file mode 100644 index 000000000..320c44487 --- /dev/null +++ b/assets/js/dd97a9bc.8892f4a2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9707],{7538:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>c,toc:()=>o});var n=t(5893),i=t(1151),r=t(3872);const a={title:"Systemd Service",slug:"systemd-service",hide_title:!0,tags:["systemd","systemctl","control","manage"]},l=void 0,c={id:"node/systemd-service",title:"Systemd Service",description:"Systemd Service",source:"@site/docs/node/systemd-service.md",sourceDirName:"node",slug:"/node/systemd-service",permalink:"/docs/node/systemd-service",draft:!1,unlisted:!1,tags:[{label:"systemd",permalink:"/docs/tags/systemd"},{label:"systemctl",permalink:"/docs/tags/systemctl"},{label:"control",permalink:"/docs/tags/control"},{label:"manage",permalink:"/docs/tags/manage"}],version:"current",frontMatter:{title:"Systemd Service",slug:"systemd-service",hide_title:!0,tags:["systemd","systemctl","control","manage"]},sidebar:"docs",previous:{title:"Analyzing logs",permalink:"/docs/node/analyzing-logs"},next:{title:"Lightning CLI",permalink:"/docs/node/lightning-cli"}},d={},o=[{value:"Systemd Service",id:"systemd-service",level:2},{value:"Reload the daemon",id:"reload-the-daemon",level:3},{value:"Enable",id:"enable",level:3},{value:"Disable",id:"disable",level:3},{value:"Start",id:"start",level:3},{value:"Stop",id:"stop",level:3},{value:"Restart",id:"restart",level:3},{value:"Status",id:"status",level:3}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h2,{id:"systemd-service",children:"Systemd Service"}),"\n",(0,n.jsx)(s.p,{children:"In this section we describe how to enable, disable, start, stop the Systemd Service."}),"\n",(0,n.jsxs)(s.p,{children:["The service is set up by the ",(0,n.jsx)(s.a,{href:"#assisted-installer",children:"assisted installer"})," automatically, or manually as described in the ",(0,n.jsx)(s.a,{href:"/docs/node/install#manual-installation",children:"manual installation"})," and ",(0,n.jsx)(s.a,{href:"/docs/node/install#docker-installation",children:"docker install"}),"."]}),"\n",(0,n.jsx)(s.h3,{id:"reload-the-daemon",children:"Reload the daemon"}),"\n",(0,n.jsx)(s.p,{children:"Reload the Systemctl daemon by executing the command:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl daemon-reload\n"})}),"\n",(0,n.jsx)(s.h3,{id:"enable",children:"Enable"}),"\n",(0,n.jsx)(s.p,{children:"Enable the service for starting up on system boot:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl enable lightning.service\n"})}),"\n",(0,n.jsxs)(s.admonition,{type:"tip",children:[(0,n.jsxs)(s.p,{children:["If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,n.jsx)(s.code,{children:"docker-"}),"."]}),(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl enable docker-lightning\n"})})]}),"\n",(0,n.jsx)(s.admonition,{type:"caution",children:(0,n.jsxs)(s.p,{children:["You shouldn't have prefixed the systemctl command with ",(0,n.jsx)(s.strong,{children:"sudo"})," when start/stop/status the service. Due to some VPS providers modifying the operating system, we had to present the examples prefixed with sudo for the wider audience. If you'd like to learn more about controlling Systemd services as a ",(0,n.jsx)(s.code,{children:"user"})," check the reference ",(0,n.jsx)(s.a,{href:"/references/Systemd/user-service",children:"Systemd user-service"}),"."]})}),"\n",(0,n.jsx)(s.h3,{id:"disable",children:"Disable"}),"\n",(0,n.jsx)(s.p,{children:"Disable the service for starting up on system boot:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl disable lightning.service\n"})}),"\n",(0,n.jsxs)(s.admonition,{type:"tip",children:[(0,n.jsxs)(s.p,{children:["If you have installed or setup the Service as a Docker Container, prefix the service name with ",(0,n.jsx)(s.code,{children:"docker-"}),"."]}),(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl disable docker-lightning\n"})})]}),"\n",(0,n.jsx)(s.h3,{id:"start",children:"Start"}),"\n",(0,n.jsx)(s.p,{children:"Start the service by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl start lightning.service\n"})}),"\n",(0,n.jsxs)(s.admonition,{type:"tip",children:[(0,n.jsx)(s.p,{children:"When naming the service, the *.service can be omitted. For this reason the command can be typed as follows:"}),(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl start lightning\n"})})]}),"\n",(0,n.jsxs)(s.admonition,{type:"tip",children:[(0,n.jsxs)(s.p,{children:["If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,n.jsx)(s.code,{children:"docker-"}),"."]}),(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl start docker-lightning\n"})})]}),"\n",(0,n.jsx)(s.h3,{id:"stop",children:"Stop"}),"\n",(0,n.jsx)(s.p,{children:"Stop the service by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl stop lightning\n"})}),"\n",(0,n.jsxs)(s.admonition,{type:"tip",children:[(0,n.jsxs)(s.p,{children:["If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,n.jsx)(s.code,{children:"docker-"}),"."]}),(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl stop docker-lightning\n"})})]}),"\n",(0,n.jsx)(s.h3,{id:"restart",children:"Restart"}),"\n",(0,n.jsx)(s.p,{children:"Restart the service by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl restart lightning\n"})}),"\n",(0,n.jsxs)(s.admonition,{type:"tip",children:[(0,n.jsxs)(s.p,{children:["If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,n.jsx)(s.code,{children:"docker-"}),"."]}),(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl restart docker-lightning\n"})})]}),"\n",(0,n.jsx)(s.h3,{id:"status",children:"Status"}),"\n",(0,n.jsx)(s.p,{children:"Check the service status by:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl status lightning.service\n"})}),"\n",(0,n.jsxs)(s.admonition,{type:"tip",children:[(0,n.jsxs)(s.p,{children:["If you have installed or set up the Service as a Docker Container, prefix the service name with ",(0,n.jsx)(s.code,{children:"docker-"}),"."]}),(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-sh",children:"sudo systemctl status docker-lightning\n"})})]}),"\n",(0,n.jsx)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function m(e={}){const{wrapper:s}={...(0,i.a)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3872:(e,s,t)=>{t.d(s,{Z:()=>i});t(7294);var n=t(5893);const i=e=>{let{image:s,name:t,title:i,url:r,communityMember:a=!1}=e;return(0,n.jsx)("section",{className:"author_card",children:(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"avatar",children:(0,n.jsx)("a",{href:r,target:"_blank",alt:t,children:(0,n.jsx)("img",{src:s,alt:t})})}),(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{className:"name",children:(0,n.jsx)("a",{href:r,target:"_blank",alt:t,children:t})}),(0,n.jsx)("span",{className:"title",children:i}),(0,n.jsxs)("span",{className:"discord",children:[a?"Join our community on":"Got questions? Find us on"," ",(0,n.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,s,t)=>{t.d(s,{Z:()=>l,a:()=>a});var n=t(7294);const i={},r=n.createContext(i);function a(e){const s=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/de225737.ae0ddde1.js b/assets/js/de225737.a2e520ac.js similarity index 95% rename from assets/js/de225737.ae0ddde1.js rename to assets/js/de225737.a2e520ac.js index a8d1a7bf0..6581c3ea0 100644 --- a/assets/js/de225737.ae0ddde1.js +++ b/assets/js/de225737.a2e520ac.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6726],{4536:e=>{e.exports=JSON.parse('{"label":"lgtn","permalink":"/docs/tags/lgtn","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6726],{4536:e=>{e.exports=JSON.parse('{"label":"lgtn","permalink":"/docs/tags/lgtn","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/df203c0f.7f1db2f5.js b/assets/js/df203c0f.7f1db2f5.js new file mode 100644 index 000000000..920acd1ff --- /dev/null +++ b/assets/js/df203c0f.7f1db2f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9924],{9047:(e,n,t)=>{t.d(n,{Z:()=>M});var i=t(7294),s=t(5893);function o(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=i.Children.toArray(e),t=n.find((e=>i.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),o=n.filter((e=>e!==t)),l=t?.props.children;return{mdxAdmonitionTitle:l,rest:o.length>0?(0,s.jsx)(s.Fragment,{children:o}):null}}(e.children),o=e.title??n;return{...e,...o&&{title:o},children:t}}var l=t(4334),a=t(5999),c=t(5281);const r={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:n,className:t,children:i}=e;return(0,s.jsx)("div",{className:(0,l.Z)(c.k.common.admonition,c.k.common.admonitionType(n),r.admonition,t),children:i})}function u(e){let{icon:n,title:t}=e;return(0,s.jsxs)("div",{className:r.admonitionHeading,children:[(0,s.jsx)("span",{className:r.admonitionIcon,children:n}),t]})}function h(e){let{children:n}=e;return n?(0,s.jsx)("div",{className:r.admonitionContent,children:n}):null}function m(e){const{type:n,icon:t,title:i,children:o,className:l}=e;return(0,s.jsxs)(d,{type:n,className:l,children:[(0,s.jsx)(u,{title:i,icon:t}),(0,s.jsx)(h,{children:o})]})}function g(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,s.jsx)(g,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function f(e){return(0,s.jsx)(m,{...x,...e,className:(0,l.Z)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const p={icon:(0,s.jsx)(j,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function v(e){return(0,s.jsx)(m,{...p,...e,className:(0,l.Z)("alert alert--success",e.className),children:e.children})}function N(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const Z={icon:(0,s.jsx)(N,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function w(e){return(0,s.jsx)(m,{...Z,...e,className:(0,l.Z)("alert alert--info",e.className),children:e.children})}function T(e){return(0,s.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const b={icon:(0,s.jsx)(T,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function y(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const z={icon:(0,s.jsx)(y,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const C={icon:(0,s.jsx)(T,{}),title:(0,s.jsx)(a.Z,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const k={...{note:f,tip:v,info:w,warning:function(e){return(0,s.jsx)(m,{...b,...e,className:(0,l.Z)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,s.jsx)(m,{...z,...e,className:(0,l.Z)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,s.jsx)(f,{title:"secondary",...e}),important:e=>(0,s.jsx)(w,{title:"important",...e}),success:e=>(0,s.jsx)(v,{title:"success",...e}),caution:function(e){return(0,s.jsx)(m,{...C,...e,className:(0,l.Z)("alert alert--warning",e.className),children:e.children})}}};function M(e){const n=o(e),t=(i=n.type,k[i]||(console.warn(`No admonition component found for admonition type "${i}". Using Info as fallback.`),k.info));var i;return(0,s.jsx)(t,{...n})}},491:(e,n,t)=>{t.r(n),t.d(n,{default:()=>j});t(7294);var i=t(4334),s=t(9960),o=t(8824),l=t(833),a=t(5281),c=t(5999),r=t(197),d=t(2212),u=t(2503),h=t(5893);function m(e){const n=function(){const{selectMessage:e}=(0,o.c)();return n=>e(n,(0,c.I)({id:"theme.docs.tagDocListPageTitle.nDocsTagged",description:'Pluralized label for "{count} docs tagged". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One doc tagged|{count} docs tagged"},{count:n}))}();return(0,c.I)({id:"theme.docs.tagDocListPageTitle",description:"The title of the page for a docs tag",message:'{nDocsTagged} with "{tagName}"'},{nDocsTagged:n(e.tag.count),tagName:e.tag.label})}function g(e){let{doc:n}=e;return(0,h.jsxs)("article",{className:"margin-vert--lg",children:[(0,h.jsx)(s.Z,{to:n.permalink,children:(0,h.jsx)(u.Z,{as:"h2",children:n.title})}),n.description&&(0,h.jsx)("p",{children:n.description})]})}function x(e){let{title:n}=e;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(l.d,{title:n}),(0,h.jsx)(r.Z,{tag:"doc_tag_doc_list"})]})}function f(e){let{tag:n,title:t}=e;return(0,h.jsx)(l.FG,{className:(0,i.Z)(a.k.page.docsTagDocListPage),children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsx)("div",{className:"row",children:(0,h.jsxs)("main",{className:"col col--8 col--offset-2",children:[n.unlisted&&(0,h.jsx)(d.Z,{}),(0,h.jsxs)("header",{className:"margin-bottom--xl",children:[(0,h.jsx)(u.Z,{as:"h1",children:t}),(0,h.jsx)(s.Z,{href:n.allTagsPath,children:(0,h.jsx)(c.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,h.jsx)("section",{className:"margin-vert--lg",children:n.items.map((e=>(0,h.jsx)(g,{doc:e},e.id)))})]})})})})}function j(e){const n=m(e);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(x,{...e,title:n}),(0,h.jsx)(f,{...e,title:n})]})}},2212:(e,n,t)=>{t.d(n,{Z:()=>m});t(7294);var i=t(4334),s=t(5999),o=t(5742),l=t(5893);function a(){return(0,l.jsx)(s.Z,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,l.jsx)(s.Z,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function r(){return(0,l.jsx)(o.Z,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(5281),u=t(9047);function h(e){let{className:n}=e;return(0,l.jsx)(u.Z,{type:"caution",title:(0,l.jsx)(a,{}),className:(0,i.Z)(n,d.k.common.unlistedBanner),children:(0,l.jsx)(c,{})})}function m(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(r,{}),(0,l.jsx)(h,{...e})]})}},8824:(e,n,t)=>{t.d(n,{c:()=>r});var i=t(7294),s=t(2263);const o=["zero","one","two","few","many","other"];function l(e){return o.filter((n=>e.includes(n)))}const a={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function c(){const{i18n:{currentLocale:e}}=(0,s.Z)();return(0,i.useMemo)((()=>{try{return function(e){const n=new Intl.PluralRules(e);return{locale:e,pluralForms:l(n.resolvedOptions().pluralCategories),select:e=>n.select(e)}}(e)}catch(n){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${n.message}\n`),a}}),[e])}function r(){const e=c();return{selectMessage:(n,t)=>function(e,n,t){const i=e.split("|");if(1===i.length)return i[0];i.length>t.pluralForms.length&&console.error(`For locale=${t.locale}, a maximum of ${t.pluralForms.length} plural forms are expected (${t.pluralForms.join(",")}), but the message contains ${i.length}: ${e}`);const s=t.select(n),o=t.pluralForms.indexOf(s);return i[Math.min(o,i.length-1)]}(t,n,e)}}}}]); \ No newline at end of file diff --git a/assets/js/df203c0f.8ad14275.js b/assets/js/df203c0f.8ad14275.js deleted file mode 100644 index 3c81d46b1..000000000 --- a/assets/js/df203c0f.8ad14275.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9924],{491:(e,t,l)=>{l.r(t),l.d(t,{default:()=>d});var a=l(7294),n=l(6010),r=l(9960),c=l(8824),s=l(833),o=l(5281),i=l(5999),u=l(8888),g=l(197);function m(e){let{doc:t}=e;return a.createElement("article",{className:"margin-vert--lg"},a.createElement(r.Z,{to:t.permalink},a.createElement("h2",null,t.title)),t.description&&a.createElement("p",null,t.description))}function d(e){let{tag:t}=e;const l=function(){const{selectMessage:e}=(0,c.c)();return t=>e(t,(0,i.I)({id:"theme.docs.tagDocListPageTitle.nDocsTagged",description:'Pluralized label for "{count} docs tagged". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One doc tagged|{count} docs tagged"},{count:t}))}(),d=(0,i.I)({id:"theme.docs.tagDocListPageTitle",description:"The title of the page for a docs tag",message:'{nDocsTagged} with "{tagName}"'},{nDocsTagged:l(t.count),tagName:t.label});return a.createElement(s.FG,{className:(0,n.Z)(o.k.wrapper.docsPages,o.k.page.docsTagDocListPage)},a.createElement(s.d,{title:d}),a.createElement(g.Z,{tag:"doc_tag_doc_list"}),a.createElement(u.Z,null,a.createElement("div",{className:"container margin-vert--lg"},a.createElement("div",{className:"row"},a.createElement("main",{className:"col col--8 col--offset-2"},a.createElement("header",{className:"margin-bottom--xl"},a.createElement("h1",null,d),a.createElement(r.Z,{href:t.allTagsPath},a.createElement(i.Z,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page"},"View All Tags"))),a.createElement("section",{className:"margin-vert--lg"},t.items.map((e=>a.createElement(m,{key:e.id,doc:e})))))))))}},8824:(e,t,l)=>{l.d(t,{c:()=>i});var a=l(7294),n=l(2263);const r=["zero","one","two","few","many","other"];function c(e){return r.filter((t=>e.includes(t)))}const s={locale:"en",pluralForms:c(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.Z)();return(0,a.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:c(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),s}}),[e])}function i(){const e=o();return{selectMessage:(t,l)=>function(e,t,l){const a=e.split("|");if(1===a.length)return a[0];a.length>l.pluralForms.length&&console.error(`For locale=${l.locale}, a maximum of ${l.pluralForms.length} plural forms are expected (${l.pluralForms.join(",")}), but the message contains ${a.length}: ${e}`);const n=l.select(t),r=l.pluralForms.indexOf(n);return a[Math.min(r,a.length-1)]}(l,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/e331fbd7.8617ba2c.js b/assets/js/e331fbd7.29ba16bf.js similarity index 81% rename from assets/js/e331fbd7.8617ba2c.js rename to assets/js/e331fbd7.29ba16bf.js index b870ac401..8ef638a55 100644 --- a/assets/js/e331fbd7.8617ba2c.js +++ b/assets/js/e331fbd7.29ba16bf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9995],{7568:e=>{e.exports=JSON.parse('{"label":"permissionless","permalink":"/docs/tags/permissionless","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9995],{7568:e=>{e.exports=JSON.parse('{"label":"permissionless","permalink":"/docs/tags/permissionless","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/e6a08407.1751bc14.js b/assets/js/e6a08407.9629e8eb.js similarity index 85% rename from assets/js/e6a08407.1751bc14.js rename to assets/js/e6a08407.9629e8eb.js index 55f455e2a..b28cb9226 100644 --- a/assets/js/e6a08407.1751bc14.js +++ b/assets/js/e6a08407.9629e8eb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2450],{607:e=>{e.exports=JSON.parse('{"label":"container","permalink":"/references/tags/container","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[2450],{607:e=>{e.exports=JSON.parse('{"label":"container","permalink":"/references/tags/container","allTagsPath":"/references/tags","count":2,"items":[{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","permalink":"/references/Docker/build-and-run-in-docker"},{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","permalink":"/references/Docker/uninstall-docker-setup"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/e91f52c1.e63d5f81.js b/assets/js/e91f52c1.d3ff2d82.js similarity index 85% rename from assets/js/e91f52c1.e63d5f81.js rename to assets/js/e91f52c1.d3ff2d82.js index c2210eee7..5f9de7950 100644 --- a/assets/js/e91f52c1.e63d5f81.js +++ b/assets/js/e91f52c1.d3ff2d82.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7091],{5393:e=>{e.exports=JSON.parse('{"label":"process","permalink":"/references/tags/process","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7091],{5393:e=>{e.exports=JSON.parse('{"label":"process","permalink":"/references/tags/process","allTagsPath":"/references/tags","count":1,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ec98ad91.08a89d13.js b/assets/js/ec98ad91.f6dcd324.js similarity index 84% rename from assets/js/ec98ad91.08a89d13.js rename to assets/js/ec98ad91.f6dcd324.js index 8333e1da9..9c7e0a616 100644 --- a/assets/js/ec98ad91.08a89d13.js +++ b/assets/js/ec98ad91.f6dcd324.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4034],{1323:e=>{e.exports=JSON.parse('{"label":"testnet","permalink":"/docs/tags/testnet","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4034],{1323:e=>{e.exports=JSON.parse('{"label":"testnet","permalink":"/docs/tags/testnet","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ecfddbd4.21bb1ad5.js b/assets/js/ecfddbd4.21bb1ad5.js new file mode 100644 index 000000000..c555faeb9 --- /dev/null +++ b/assets/js/ecfddbd4.21bb1ad5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7804],{9893:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var n=o(5893),r=o(1151);const s={draft:!1,title:"Open-source",date:new Date("2023-01-10T09:00:00.000Z"),description:"Fleek Network's codebase.",category:"Documentation",keywords:["whitepaper"],tags:["Open source","Codebase","Fleek Network","Edge Network"]},i=void 0,c={id:"Open-source",title:"Open-source",description:"Fleek Network's codebase.",source:"@site/docs/Open-source.md",sourceDirName:".",slug:"/Open-source",permalink:"/docs/Open-source",draft:!1,unlisted:!1,tags:[{label:"Open source",permalink:"/docs/tags/open-source"},{label:"Codebase",permalink:"/docs/tags/codebase"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"},{label:"Edge Network",permalink:"/docs/tags/edge-network"}],version:"current",frontMatter:{draft:!1,title:"Open-source",date:"2023-01-10T09:00:00.000Z",description:"Fleek Network's codebase.",category:"Documentation",keywords:["whitepaper"],tags:["Open source","Codebase","Fleek Network","Edge Network"]}},a={},l=[];function d(e){const t={a:"a",li:"li",ol:"ol",p:"p",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Fleek Network's codebase and libraries are fully open-source, and reviews/feedback is welcome. The codebase today is experimental and contributions will be ramped up towards the testnet release."}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://github.com/fleek-network/",children:"Find all our repositories on Github"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/",children:"Review the Lightning core repository"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/blob/main/CONTRIBUTING.md",children:"Read our Contribution Guidelines"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/blob/main/CODE_OF_CONDUCT.md",children:"As well as our Code of Conduct"})}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://discord.gg/fleekxyz",children:"Ask questions to the team on Discord"})}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},1151:(e,t,o)=>{o.d(t,{Z:()=>c,a:()=>i});var n=o(7294);const r={},s=n.createContext(r);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ecfddbd4.f15998ec.js b/assets/js/ecfddbd4.f15998ec.js deleted file mode 100644 index 723b2c058..000000000 --- a/assets/js/ecfddbd4.f15998ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7804],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),s=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=s(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=s(r),f=o,m=u["".concat(c,".").concat(f)]||u[f]||d[f]||a;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l[u]="string"==typeof e?e:o,i[1]=l;for(var s=2;s<a;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},3317:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var n=r(7462),o=(r(7294),r(3905));const a={draft:!1,title:"Open-source",date:new Date("2023-01-10T09:00:00.000Z"),description:"Fleek Network's codebase.",category:"Documentation",keywords:["whitepaper"],tags:["Open source","Codebase","Fleek Network","Edge Network"]},i=void 0,l={unversionedId:"Open-source",id:"Open-source",title:"Open-source",description:"Fleek Network's codebase.",source:"@site/docs/Open-source.md",sourceDirName:".",slug:"/Open-source",permalink:"/docs/Open-source",draft:!1,tags:[{label:"Open source",permalink:"/docs/tags/open-source"},{label:"Codebase",permalink:"/docs/tags/codebase"},{label:"Fleek Network",permalink:"/docs/tags/fleek-network"},{label:"Edge Network",permalink:"/docs/tags/edge-network"}],version:"current",frontMatter:{draft:!1,title:"Open-source",date:"2023-01-10T09:00:00.000Z",description:"Fleek Network's codebase.",category:"Documentation",keywords:["whitepaper"],tags:["Open source","Codebase","Fleek Network","Edge Network"]}},c={},s=[],p={toc:s},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Fleek Network's codebase and libraries are fully open-source, and reviews/feedback is welcome. The codebase today is experimental and contributions will be ramped up towards the testnet release."),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/"},"Find all our repositories on Github")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/"},"Review the Lightning core repository")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/blob/main/CONTRIBUTING.md"},"Read our Contribution Guidelines")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/blob/main/CODE_OF_CONDUCT.md"},"As well as our Code of Conduct")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://discord.gg/fleekxyz"},"Ask questions to the team on Discord"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f02c0d6e.a8b752d8.js b/assets/js/f02c0d6e.a68a515b.js similarity index 89% rename from assets/js/f02c0d6e.a8b752d8.js rename to assets/js/f02c0d6e.a68a515b.js index 86ee015c1..ae2d8ccfe 100644 --- a/assets/js/f02c0d6e.a8b752d8.js +++ b/assets/js/f02c0d6e.a68a515b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3707],{3422:e=>{e.exports=JSON.parse('{"label":"tokenomics","permalink":"/docs/tags/tokenomics","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3707],{3422:e=>{e.exports=JSON.parse('{"label":"tokenomics","permalink":"/docs/tags/tokenomics","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/token-and-economics","title":"Token and economics","description":"Explore the preliminary breakdown of the Fleek Network\'s FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.","permalink":"/docs/learn/token-and-economics"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/f3d7f34e.36b0c123.js b/assets/js/f3d7f34e.36b0c123.js new file mode 100644 index 000000000..d9a8257e4 --- /dev/null +++ b/assets/js/f3d7f34e.36b0c123.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[982],{9299:e=>{e.exports=JSON.parse('{"pluginId":"references","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"defaultSidebar":[{"type":"link","label":"About references","href":"/references/","docId":"index","unlisted":false},{"type":"category","label":"Docker","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Build and run in Docker","href":"/references/Docker/build-and-run-in-docker","docId":"Docker/build-and-run-in-docker","unlisted":false},{"type":"link","label":"Frequently used commands for Docker setup","href":"/references/Docker/frequently-used-commands-for-docker-setup","docId":"Docker/frequently-used-commands-for-docker-setup","unlisted":false},{"type":"link","label":"Uninstall Docker Setup","href":"/references/Docker/uninstall-docker-setup","docId":"Docker/uninstall-docker-setup","unlisted":false}]},{"type":"category","label":"Lightning CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Error building on ARM64","href":"/references/Lightning CLI/error-building-on-arm64","docId":"Lightning CLI/error-building-on-arm64","unlisted":false},{"type":"link","label":"Error linking with cc","href":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1","docId":"Lightning CLI/error-linking-with-cc-failed","unlisted":false},{"type":"link","label":"File permissions and Ownership","href":"/references/Lightning CLI/file-permissions-and-ownership","docId":"Lightning CLI/file-permissions-and-ownership","unlisted":false},{"type":"link","label":"Frequently used commands for Native setup","href":"/references/Lightning CLI/frequently-used-commands-for-native-setup","docId":"Lightning CLI/frequently-used-commands-for-native-setup","unlisted":false},{"type":"link","label":"Keys not found","href":"/references/Lightning CLI/keys-not-found","docId":"Lightning CLI/keys-not-found","unlisted":false},{"type":"link","label":"Backing up the keystore","href":"/references/Lightning CLI/backing-up-the-keystore","docId":"Lightning CLI/keystore-backup","unlisted":false},{"type":"link","label":"Node secret key does not exist","href":"/references/Lightning CLI/node-secret-key-does-not-exist","docId":"Lightning CLI/node-secret-key-does-not-exist","unlisted":false},{"type":"link","label":"Permission denied (os error 13)","href":"/references/Lightning CLI/permission-denied-os-error-13","docId":"Lightning CLI/permission-denied-os-error-13","unlisted":false},{"type":"link","label":"Restore the keystore","href":"/references/Lightning CLI/restore-the-keystore","docId":"Lightning CLI/restore-keystore","unlisted":false},{"type":"link","label":"Uninstall Lightning Node","href":"/references/Lightning CLI/uninstall-lightning-node","docId":"Lightning CLI/uninstall-lightning-node","unlisted":false},{"type":"link","label":"Update CLI from source code","href":"/references/Lightning CLI/update-cli-from-source-code","docId":"Lightning CLI/update-cli-from-source-code","unlisted":false}]},{"type":"category","label":"Systemd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Service keeps running after shutdown","href":"/references/Systemd/service-keeps-running-after-shutdown","docId":"Systemd/service-keeps-running-after-shutdown","unlisted":false},{"type":"link","label":"Shutting down persistance","href":"/references/Systemd/shutting-down-persistance","docId":"Systemd/shutting-down-persistance","unlisted":false},{"type":"link","label":"User service","href":"/references/Systemd/user-service","docId":"Systemd/user-service","unlisted":false}]}]},"docs":{"Docker/build-and-run-in-docker":{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","sidebar":"defaultSidebar"},"Docker/frequently-used-commands-for-docker-setup":{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","sidebar":"defaultSidebar"},"Docker/uninstall-docker-setup":{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","sidebar":"defaultSidebar"},"index":{"id":"index","title":"About references","description":"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.","sidebar":"defaultSidebar"},"Lightning CLI/error-building-on-arm64":{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","sidebar":"defaultSidebar"},"Lightning CLI/error-linking-with-cc-failed":{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","sidebar":"defaultSidebar"},"Lightning CLI/file-permissions-and-ownership":{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","sidebar":"defaultSidebar"},"Lightning CLI/frequently-used-commands-for-native-setup":{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","sidebar":"defaultSidebar"},"Lightning CLI/keys-not-found":{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","sidebar":"defaultSidebar"},"Lightning CLI/keystore-backup":{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","sidebar":"defaultSidebar"},"Lightning CLI/node-secret-key-does-not-exist":{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","sidebar":"defaultSidebar"},"Lightning CLI/permission-denied-os-error-13":{"id":"Lightning CLI/permission-denied-os-error-13","title":"Permission denied (os error 13)","description":"Ownership and file permissions","sidebar":"defaultSidebar"},"Lightning CLI/restore-keystore":{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","sidebar":"defaultSidebar"},"Lightning CLI/uninstall-lightning-node":{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","sidebar":"defaultSidebar"},"Lightning CLI/update-cli-from-source-code":{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","sidebar":"defaultSidebar"},"Systemd/service-keeps-running-after-shutdown":{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","sidebar":"defaultSidebar"},"Systemd/shutting-down-persistance":{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","sidebar":"defaultSidebar"},"Systemd/user-service":{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","sidebar":"defaultSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/f3d7f34e.da24e3c4.js b/assets/js/f3d7f34e.da24e3c4.js deleted file mode 100644 index 7050d371f..000000000 --- a/assets/js/f3d7f34e.da24e3c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[982],{9299:e=>{e.exports=JSON.parse('{"pluginId":"references","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"defaultSidebar":[{"type":"link","label":"About references","href":"/references/","docId":"index"},{"type":"category","label":"Docker","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Build and run in Docker","href":"/references/Docker/build-and-run-in-docker","docId":"Docker/build-and-run-in-docker"},{"type":"link","label":"Frequently used commands for Docker setup","href":"/references/Docker/frequently-used-commands-for-docker-setup","docId":"Docker/frequently-used-commands-for-docker-setup"},{"type":"link","label":"Uninstall Docker Setup","href":"/references/Docker/uninstall-docker-setup","docId":"Docker/uninstall-docker-setup"}]},{"type":"category","label":"Lightning CLI","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Error building on ARM64","href":"/references/Lightning CLI/error-building-on-arm64","docId":"Lightning CLI/error-building-on-arm64"},{"type":"link","label":"Error linking with cc","href":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1","docId":"Lightning CLI/error-linking-with-cc-failed"},{"type":"link","label":"File permissions and Ownership","href":"/references/Lightning CLI/file-permissions-and-ownership","docId":"Lightning CLI/file-permissions-and-ownership"},{"type":"link","label":"Frequently used commands for Native setup","href":"/references/Lightning CLI/frequently-used-commands-for-native-setup","docId":"Lightning CLI/frequently-used-commands-for-native-setup"},{"type":"link","label":"Keys not found","href":"/references/Lightning CLI/keys-not-found","docId":"Lightning CLI/keys-not-found"},{"type":"link","label":"Backing up the keystore","href":"/references/Lightning CLI/backing-up-the-keystore","docId":"Lightning CLI/keystore-backup"},{"type":"link","label":"Node secret key does not exist","href":"/references/Lightning CLI/node-secret-key-does-not-exist","docId":"Lightning CLI/node-secret-key-does-not-exist"},{"type":"link","label":"Permission denied (os error 13)","href":"/references/Lightning CLI/permission-denied-os-error-13","docId":"Lightning CLI/permission-denied-os-error-13"},{"type":"link","label":"Restore the keystore","href":"/references/Lightning CLI/restore-the-keystore","docId":"Lightning CLI/restore-keystore"},{"type":"link","label":"Uninstall Lightning Node","href":"/references/Lightning CLI/uninstall-lightning-node","docId":"Lightning CLI/uninstall-lightning-node"},{"type":"link","label":"Update CLI from source code","href":"/references/Lightning CLI/update-cli-from-source-code","docId":"Lightning CLI/update-cli-from-source-code"}]},{"type":"category","label":"Systemd","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Service keeps running after shutdown","href":"/references/Systemd/service-keeps-running-after-shutdown","docId":"Systemd/service-keeps-running-after-shutdown"},{"type":"link","label":"Shutting down persistance","href":"/references/Systemd/shutting-down-persistance","docId":"Systemd/shutting-down-persistance"},{"type":"link","label":"User service","href":"/references/Systemd/user-service","docId":"Systemd/user-service"}]}]},"docs":{"Docker/build-and-run-in-docker":{"id":"Docker/build-and-run-in-docker","title":"Build and run in Docker","description":"Clone the source code locally","sidebar":"defaultSidebar"},"Docker/frequently-used-commands-for-docker-setup":{"id":"Docker/frequently-used-commands-for-docker-setup","title":"Frequently used commands for Docker setup","description":"TL;DR","sidebar":"defaultSidebar"},"Docker/uninstall-docker-setup":{"id":"Docker/uninstall-docker-setup","title":"Uninstall Docker Setup","description":"Remove the source code locally","sidebar":"defaultSidebar"},"index":{"id":"index","title":"About references","description":"The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.","sidebar":"defaultSidebar"},"Lightning CLI/error-building-on-arm64":{"id":"Lightning CLI/error-building-on-arm64","title":"Error building on ARM64","description":"Building on the ARM64 (aarch64)","sidebar":"defaultSidebar"},"Lightning CLI/error-linking-with-cc-failed":{"id":"Lightning CLI/error-linking-with-cc-failed","title":"Error linking with cc","description":"Check if CPU is supported","sidebar":"defaultSidebar"},"Lightning CLI/file-permissions-and-ownership":{"id":"Lightning CLI/file-permissions-and-ownership","title":"File permissions and Ownership","description":"Ownership","sidebar":"defaultSidebar"},"Lightning CLI/frequently-used-commands-for-native-setup":{"id":"Lightning CLI/frequently-used-commands-for-native-setup","title":"Frequently used commands for Native setup","description":"TL;DR","sidebar":"defaultSidebar"},"Lightning CLI/keys-not-found":{"id":"Lightning CLI/keys-not-found","title":"Keys not found","description":"Node key does not exist","sidebar":"defaultSidebar"},"Lightning CLI/keystore-backup":{"id":"Lightning CLI/keystore-backup","title":"Backing up the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","sidebar":"defaultSidebar"},"Lightning CLI/node-secret-key-does-not-exist":{"id":"Lightning CLI/node-secret-key-does-not-exist","title":"Node secret key does not exist","description":"Node secret key does not exist","sidebar":"defaultSidebar"},"Lightning CLI/permission-denied-os-error-13":{"id":"Lightning CLI/permission-denied-os-error-13","title":"Permission denied (os error 13)","description":"Ownership and file permissions","sidebar":"defaultSidebar"},"Lightning CLI/restore-keystore":{"id":"Lightning CLI/restore-keystore","title":"Restore the keystore","description":"The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn\'t endorse any methods of encryption and storage, the methods described here are for educational purposes only.","sidebar":"defaultSidebar"},"Lightning CLI/uninstall-lightning-node":{"id":"Lightning CLI/uninstall-lightning-node","title":"Uninstall Lightning Node","description":"Remove symLink","sidebar":"defaultSidebar"},"Lightning CLI/update-cli-from-source-code":{"id":"Lightning CLI/update-cli-from-source-code","title":"Update CLI from source code","description":"Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:","sidebar":"defaultSidebar"},"Systemd/service-keeps-running-after-shutdown":{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","sidebar":"defaultSidebar"},"Systemd/shutting-down-persistance":{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","sidebar":"defaultSidebar"},"Systemd/user-service":{"id":"Systemd/user-service","title":"User service","description":"A user should have the ability to run a Systemd user service unit without having to use sudo to control it.","sidebar":"defaultSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/f3f8ecb0.4317feec.js b/assets/js/f3f8ecb0.4317feec.js new file mode 100644 index 000000000..c5dac454f --- /dev/null +++ b/assets/js/f3f8ecb0.4317feec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6939],{2200:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>c,metadata:()=>i,toc:()=>l});var o=n(5893),r=n(1151);const c={title:"Service development",slug:"service-development",hide_title:!0},s=void 0,i={id:"develop/service-development",title:"Service development",description:"",source:"@site/docs/develop/service-development.md",sourceDirName:"develop",slug:"/develop/service-development",permalink:"/docs/develop/service-development",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Service development",slug:"service-development",hide_title:!0}},d={},l=[];function v(e){return(0,o.jsx)(o.Fragment,{})}function p(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(v,{...e})}):v()}},1151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>s});var o=n(7294);const r={},c=o.createContext(r);function s(e){const t=o.useContext(c);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f3f8ecb0.c4976496.js b/assets/js/f3f8ecb0.c4976496.js deleted file mode 100644 index 08c6eb236..000000000 --- a/assets/js/f3f8ecb0.c4976496.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6939],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function l(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var a=n.createContext({}),p=function(e){var t=n.useContext(a),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(a.Provider,{value:t},e.children)},s="mdxType",v={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,c=e.originalType,a=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),s=p(r),d=o,f=s["".concat(a,".").concat(d)]||s[d]||v[d]||c;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var c=r.length,i=new Array(c);i[0]=d;var l={};for(var a in t)hasOwnProperty.call(t,a)&&(l[a]=t[a]);l.originalType=e,l[s]="string"==typeof e?e:o,i[1]=l;for(var p=2;p<c;p++)i[p]=r[p];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},2854:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>v,frontMatter:()=>c,metadata:()=>l,toc:()=>p});var n=r(7462),o=(r(7294),r(3905));const c={title:"Service development",slug:"service-development",hide_title:!0},i=void 0,l={unversionedId:"develop/service-development",id:"develop/service-development",title:"Service development",description:"",source:"@site/docs/develop/service-development.md",sourceDirName:"develop",slug:"/develop/service-development",permalink:"/docs/develop/service-development",draft:!1,tags:[],version:"current",frontMatter:{title:"Service development",slug:"service-development",hide_title:!0}},a={},p=[],u={toc:p},s="wrapper";function v(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}))}v.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f41bce02.82543bf2.js b/assets/js/f41bce02.7f0e4028.js similarity index 82% rename from assets/js/f41bce02.82543bf2.js rename to assets/js/f41bce02.7f0e4028.js index 73cfb3837..4f031a2f8 100644 --- a/assets/js/f41bce02.82543bf2.js +++ b/assets/js/f41bce02.7f0e4028.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3719],{4729:e=>{e.exports=JSON.parse('{"label":"docker","permalink":"/guides/tags/docker","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","permalink":"/guides/Node Operators/running-a-node-in-docker"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3719],{4729:e=>{e.exports=JSON.parse('{"label":"docker","permalink":"/guides/tags/docker","allTagsPath":"/guides/tags","count":1,"items":[{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","permalink":"/guides/Node Operators/running-a-node-in-docker"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/f4fd4511.1869451f.js b/assets/js/f4fd4511.35512f65.js similarity index 84% rename from assets/js/f4fd4511.1869451f.js rename to assets/js/f4fd4511.35512f65.js index 3ab3ba92c..65a18ee34 100644 --- a/assets/js/f4fd4511.1869451f.js +++ b/assets/js/f4fd4511.35512f65.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6461],{6514:e=>{e.exports=JSON.parse('{"label":"phases","permalink":"/docs/tags/phases","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6461],{6514:e=>{e.exports=JSON.parse('{"label":"phases","permalink":"/docs/tags/phases","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/testnet-onboarding","title":"Testnet onboarding","description":"Join Fleek\'s Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.","permalink":"/docs/node/testnet-onboarding"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/f50a4147.0bd0271c.js b/assets/js/f50a4147.0bd0271c.js new file mode 100644 index 000000000..6ba7ddf9b --- /dev/null +++ b/assets/js/f50a4147.0bd0271c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4888],{8810:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=n(5893),o=n(1151);const s={draft:!1,title:"Contributing",date:new Date("2023-01-15T09:00:00.000Z"),description:"Contributing",category:"Documentation",keywords:["contributing"],tags:["git","repository","contribute","open source"]},r="Contributing to Lightning",a={id:"Open-source/contributing",title:"Contributing",description:"Contributing",source:"@site/docs/Open-source/contributing.md",sourceDirName:"Open-source",slug:"/Open-source/contributing",permalink:"/docs/Open-source/contributing",draft:!1,unlisted:!1,tags:[{label:"git",permalink:"/docs/tags/git"},{label:"repository",permalink:"/docs/tags/repository"},{label:"contribute",permalink:"/docs/tags/contribute"},{label:"open source",permalink:"/docs/tags/open-source"}],version:"current",frontMatter:{draft:!1,title:"Contributing",date:"2023-01-15T09:00:00.000Z",description:"Contributing",category:"Documentation",keywords:["contributing"],tags:["git","repository","contribute","open source"]},sidebar:"docs",previous:{title:"Code of Conduct",permalink:"/docs/Open-source/code-of-conduct"},next:{title:"Repositories",permalink:"/docs/Open-source/repositories"}},l={},c=[{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"I Have a Question",id:"i-have-a-question",level:2},{value:"I Want To Contribute",id:"i-want-to-contribute",level:2},{value:"Reporting Bugs",id:"reporting-bugs",level:3},{value:"Before Submitting a Bug Report",id:"before-submitting-a-bug-report",level:4},{value:"How Do I Submit a Good Bug Report?",id:"how-do-i-submit-a-good-bug-report",level:4},{value:"Suggesting Enhancements",id:"suggesting-enhancements",level:3},{value:"Before Submitting an Enhancement",id:"before-submitting-an-enhancement",level:4},{value:"How Do I Submit a Good Enhancement Suggestion?",id:"how-do-i-submit-a-good-enhancement-suggestion",level:4},{value:"Workflow",id:"workflow",level:2},{value:"Join The Project Team",id:"join-the-project-team",level:2},{value:"Attribution",id:"attribution",level:2}];function h(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.h1,{id:"contributing-to-lightning",children:"Contributing to Lightning"}),"\n",(0,i.jsx)(t.p,{children:"First off, thanks for taking the time to contribute!"}),"\n",(0,i.jsx)(t.p,{children:"All types of contributions are encouraged and valued. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions."}),"\n",(0,i.jsxs)(t.admonition,{type:"info",children:[(0,i.jsx)(t.p,{children:"If you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:"}),(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Star the project"}),"\n",(0,i.jsx)(t.li,{children:"Tweet about it"}),"\n",(0,i.jsx)(t.li,{children:"Refer this project in your project's readme"}),"\n",(0,i.jsx)(t.li,{children:"Mention the project at local meetups and tell your friends/colleagues"}),"\n"]})]}),"\n",(0,i.jsx)(t.h2,{id:"code-of-conduct",children:"Code of Conduct"}),"\n",(0,i.jsxs)(t.p,{children:["This project and everyone participating in it is governed by the\n",(0,i.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/blob/master/CODE_OF_CONDUCT.md",children:"Lightning Code of Conduct"}),".\nBy participating, you are expected to uphold this code. Please report unacceptable behavior to the team via our Discord."]}),"\n",(0,i.jsx)(t.h2,{id:"i-have-a-question",children:"I Have a Question"}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsxs)(t.p,{children:["If you want to ask a question, we assume that you have read the available ",(0,i.jsx)(t.a,{href:"https://docs.fleek.network",children:"Documentation"}),"."]})}),"\n",(0,i.jsxs)(t.p,{children:["Before you ask a question, it is best to search for existing ",(0,i.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/issues",children:"Issues"})," that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first."]}),"\n",(0,i.jsx)(t.p,{children:"If you then still feel the need to ask a question and need clarification, we recommend the following:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Open an ",(0,i.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/issues/new",children:"Issue"}),"."]}),"\n",(0,i.jsx)(t.li,{children:"Provide as much context as you can about what you're running into."}),"\n",(0,i.jsx)(t.li,{children:"Provide project and platform versions (rust, cargo, etc), depending on what seems relevant."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"We will then take care of the issue as soon as possible."}),"\n",(0,i.jsx)(t.h2,{id:"i-want-to-contribute",children:"I Want To Contribute"}),"\n",(0,i.jsx)(t.admonition,{title:"Legal Notice",type:"info",children:(0,i.jsx)(t.p,{children:"When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license."})}),"\n",(0,i.jsx)(t.h3,{id:"reporting-bugs",children:"Reporting Bugs"}),"\n",(0,i.jsx)(t.h4,{id:"before-submitting-a-bug-report",children:"Before Submitting a Bug Report"}),"\n",(0,i.jsx)(t.p,{children:"A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Make sure that you are using the latest version."}),"\n",(0,i.jsxs)(t.li,{children:["Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the ",(0,i.jsx)(t.a,{href:"https://docs.fleek.network",children:"documentation"}),". If you are looking for support, you might want to check ",(0,i.jsx)(t.a,{href:"#i-have-a-question",children:"this section"}),")."]}),"\n",(0,i.jsxs)(t.li,{children:["To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the ",(0,i.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/issues?q=label%3Abug",children:"bug tracker"}),"."]}),"\n",(0,i.jsx)(t.li,{children:"Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue."}),"\n",(0,i.jsxs)(t.li,{children:["Collect information about the bug:","\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Stack trace (Traceback)"}),"\n",(0,i.jsx)(t.li,{children:"OS, Platform and Version (Linux, macOS, x86, ARM)"}),"\n",(0,i.jsx)(t.li,{children:"Version of the compiler, SDK, runtime environment, package manager, depending on what seems relevant."}),"\n",(0,i.jsx)(t.li,{children:"Possibly your input and the output"}),"\n",(0,i.jsx)(t.li,{children:"Can you reliably reproduce the issue? And can you also reproduce it with older versions?"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h4,{id:"how-do-i-submit-a-good-bug-report",children:"How Do I Submit a Good Bug Report?"}),"\n",(0,i.jsx)(t.admonition,{type:"info",children:(0,i.jsx)(t.p,{children:"You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to the team\u2013request it through Discord."})}),"\n",(0,i.jsx)(t.p,{children:"If you run into an issue with the project:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Open an ",(0,i.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/issues/new",children:"Issue"}),". (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)"]}),"\n",(0,i.jsx)(t.li,{children:"Explain the behavior you would expect and the actual behavior."}),"\n",(0,i.jsxs)(t.li,{children:["Please provide as much context as possible and describe the ",(0,i.jsx)(t.em,{children:"reproduction steps"})," that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case."]}),"\n",(0,i.jsx)(t.li,{children:"Provide the information you collected in the previous section."}),"\n"]}),"\n",(0,i.jsx)(t.p,{children:"Once it's filed:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"The project team will label the issue accordingly."}),"\n",(0,i.jsxs)(t.li,{children:["A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as ",(0,i.jsx)(t.code,{children:"needs-repro"}),". Bugs with the ",(0,i.jsx)(t.code,{children:"needs-repro"})," tag will not be addressed until they are reproduced."]}),"\n",(0,i.jsxs)(t.li,{children:["If the team is able to reproduce the issue, it will be marked ",(0,i.jsx)(t.code,{children:"needs-fix"}),", as well as possibly other tags (such as ",(0,i.jsx)(t.code,{children:"critical"}),"), and the issue will be left to be ",(0,i.jsx)(t.a,{href:"#your-first-code-contribution",children:"implemented by someone"}),"."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"suggesting-enhancements",children:"Suggesting Enhancements"}),"\n",(0,i.jsxs)(t.p,{children:["This section guides you through submitting an enhancement suggestion for Lightning, ",(0,i.jsx)(t.strong,{children:"including completely new features and minor improvements to existing functionality"}),". Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions."]}),"\n",(0,i.jsx)(t.h4,{id:"before-submitting-an-enhancement",children:"Before Submitting an Enhancement"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Make sure that you are using the latest version."}),"\n",(0,i.jsxs)(t.li,{children:["Read the ",(0,i.jsx)(t.a,{href:"https://docs.fleek.network",children:"documentation"})," carefully and find out if the functionality is already covered, maybe by an individual configuration."]}),"\n",(0,i.jsxs)(t.li,{children:["Perform a ",(0,i.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/issues",children:"search"})," to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one."]}),"\n",(0,i.jsx)(t.li,{children:"Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library."}),"\n"]}),"\n",(0,i.jsx)(t.h4,{id:"how-do-i-submit-a-good-enhancement-suggestion",children:"How Do I Submit a Good Enhancement Suggestion?"}),"\n",(0,i.jsxs)(t.p,{children:["Enhancement suggestions are tracked as ",(0,i.jsx)(t.a,{href:"https://github.com/fleek-network/lightning/issues",children:"GitHub issues"}),"."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Use a ",(0,i.jsx)(t.strong,{children:"clear and descriptive title"})," for the issue to identify the suggestion."]}),"\n",(0,i.jsxs)(t.li,{children:["Provide a ",(0,i.jsx)(t.strong,{children:"step-by-step description of the suggested enhancement"})," in as many details as possible."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Describe the current behavior"})," and ",(0,i.jsx)(t.strong,{children:"explain which behavior you expected to see instead"})," and why. At this point you can also tell which alternatives do not work for you."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"Explain why this enhancement would be useful"})," to most Lightning users. You may also want to point out the other projects that solved it better and which could serve as inspiration."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"workflow",children:"Workflow"}),"\n",(0,i.jsxs)(t.p,{children:["The project is under heavy development to release the first version of the node and launch the testnet. Until then, the core team will be working from the ",(0,i.jsx)(t.code,{children:"main"})," branch. PRs will be reviewed and treated case by case but the core team will commit directly to main for now."]}),"\n",(0,i.jsx)(t.h2,{id:"join-the-project-team",children:"Join The Project Team"}),"\n",(0,i.jsxs)(t.p,{children:["Please visit our ",(0,i.jsx)(t.a,{href:"https://discord.gg/fleekxyz",children:"Discord"})," to get in touch with us."]}),"\n",(0,i.jsx)(t.h2,{id:"attribution",children:"Attribution"}),"\n",(0,i.jsxs)(t.p,{children:["This guide is based on the ",(0,i.jsx)(t.strong,{children:"contributing-gen"}),". ",(0,i.jsx)(t.a,{href:"https://github.com/bttger/contributing-gen",children:"Make your own"}),"!"]})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>r});var i=n(7294);const o={},s=i.createContext(o);function r(e){const t=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f50a4147.103a0c55.js b/assets/js/f50a4147.103a0c55.js deleted file mode 100644 index 4bbb97a0b..000000000 --- a/assets/js/f50a4147.103a0c55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4888],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var o=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,o,i=function(e,t){if(null==e)return{};var n,o,i={},a=Object.keys(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var u=o.createContext({}),l=function(e){var t=o.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=l(e.components);return o.createElement(u.Provider,{value:t},e.children)},p="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,u=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=l(n),d=i,m=p["".concat(u,".").concat(d)]||p[d]||h[d]||a;return n?o.createElement(m,r(r({ref:t},c),{},{components:n})):o.createElement(m,r({ref:t},c))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,r=new Array(a);r[0]=d;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:i,r[1]=s;for(var l=2;l<a;l++)r[l]=n[l];return o.createElement.apply(null,r)}return o.createElement.apply(null,n)}d.displayName="MDXCreateElement"},260:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=n(7462),i=(n(7294),n(3905));const a={draft:!1,title:"Contributing",date:new Date("2023-01-15T09:00:00.000Z"),description:"Contributing",category:"Documentation",keywords:["contributing"],tags:["git","repository","contribute","open source"]},r="Contributing to Lightning",s={unversionedId:"Open-source/contributing",id:"Open-source/contributing",title:"Contributing",description:"Contributing",source:"@site/docs/Open-source/contributing.md",sourceDirName:"Open-source",slug:"/Open-source/contributing",permalink:"/docs/Open-source/contributing",draft:!1,tags:[{label:"git",permalink:"/docs/tags/git"},{label:"repository",permalink:"/docs/tags/repository"},{label:"contribute",permalink:"/docs/tags/contribute"},{label:"open source",permalink:"/docs/tags/open-source"}],version:"current",frontMatter:{draft:!1,title:"Contributing",date:"2023-01-15T09:00:00.000Z",description:"Contributing",category:"Documentation",keywords:["contributing"],tags:["git","repository","contribute","open source"]},sidebar:"docs",previous:{title:"Code of Conduct",permalink:"/docs/Open-source/code-of-conduct"},next:{title:"Repositories",permalink:"/docs/Open-source/repositories"}},u={},l=[{value:"Code of Conduct",id:"code-of-conduct",level:2},{value:"I Have a Question",id:"i-have-a-question",level:2},{value:"I Want To Contribute",id:"i-want-to-contribute",level:2},{value:"Reporting Bugs",id:"reporting-bugs",level:3},{value:"Before Submitting a Bug Report",id:"before-submitting-a-bug-report",level:4},{value:"How Do I Submit a Good Bug Report?",id:"how-do-i-submit-a-good-bug-report",level:4},{value:"Suggesting Enhancements",id:"suggesting-enhancements",level:3},{value:"Before Submitting an Enhancement",id:"before-submitting-an-enhancement",level:4},{value:"How Do I Submit a Good Enhancement Suggestion?",id:"how-do-i-submit-a-good-enhancement-suggestion",level:4},{value:"Workflow",id:"workflow",level:2},{value:"Join The Project Team",id:"join-the-project-team",level:2},{value:"Attribution",id:"attribution",level:2}],c={toc:l},p="wrapper";function h(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,o.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"contributing-to-lightning"},"Contributing to Lightning"),(0,i.kt)("p",null,"First off, thanks for taking the time to contribute!"),(0,i.kt)("p",null,"All types of contributions are encouraged and valued. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"Star the project"),(0,i.kt)("li",{parentName:"ul"},"Tweet about it"),(0,i.kt)("li",{parentName:"ul"},"Refer this project in your project's readme"),(0,i.kt)("li",{parentName:"ul"},"Mention the project at local meetups and tell your friends/colleagues"))),(0,i.kt)("h2",{id:"code-of-conduct"},"Code of Conduct"),(0,i.kt)("p",null,"This project and everyone participating in it is governed by the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/blob/master/CODE_OF_CONDUCT.md"},"Lightning Code of Conduct"),".\nBy participating, you are expected to uphold this code. Please report unacceptable behavior\nto ",(0,i.kt)("a",{parentName:"p",href:"mailto:dev@fleek.network"},"dev@fleek.network"),"."),(0,i.kt)("h2",{id:"i-have-a-question"},"I Have a Question"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you want to ask a question, we assume that you have read the available ",(0,i.kt)("a",{parentName:"p",href:"https://docs.fleek.network"},"Documentation"),".")),(0,i.kt)("p",null,"Before you ask a question, it is best to search for existing ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/issues"},"Issues")," that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first."),(0,i.kt)("p",null,"If you then still feel the need to ask a question and need clarification, we recommend the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Open an ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/issues/new"},"Issue"),"."),(0,i.kt)("li",{parentName:"ul"},"Provide as much context as you can about what you're running into."),(0,i.kt)("li",{parentName:"ul"},"Provide project and platform versions (rust, cargo, etc), depending on what seems relevant.")),(0,i.kt)("p",null,"We will then take care of the issue as soon as possible."),(0,i.kt)("h2",{id:"i-want-to-contribute"},"I Want To Contribute"),(0,i.kt)("admonition",{title:"Legal Notice",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.")),(0,i.kt)("h3",{id:"reporting-bugs"},"Reporting Bugs"),(0,i.kt)("h4",{id:"before-submitting-a-bug-report"},"Before Submitting a Bug Report"),(0,i.kt)("p",null,"A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Make sure that you are using the latest version."),(0,i.kt)("li",{parentName:"ul"},"Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the ",(0,i.kt)("a",{parentName:"li",href:"https://docs.fleek.network"},"documentation"),". If you are looking for support, you might want to check ",(0,i.kt)("a",{parentName:"li",href:"#i-have-a-question"},"this section"),")."),(0,i.kt)("li",{parentName:"ul"},"To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/issues?q=label%3Abug"},"bug tracker"),"."),(0,i.kt)("li",{parentName:"ul"},"Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue."),(0,i.kt)("li",{parentName:"ul"},"Collect information about the bug:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Stack trace (Traceback)"),(0,i.kt)("li",{parentName:"ul"},"OS, Platform and Version (Linux, macOS, x86, ARM)"),(0,i.kt)("li",{parentName:"ul"},"Version of the compiler, SDK, runtime environment, package manager, depending on what seems relevant."),(0,i.kt)("li",{parentName:"ul"},"Possibly your input and the output"),(0,i.kt)("li",{parentName:"ul"},"Can you reliably reproduce the issue? And can you also reproduce it with older versions?")))),(0,i.kt)("h4",{id:"how-do-i-submit-a-good-bug-report"},"How Do I Submit a Good Bug Report?"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to ",(0,i.kt)("a",{parentName:"p",href:"mailto:dev@fleek.network"},"dev@fleek.network"),".")),(0,i.kt)("p",null,"If you run into an issue with the project:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Open an ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/issues/new"},"Issue"),". (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)"),(0,i.kt)("li",{parentName:"ul"},"Explain the behavior you would expect and the actual behavior."),(0,i.kt)("li",{parentName:"ul"},"Please provide as much context as possible and describe the ",(0,i.kt)("em",{parentName:"li"},"reproduction steps")," that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case."),(0,i.kt)("li",{parentName:"ul"},"Provide the information you collected in the previous section.")),(0,i.kt)("p",null,"Once it's filed:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The project team will label the issue accordingly."),(0,i.kt)("li",{parentName:"ul"},"A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as ",(0,i.kt)("inlineCode",{parentName:"li"},"needs-repro"),". Bugs with the ",(0,i.kt)("inlineCode",{parentName:"li"},"needs-repro")," tag will not be addressed until they are reproduced."),(0,i.kt)("li",{parentName:"ul"},"If the team is able to reproduce the issue, it will be marked ",(0,i.kt)("inlineCode",{parentName:"li"},"needs-fix"),", as well as possibly other tags (such as ",(0,i.kt)("inlineCode",{parentName:"li"},"critical"),"), and the issue will be left to be ",(0,i.kt)("a",{parentName:"li",href:"#your-first-code-contribution"},"implemented by someone"),".")),(0,i.kt)("h3",{id:"suggesting-enhancements"},"Suggesting Enhancements"),(0,i.kt)("p",null,"This section guides you through submitting an enhancement suggestion for Lightning, ",(0,i.kt)("strong",{parentName:"p"},"including completely new features and minor improvements to existing functionality"),". Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions."),(0,i.kt)("h4",{id:"before-submitting-an-enhancement"},"Before Submitting an Enhancement"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Make sure that you are using the latest version."),(0,i.kt)("li",{parentName:"ul"},"Read the ",(0,i.kt)("a",{parentName:"li",href:"https://docs.fleek.network"},"documentation")," carefully and find out if the functionality is already covered, maybe by an individual configuration."),(0,i.kt)("li",{parentName:"ul"},"Perform a ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/fleek-network/lightning/issues"},"search")," to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one."),(0,i.kt)("li",{parentName:"ul"},"Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.")),(0,i.kt)("h4",{id:"how-do-i-submit-a-good-enhancement-suggestion"},"How Do I Submit a Good Enhancement Suggestion?"),(0,i.kt)("p",null,"Enhancement suggestions are tracked as ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/fleek-network/lightning/issues"},"GitHub issues"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Use a ",(0,i.kt)("strong",{parentName:"li"},"clear and descriptive title")," for the issue to identify the suggestion."),(0,i.kt)("li",{parentName:"ul"},"Provide a ",(0,i.kt)("strong",{parentName:"li"},"step-by-step description of the suggested enhancement")," in as many details as possible."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Describe the current behavior")," and ",(0,i.kt)("strong",{parentName:"li"},"explain which behavior you expected to see instead")," and why. At this point you can also tell which alternatives do not work for you."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Explain why this enhancement would be useful")," to most Lightning users. You may also want to point out the other projects that solved it better and which could serve as inspiration.")),(0,i.kt)("h2",{id:"workflow"},"Workflow"),(0,i.kt)("p",null,"The project is under heavy development to release the first version of the node and launch the testnet. Until then, the core team will be working from the ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," branch. PRs will be reviewed and treated case by case but the core team will commit directly to main for now. "),(0,i.kt)("h2",{id:"join-the-project-team"},"Join The Project Team"),(0,i.kt)("p",null,"Please visit our ",(0,i.kt)("a",{parentName:"p",href:"https://discord.gg/fleekxyz"},"Discord")," to get in touch with us."),(0,i.kt)("h2",{id:"attribution"},"Attribution"),(0,i.kt)("p",null,"This guide is based on the ",(0,i.kt)("strong",{parentName:"p"},"contributing-gen"),". ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/bttger/contributing-gen"},"Make your own"),"!"))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f6807fb4.5389a650.js b/assets/js/f6807fb4.4f260ebf.js similarity index 82% rename from assets/js/f6807fb4.5389a650.js rename to assets/js/f6807fb4.4f260ebf.js index b1e2ac9d7..98376a1b2 100644 --- a/assets/js/f6807fb4.5389a650.js +++ b/assets/js/f6807fb4.4f260ebf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4788],{9836:e=>{e.exports=JSON.parse('{"label":"architecture","permalink":"/docs/tags/architecture","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4788],{9836:e=>{e.exports=JSON.parse('{"label":"architecture","permalink":"/docs/tags/architecture","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/the-network","title":"The Network","description":"Explore Fleek Network\u2019s core protocol, its architecture, and unique characteristics as a decentralized edge network.","permalink":"/docs/learn/the-network"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/f893ec16.dafed2ec.js b/assets/js/f893ec16.d295f0cb.js similarity index 90% rename from assets/js/f893ec16.dafed2ec.js rename to assets/js/f893ec16.d295f0cb.js index 73b1c223f..c564312b0 100644 --- a/assets/js/f893ec16.dafed2ec.js +++ b/assets/js/f893ec16.d295f0cb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3131],{2661:e=>{e.exports=JSON.parse('{"label":"command line interface","permalink":"/docs/tags/command-line-interface","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[3131],{2661:e=>{e.exports=JSON.parse('{"label":"command line interface","permalink":"/docs/tags/command-line-interface","allTagsPath":"/docs/tags","count":1,"items":[{"id":"node/lightning-cli","title":"Lightning CLI","description":"With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.","permalink":"/docs/node/lightning-cli"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/fa69a7f4.48858406.js b/assets/js/fa69a7f4.48858406.js new file mode 100644 index 000000000..c4cfce27e --- /dev/null +++ b/assets/js/fa69a7f4.48858406.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6798],{2469:e=>{e.exports=JSON.parse('{"pluginId":"guides","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"defaultSidebar":[{"type":"link","label":"About guides","href":"/guides/","docId":"index","unlisted":false},{"type":"category","label":"Node Operators","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"Getting Started","href":"/guides/Node Operators/getting-started","docId":"Node Operators/getting-started-guide","unlisted":false},{"type":"link","label":"How to manage log files","href":"/guides/Node Operators/how-to-manage-log-files","docId":"Node Operators/how-to-manage-logfiles","unlisted":false},{"type":"link","label":"Managing the keystore","href":"/guides/Node Operators/managing-the-keystore","docId":"Node Operators/managing-the-keystore","unlisted":false},{"type":"link","label":"Running a node in Docker","href":"/guides/Node Operators/running-a-node-in-docker","docId":"Node Operators/running-a-node-in-docker","unlisted":false},{"type":"link","label":"Transfering setup ownership","href":"/guides/Node Operators/transfering-setup-ownership","docId":"Node Operators/transfering-setup-ownership","unlisted":false},{"type":"link","label":"Updating Lightning","href":"/guides/Node Operators/updating-lightning","docId":"Node Operators/updating-lightning","unlisted":false}]}]},"docs":{"index":{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","sidebar":"defaultSidebar"},"Node Operators/getting-started-guide":{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","sidebar":"defaultSidebar"},"Node Operators/how-to-manage-logfiles":{"id":"Node Operators/how-to-manage-logfiles","title":"How to manage log files","description":"Learn how to rotate, compress the log files","sidebar":"defaultSidebar"},"Node Operators/managing-the-keystore":{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","sidebar":"defaultSidebar"},"Node Operators/running-a-node-in-docker":{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","sidebar":"defaultSidebar"},"Node Operators/transfering-setup-ownership":{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","sidebar":"defaultSidebar"},"Node Operators/updating-lightning":{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","sidebar":"defaultSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/fa69a7f4.90bbc604.js b/assets/js/fa69a7f4.90bbc604.js deleted file mode 100644 index 73091a139..000000000 --- a/assets/js/fa69a7f4.90bbc604.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[6798],{2469:e=>{e.exports=JSON.parse('{"pluginId":"guides","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"defaultSidebar":[{"type":"link","label":"About guides","href":"/guides/","docId":"index"},{"type":"category","label":"Node Operators","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"Getting Started","href":"/guides/Node Operators/getting-started","docId":"Node Operators/getting-started-guide"},{"type":"link","label":"How to manage log files","href":"/guides/Node Operators/how-to-manage-log-files","docId":"Node Operators/how-to-manage-logfiles"},{"type":"link","label":"Managing the keystore","href":"/guides/Node Operators/managing-the-keystore","docId":"Node Operators/managing-the-keystore"},{"type":"link","label":"Running a node in Docker","href":"/guides/Node Operators/running-a-node-in-docker","docId":"Node Operators/running-a-node-in-docker"},{"type":"link","label":"Transfering setup ownership","href":"/guides/Node Operators/transfering-setup-ownership","docId":"Node Operators/transfering-setup-ownership"},{"type":"link","label":"Updating Lightning","href":"/guides/Node Operators/updating-lightning","docId":"Node Operators/updating-lightning"}]}]},"docs":{"index":{"id":"index","title":"About guides","description":"The guides provide step-by-step instructions and descriptions to help understand how and why you\'d have to do or execute certain commands or processes.","sidebar":"defaultSidebar"},"Node Operators/getting-started-guide":{"id":"Node Operators/getting-started-guide","title":"Getting Started","description":"A first look at what Fleek Network is, why it\'s important, and a simple tutorial of running and interacting with a node on your local machine!","sidebar":"defaultSidebar"},"Node Operators/how-to-manage-logfiles":{"id":"Node Operators/how-to-manage-logfiles","title":"How to manage log files","description":"Learn how to rotate, compress the log files","sidebar":"defaultSidebar"},"Node Operators/managing-the-keystore":{"id":"Node Operators/managing-the-keystore","title":"Managing the keystore","description":"The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you\u2019re migrating to","sidebar":"defaultSidebar"},"Node Operators/running-a-node-in-docker":{"id":"Node Operators/running-a-node-in-docker","title":"Running a node in Docker","description":"A guide on how to run Fleek Network\'s node in a Docker container","sidebar":"defaultSidebar"},"Node Operators/transfering-setup-ownership":{"id":"Node Operators/transfering-setup-ownership","title":"Transfering setup ownership","description":"A step-by-step guide to transfer the ownership of the Fleek Network Lightning CLI and service setup","sidebar":"defaultSidebar"},"Node Operators/updating-lightning":{"id":"Node Operators/updating-lightning","title":"Updating Lightning","description":"A step-by-step guide to update the Lightning CLI from source code and Service setup","sidebar":"defaultSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/fa7546af.b7f84265.js b/assets/js/fa7546af.7af1c866.js similarity index 89% rename from assets/js/fa7546af.b7f84265.js rename to assets/js/fa7546af.7af1c866.js index 01f8f749e..f3bf302c7 100644 --- a/assets/js/fa7546af.b7f84265.js +++ b/assets/js/fa7546af.7af1c866.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1611],{7327:e=>{e.exports=JSON.parse('{"label":"shutdown","permalink":"/references/tags/shutdown","allTagsPath":"/references/tags","count":2,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[1611],{7327:e=>{e.exports=JSON.parse('{"label":"shutdown","permalink":"/references/tags/shutdown","allTagsPath":"/references/tags","count":2,"items":[{"id":"Systemd/service-keeps-running-after-shutdown","title":"Service keeps running after shutdown","description":"Stop the service","permalink":"/references/Systemd/service-keeps-running-after-shutdown"},{"id":"Systemd/shutting-down-persistance","title":"Shutting down persistance","description":"Systemd Service as frozen or idle","permalink":"/references/Systemd/shutting-down-persistance"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/fcc63351.75cdda8a.js b/assets/js/fcc63351.947aff8c.js similarity index 85% rename from assets/js/fcc63351.75cdda8a.js rename to assets/js/fcc63351.947aff8c.js index f2cf4b553..a98278092 100644 --- a/assets/js/fcc63351.75cdda8a.js +++ b/assets/js/fcc63351.947aff8c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9743],{7495:e=>{e.exports=JSON.parse('{"label":"services","permalink":"/docs/tags/services","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[9743],{7495:e=>{e.exports=JSON.parse('{"label":"services","permalink":"/docs/tags/services","allTagsPath":"/docs/tags","count":1,"items":[{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/fd2b74dc.6aac091f.js b/assets/js/fd2b74dc.6aac091f.js deleted file mode 100644 index 8a7191f58..000000000 --- a/assets/js/fd2b74dc.6aac091f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4846],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>f});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function i(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),u=c(n),m=o,f=u["".concat(l,".").concat(m)]||u[m]||p[m]||a;return n?r.createElement(f,s(s({ref:t},d),{},{components:n})):r.createElement(f,s({ref:t},d))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var c=2;c<a;c++)s[c]=n[c];return r.createElement.apply(null,s)}return r.createElement.apply(null,n)}m.displayName="MDXCreateElement"},6578:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>d});var r=n(7462),o=(n(7294),n(3905)),a=n(3872);const s={title:"Keys not found",slug:"keys-not-found",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},i=void 0,l={unversionedId:"Lightning CLI/keys-not-found",id:"Lightning CLI/keys-not-found",title:"Keys not found",description:"Node key does not exist",source:"@site/references/Lightning CLI/keys-not-found.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/keys-not-found",permalink:"/references/Lightning CLI/keys-not-found",draft:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/keys-not-found.md",tags:[{label:"keystore",permalink:"/references/tags/keystore"},{label:"lost keys",permalink:"/references/tags/lost-keys"},{label:"ownership",permalink:"/references/tags/ownership"},{label:"file permissions",permalink:"/references/tags/file-permissions"}],version:"current",lastUpdatedAt:1698776143,formattedLastUpdatedAt:"Oct 31, 2023",frontMatter:{title:"Keys not found",slug:"keys-not-found",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},sidebar:"defaultSidebar",previous:{title:"Frequently used commands for Native setup",permalink:"/references/Lightning CLI/frequently-used-commands-for-native-setup"},next:{title:"Backing up the keystore",permalink:"/references/Lightning CLI/backing-up-the-keystore"}},c={},d=[{value:"Node key does not exist",id:"node-key-does-not-exist",level:2}],u={toc:d},p="wrapper";function m(e){let{components:t,...n}=e;return(0,o.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"node-key-does-not-exist"},"Node key does not exist"),(0,o.kt)("p",null,'When watching the Fleek Network Lightning service log output, you find the "Node key does not exist" message placed recursively. As follows:'),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-sh"},"thread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\nthread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n")),(0,o.kt)("p",null,"If you haven't deleted the keystore and can locate it, it's due to how the service is being run. As a user can delegate (sudo) the execution of the process to ",(0,o.kt)("strong",{parentName:"p"},"root"),", the location of the keystore differs on runtime."),(0,o.kt)("p",null,"To learn more about how file permissions and ownership work, you're advised to read the reference document ",(0,o.kt)("a",{parentName:"p",href:"/references/Lightning%20CLI/file-permissions-and-ownership"},"here"),"."),(0,o.kt)(a.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida",mdxType:"Author"}))}m.isMDXComponent=!0},3872:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7294);const o=e=>{let{image:t,name:n,title:o,url:a,communityMember:s=!1}=e;return r.createElement("section",{className:"author_card"},r.createElement("div",null,r.createElement("span",{className:"avatar"},r.createElement("a",{href:a,target:"_blank",alt:n},r.createElement("img",{src:t,alt:n}))),r.createElement("div",null,r.createElement("span",{className:"name"},r.createElement("a",{href:a,target:"_blank",alt:n},n)),r.createElement("span",{className:"title"},o),r.createElement("span",{className:"discord"},s?"Join our community on":"Got questions? Find us on"," ",r.createElement("a",{href:"https://discord.gg/fleekxyz",target:"_blank"},"discord!")))))}}}]); \ No newline at end of file diff --git a/assets/js/fd2b74dc.7c595cf3.js b/assets/js/fd2b74dc.7c595cf3.js new file mode 100644 index 000000000..cc27fa4e0 --- /dev/null +++ b/assets/js/fd2b74dc.7c595cf3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[4846],{949:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>c});var s=n(5893),o=n(1151),r=n(3872);const i={title:"Keys not found",slug:"keys-not-found",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},a=void 0,d={id:"Lightning CLI/keys-not-found",title:"Keys not found",description:"Node key does not exist",source:"@site/references/Lightning CLI/keys-not-found.md",sourceDirName:"Lightning CLI",slug:"/Lightning CLI/keys-not-found",permalink:"/references/Lightning CLI/keys-not-found",draft:!1,unlisted:!1,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/references/Lightning CLI/keys-not-found.md",tags:[{label:"keystore",permalink:"/references/tags/keystore"},{label:"lost keys",permalink:"/references/tags/lost-keys"},{label:"ownership",permalink:"/references/tags/ownership"},{label:"file permissions",permalink:"/references/tags/file-permissions"}],version:"current",lastUpdatedAt:1698861793,formattedLastUpdatedAt:"Nov 1, 2023",frontMatter:{title:"Keys not found",slug:"keys-not-found",hide_title:!0,tags:["keystore","lost keys","ownership","file permissions"]},sidebar:"defaultSidebar",previous:{title:"Frequently used commands for Native setup",permalink:"/references/Lightning CLI/frequently-used-commands-for-native-setup"},next:{title:"Backing up the keystore",permalink:"/references/Lightning CLI/backing-up-the-keystore"}},l={},c=[{value:"Node key does not exist",id:"node-key-does-not-exist",level:2}];function h(e){const t={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",strong:"strong",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"node-key-does-not-exist",children:"Node key does not exist"}),"\n",(0,s.jsx)(t.p,{children:'When watching the Fleek Network Lightning service log output, you find the "Node key does not exist" message placed recursively. As follows:'}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sh",children:"thread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\nthread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n"})}),"\n",(0,s.jsxs)(t.p,{children:["If you haven't deleted the keystore and can locate it, it's due to how the service is being run. As a user can delegate (sudo) the execution of the process to ",(0,s.jsx)(t.strong,{children:"root"}),", the location of the keystore differs on runtime."]}),"\n",(0,s.jsxs)(t.p,{children:["To learn more about how file permissions and ownership work, you're advised to read the reference document ",(0,s.jsx)(t.a,{href:"/references/Lightning%20CLI/file-permissions-and-ownership",children:"here"}),"."]}),"\n",(0,s.jsx)(r.Z,{name:"Helder Oliveira",image:"https://github.com/heldrida.png",title:"Software Developer + DX",url:"https://github.com/heldrida"})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},3872:(e,t,n)=>{n.d(t,{Z:()=>o});n(7294);var s=n(5893);const o=e=>{let{image:t,name:n,title:o,url:r,communityMember:i=!1}=e;return(0,s.jsx)("section",{className:"author_card",children:(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"avatar",children:(0,s.jsx)("a",{href:r,target:"_blank",alt:n,children:(0,s.jsx)("img",{src:t,alt:n})})}),(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"name",children:(0,s.jsx)("a",{href:r,target:"_blank",alt:n,children:n})}),(0,s.jsx)("span",{className:"title",children:o}),(0,s.jsxs)("span",{className:"discord",children:[i?"Join our community on":"Got questions? Find us on"," ",(0,s.jsx)("a",{href:"https://discord.gg/fleekxyz",target:"_blank",children:"discord!"})]})]})]})})}},1151:(e,t,n)=>{n.d(t,{Z:()=>a,a:()=>i});var s=n(7294);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ffc337e7.dce1780a.js b/assets/js/ffc337e7.5f4be381.js similarity index 94% rename from assets/js/ffc337e7.dce1780a.js rename to assets/js/ffc337e7.5f4be381.js index b43d7f882..d9decfde4 100644 --- a/assets/js/ffc337e7.dce1780a.js +++ b/assets/js/ffc337e7.5f4be381.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7310],{2110:e=>{e.exports=JSON.parse('{"label":"Learn","permalink":"/docs/tags/learn","allTagsPath":"/docs/tags","count":4,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[7310],{2110:e=>{e.exports=JSON.parse('{"label":"Learn","permalink":"/docs/tags/learn","allTagsPath":"/docs/tags","count":4,"items":[{"id":"index","title":"About","description":"Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.","permalink":"/docs/"},{"id":"learn/developers","title":"Developers","description":"Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.","permalink":"/docs/learn/developers"},{"id":"learn/index","title":"Introduction","description":"Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.","permalink":"/docs/learn/introduction"},{"id":"learn/services","title":"Services","description":"Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.","permalink":"/docs/learn/services"}],"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/ffcb1b32.d590406b.js b/assets/js/ffcb1b32.d590406b.js new file mode 100644 index 000000000..9e0ddba20 --- /dev/null +++ b/assets/js/ffcb1b32.d590406b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5120],{8465:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>i,toc:()=>a});var o=n(5893),r=n(1151);const s={title:"JSON-RPC",slug:"json-rpc",hide_title:!0},c=void 0,i={id:"develop/json-rpc",title:"JSON-RPC",description:"",source:"@site/docs/develop/json-rpc.md",sourceDirName:"develop",slug:"/develop/json-rpc",permalink:"/docs/develop/json-rpc",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"JSON-RPC",slug:"json-rpc",hide_title:!0}},u={},a=[];function d(e){return(0,o.jsx)(o.Fragment,{})}function l(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d()}},1151:(e,t,n)=>{n.d(t,{Z:()=>i,a:()=>c});var o=n(7294);const r={},s=o.createContext(r);function c(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ffcb1b32.d819dc1a.js b/assets/js/ffcb1b32.d819dc1a.js deleted file mode 100644 index 1ef753943..000000000 --- a/assets/js/ffcb1b32.d819dc1a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[5120],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function a(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function p(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},c=Object.keys(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n<c.length;n++)r=c[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var i=n.createContext({}),l=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(i.Provider,{value:t},e.children)},s="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,c=e.originalType,i=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),s=l(r),d=o,y=s["".concat(i,".").concat(d)]||s[d]||f[d]||c;return r?n.createElement(y,a(a({ref:t},u),{},{components:r})):n.createElement(y,a({ref:t},u))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var c=r.length,a=new Array(c);a[0]=d;var p={};for(var i in t)hasOwnProperty.call(t,i)&&(p[i]=t[i]);p.originalType=e,p[s]="string"==typeof e?e:o,a[1]=p;for(var l=2;l<c;l++)a[l]=r[l];return n.createElement.apply(null,a)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},8730:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>f,frontMatter:()=>c,metadata:()=>p,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const c={title:"JSON-RPC",slug:"json-rpc",hide_title:!0},a=void 0,p={unversionedId:"develop/json-rpc",id:"develop/json-rpc",title:"JSON-RPC",description:"",source:"@site/docs/develop/json-rpc.md",sourceDirName:"develop",slug:"/develop/json-rpc",permalink:"/docs/develop/json-rpc",draft:!1,tags:[],version:"current",frontMatter:{title:"JSON-RPC",slug:"json-rpc",hide_title:!0}},i={},l=[],u={toc:l},s="wrapper";function f(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.63e95a14.js b/assets/js/main.63e95a14.js new file mode 100644 index 000000000..23354a8c8 --- /dev/null +++ b/assets/js/main.63e95a14.js @@ -0,0 +1,2 @@ +/*! For license information please see main.63e95a14.js.LICENSE.txt */ +(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(7294);function o(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},4334:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n);else for(t in e)e[t]&&(o&&(o+=" "),o+=t);return o}n.d(t,{Z:()=>o});const o=function(){for(var e,t,n=0,o="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},7459:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n);else for(t in e)e[t]&&(o&&(o+=" "),o+=t);return o}n.d(t,{Z:()=>o});const o=function(){for(var e,t,n=0,o="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});n(7294);var r=n(8356),o=n.n(r),a=n(6887);const i={"00309d1b":[()=>n.e(9335).then(n.t.bind(n,5219,19)),"~docs/default/tag-docs-tags-fleek-network-206.json",5219],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,4524)),"@theme/BlogTagsListPage",4524],"02f62b30":[()=>n.e(2170).then(n.t.bind(n,6037,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-docs/guides/plugin-route-context-module-100.json",6037],"0359c679":[()=>n.e(7649).then(n.t.bind(n,8511,19)),"~docs/references/tag-references-tags-sudoer-94d.json",8511],"07f20919":[()=>n.e(4327).then(n.t.bind(n,6444,19)),"~docs/references/tag-references-tags-root-1d1.json",6444],"08dd5264":[()=>n.e(9267).then(n.t.bind(n,9692,19)),"~docs/default/tag-docs-tags-snarks-8e6.json",9692],"08ded6db":[()=>n.e(7216).then(n.t.bind(n,1426,19)),"~docs/references/tag-references-tags-lightning-d47.json",1426],"09ac38f0":[()=>n.e(3343).then(n.t.bind(n,4764,19)),"~docs/references/tag-references-tags-delete-f8c.json",4764],"0dffb83e":[()=>n.e(5075).then(n.bind(n,113)),"@site/docs/roadmap.md",113],"0ea1f268":[()=>n.e(663).then(n.t.bind(n,454,19)),"~docs/references/tag-references-tags-restore-2d4.json",454],"0fbdd4ac":[()=>n.e(8934).then(n.t.bind(n,8944,19)),"~docs/guides/tag-guides-tags-ownership-c29.json",8944],"1366d7ae":[()=>n.e(2564).then(n.bind(n,5468)),"@site/docs/node/lightning-cli.md",5468],"13986d62":[()=>n.e(9822).then(n.t.bind(n,8973,19)),"~docs/references/tag-references-tags-cli-35e.json",8973],"143de299":[()=>n.e(8427).then(n.t.bind(n,9162,19)),"~docs/default/tag-docs-tags-algorithms-8a4.json",9162],"153c226b":[()=>n.e(7249).then(n.t.bind(n,9141,19)),"~docs/default/tag-docs-tags-compile-66b.json",9141],"155c1e74":[()=>n.e(747).then(n.t.bind(n,8095,19)),"~docs/references/tag-references-tags-reference-379.json",8095],"166b5465":[()=>n.e(1517).then(n.t.bind(n,9151,19)),"~docs/references/tag-references-tags-pkill-ae0.json",9151],17896441:[()=>Promise.all([n.e(532),n.e(7874),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"179183ba":[()=>n.e(6601).then(n.t.bind(n,655,19)),"~docs/default/tag-docs-tags-protocol-8a8.json",655],"180ee354":[()=>n.e(9316).then(n.t.bind(n,5601,19)),"~docs/default/tag-docs-tags-manage-3d5.json",5601],"187c6361":[()=>n.e(6788).then(n.t.bind(n,1461,19)),"~docs/default/tag-docs-tags-edge-network-189.json",1461],"19f79f7b":[()=>n.e(8489).then(n.bind(n,8816)),"@site/guides/Node Operators/how-to-manage-logfiles.md",8816],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,2026)),"@theme/SearchPage",2026],"1c14429f":[()=>n.e(2702).then(n.bind(n,5894)),"@site/guides/Node Operators/getting-started-guide.md",5894],"1d8a5d15":[()=>n.e(9854).then(n.bind(n,884)),"@site/guides/Node Operators/transfering-setup-ownership.md",884],"1df93b7f":[()=>n.e(3237).then(n.bind(n,9754)),"@site/src/pages/index.tsx",9754],"21f2cabf":[()=>n.e(4537).then(n.t.bind(n,724,19)),"~docs/references/tag-references-tags-backup-7d5.json",724],"2218035b":[()=>n.e(4530).then(n.t.bind(n,3769,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"26b85cb6":[()=>n.e(7055).then(n.bind(n,6172)),"@site/references/Lightning CLI/restore-keystore.md",6172],"2730e145":[()=>n.e(7147).then(n.bind(n,5450)),"@site/references/Lightning CLI/permission-denied-os-error-13.md",5450],27528755:[()=>n.e(6926).then(n.t.bind(n,2578,19)),"~docs/references/tag-references-tags-uninstall-aa8.json",2578],"29b62a39":[()=>n.e(1498).then(n.bind(n,181)),"@site/guides/index.md",181],"29b83576":[()=>n.e(1510).then(n.bind(n,7003)),"@site/references/Lightning CLI/keystore-backup.md",7003],"2a6b0b88":[()=>n.e(6446).then(n.t.bind(n,8424,19)),"~docs/references/tag-references-tags-commands-89d.json",8424],"2adfdcac":[()=>n.e(3189).then(n.t.bind(n,4723,19)),"~docs/default/tag-docs-tags-token-d9b.json",4723],"2baa5a9a":[()=>n.e(9021).then(n.t.bind(n,8704,19)),"~docs/guides/tag-guides-tags-configuration-48b.json",8704],"2ddc9f52":[()=>n.e(7400).then(n.t.bind(n,5048,19)),"~docs/references/tag-references-tags-build-211.json",5048],"2e0a4d25":[()=>n.e(8132).then(n.t.bind(n,9073,19)),"~docs/references/tag-references-tags-systemctl-aa5.json",9073],"3290fbc2":[()=>n.e(2235).then(n.bind(n,6924)),"@site/docs/develop/client.md",6924],35230925:[()=>n.e(5602).then(n.bind(n,8139)),"@site/docs/learn/developers.md",8139],"35a7e2bf":[()=>n.e(4508).then(n.t.bind(n,8581,19)),"~docs/default/tag-docs-tags-contribute-7e0.json",8581],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,727)),"@theme/DocTagsListPage",727],"39574d2e":[()=>n.e(8747).then(n.t.bind(n,8270,19)),"~docs/default/tag-docs-tags-decentralization-674.json",8270],"399f21a8":[()=>n.e(2214).then(n.t.bind(n,2281,19)),"~docs/default/tag-docs-tags-rpc-9da.json",2281],"39e94577":[()=>n.e(1563).then(n.t.bind(n,3199,19)),"~docs/default/tag-docs-tags-build-2a2.json",3199],"3a6297ac":[()=>n.e(11).then(n.t.bind(n,2511,19)),"~docs/default/tag-docs-tags-sdk-70c.json",2511],"3b168dbd":[()=>n.e(469).then(n.t.bind(n,2832,19)),"~docs/guides/tag-guides-tags-edge-computing-c27.json",2832],"3f0cec70":[()=>n.e(9336).then(n.t.bind(n,4776,19)),"~docs/guides/tag-guides-tags-help-63e.json",4776],"3f3a03c1":[()=>n.e(4451).then(n.t.bind(n,1721,19)),"~blog/default/blog-tags-blog-476-list.json",1721],"3f90f51b":[()=>n.e(6669).then(n.bind(n,1054)),"@site/docs/learn/services.md",1054],"4035650f":[()=>n.e(2260).then(n.t.bind(n,9438,19)),"~blog/default/blog-tags-engineering-6ae.json",9438],"4061bfd3":[()=>n.e(3116).then(n.t.bind(n,7085,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"40aeb86f":[()=>n.e(4402).then(n.bind(n,2382)),"@site/references/Lightning CLI/update-cli-from-source-code.md",2382],"4247aede":[()=>n.e(2800).then(n.t.bind(n,4948,19)),"~docs/default/tag-docs-tags-consensus-a3b.json",4948],"433ff3d6":[()=>n.e(555).then(n.t.bind(n,2787,19)),"~docs/default/tag-docs-tags-rewards-1bb.json",2787],"43ee1886":[()=>n.e(5466).then(n.t.bind(n,653,19)),"~docs/references/tag-references-tags-idle-b08.json",653],"445e9e2a":[()=>n.e(8578).then(n.bind(n,1478)),"@site/references/Lightning CLI/node-secret-key-does-not-exist.md",1478],"44969bae":[()=>n.e(4063).then(n.bind(n,6019)),"@site/docs/node/requirements.md",6019],"45ac3af8":[()=>n.e(5204).then(n.t.bind(n,5796,19)),"~docs/default/tag-docs-tags-systemctl-2a0.json",5796],"45c86e35":[()=>n.e(9847).then(n.t.bind(n,2316,19)),"~docs/default/tag-docs-tags-about-3bc.json",2316],"45e1a117":[()=>n.e(6696).then(n.t.bind(n,5382,19)),"~docs/references/tag-references-tags-frozen-e7d.json",5382],"469c924f":[()=>n.e(2240).then(n.t.bind(n,342,19)),"~docs/default/tag-docs-tags-roadmap-bd4.json",342],"48857ff6":[()=>n.e(2908).then(n.t.bind(n,1014,19)),"~docs/default/tag-docs-tags-open-source-3c0.json",1014],"48e81e49":[()=>n.e(173).then(n.t.bind(n,5121,19)),"~docs/default/tag-docs-tags-incentives-3eb.json",5121],"49b5e83d":[()=>n.e(402).then(n.t.bind(n,3969,19)),"~docs/default/tag-docs-tags-manual-b97.json",3969],"4a821728":[()=>n.e(9513).then(n.t.bind(n,9748,19)),"~docs/default/tag-docs-tags-whitepaper-2ec.json",9748],"4beaa780":[()=>n.e(5081).then(n.t.bind(n,380,19)),"~docs/default/tag-docs-tags-reputation-c14.json",380],"4c027320":[()=>n.e(9511).then(n.t.bind(n,2564,19)),"~docs/guides/tag-guides-tags-getting-started-812.json",2564],"4c9535f7":[()=>n.e(6296).then(n.bind(n,9237)),"@site/guides/Node Operators/running-a-node-in-docker.md",9237],"4d7007b2":[()=>n.e(6272).then(n.bind(n,2482)),"@site/references/index.md",2482],"50f02954":[()=>n.e(4826).then(n.t.bind(n,3900,19)),"~docs/references/tag-references-tags-systemd-aff.json",3900],"514cab6e":[()=>n.e(6410).then(n.bind(n,5673)),"@site/docs/Open-source/code-of-conduct.md",5673],"51d5b592":[()=>n.e(1984).then(n.bind(n,7859)),"@site/docs/node/install.md",7859],"51f2bfad":[()=>n.e(71).then(n.t.bind(n,3386,19)),"~docs/default/tag-docs-tags-server-240.json",3386],"53ca291c":[()=>n.e(3863).then(n.t.bind(n,4586,19)),"~docs/default/tag-docs-tags-economics-342.json",4586],"5437f376":[()=>n.e(909).then(n.bind(n,3616)),"@site/guides/Node Operators/managing-the-keystore.md",3616],"54436d06":[()=>n.e(4872).then(n.t.bind(n,4094,19)),"~docs/default/tag-docs-tags-cli-dbf.json",4094],"5559e604":[()=>n.e(2501).then(n.t.bind(n,811,19)),"~docs/default/tag-docs-tags-systemd-9d0.json",811],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,8070,19)),"~docs/default/tags-list-current-prop-15a.json",8070],"564044f9":[()=>n.e(1771).then(n.t.bind(n,4283,19)),"~docs/guides/tag-guides-tags-public-keys-1f7.json",4283],"581d5240":[()=>n.e(5318).then(n.bind(n,4798)),"@site/docs/node/health-check.md",4798],"5a9491fe":[()=>n.e(6476).then(n.t.bind(n,5751,19)),"~docs/guides/tag-guides-tags-keystore-6f8.json",5751],"5b6134d1":[()=>n.e(9752).then(n.bind(n,2421)),"@site/references/Lightning CLI/file-permissions-and-ownership.md",2421],"5bc389a1":[()=>n.e(9829).then(n.bind(n,7631)),"@site/guides/Node Operators/updating-lightning.md",7631],"5d08f08d":[()=>n.e(659).then(n.t.bind(n,340,19)),"~docs/guides/tag-guides-tags-guide-f01.json",340],"5d38c936":[()=>n.e(9804).then(n.t.bind(n,9797,19)),"~docs/default/tag-docs-tags-rust-dependencies-0a8.json",9797],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ec90731":[()=>n.e(8942).then(n.t.bind(n,5440,19)),"~docs/guides/tag-guides-tags-transfer-246.json",5440],"5ef0bdde":[()=>n.e(8567).then(n.t.bind(n,7778,19)),"~blog/default/blog-tags-content-routing-b90.json",7778],"616ee580":[()=>n.e(4749).then(n.t.bind(n,5736,19)),"~docs/references/tag-references-tags-remove-c35.json",5736],"631037e5":[()=>n.e(801).then(n.t.bind(n,7064,19)),"~blog/default/blog-tags-blog-476.json",7064],"64d03520":[()=>n.e(1138).then(n.t.bind(n,2217,19)),"~docs/default/tag-docs-tags-requirements-a99.json",2217],"665f164c":[()=>n.e(9320).then(n.bind(n,3566)),"@site/docs/node/testnet-onboarding.md",3566],"6875c492":[()=>Promise.all([n.e(532),n.e(7874),n.e(130),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"68b99ecd":[()=>n.e(4556).then(n.t.bind(n,1407,19)),"~docs/default/tag-docs-tags-standards-f96.json",1407],"6be32138":[()=>n.e(3396).then(n.bind(n,3103)),"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md",3103],"6cbb3cde":[()=>n.e(5136).then(n.t.bind(n,3860,19)),"~blog/default/blog-tags-engineering-6ae-list.json",3860],"6ccb158e":[()=>n.e(3218).then(n.t.bind(n,4391,19)),"~docs/references/tag-references-tags-keystore-d50.json",4391],"6e965365":[()=>n.e(4679).then(n.t.bind(n,8472,19)),"~docs/references/tag-references-tags-references-2ec.json",8472],"6f8964f3":[()=>n.e(7536).then(n.t.bind(n,9430,19)),"~docs/guides/tag-guides-tags-fleek-network-dce.json",9430],"719c0fd7":[()=>n.e(706).then(n.t.bind(n,6419,19)),"~docs/references/tag-references-tags-permissions-2fe.json",6419],"749619b5":[()=>n.e(6362).then(n.t.bind(n,5294,19)),"~docs/references/tag-references-tags-ownership-96b.json",5294],"74ec46b4":[()=>n.e(1263).then(n.t.bind(n,1337,19)),"~docs/default/tag-docs-tags-wizard-38b.json",1337],"75d8af72":[()=>n.e(1474).then(n.t.bind(n,1187,19)),"~docs/default/tag-docs-tags-diagnostic-a48.json",1187],"763344b9":[()=>n.e(5094).then(n.t.bind(n,5772,19)),"~docs/default/tag-docs-tags-toolkit-735.json",5772],"779cc1e8":[()=>n.e(4).then(n.t.bind(n,761,19)),"~docs/references/tag-references-tags-update-c18.json",761],"79055aff":[()=>n.e(8256).then(n.t.bind(n,92,19)),"~docs/default/tag-docs-tags-logs-8e1.json",92],"7aba1839":[()=>n.e(554).then(n.t.bind(n,7177,19)),"~docs/default/tag-docs-tags-ports-99f.json",7177],"7aefc753":[()=>n.e(1251).then(n.bind(n,8717)),"@site/references/Lightning CLI/uninstall-lightning-node.md",8717],"7b667a7f":[()=>n.e(5649).then(n.t.bind(n,5274,19)),"~docs/default/tag-docs-tags-git-514.json",5274],"7b788087":[()=>n.e(9062).then(n.t.bind(n,6149,19)),"~docs/guides/tag-guides-tags-keys-31a.json",6149],"7b9de75f":[()=>n.e(6353).then(n.t.bind(n,6378,19)),"~docs/default/tag-docs-tags-healthcheck-28a.json",6378],"7ceaa645":[()=>n.e(387).then(n.bind(n,155)),"@site/docs/learn/the-network.md",155],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],82893666:[()=>n.e(8005).then(n.t.bind(n,2220,19)),"~docs/default/tag-docs-tags-develop-1cf.json",2220],"8428fe34":[()=>n.e(5522).then(n.bind(n,576)),"@site/docs/node/diagnostics.md",576],"84cbd6c9":[()=>n.e(3336).then(n.t.bind(n,4793,19)),"~docs/guides/tags-list-current-prop-15a.json",4793],"84e08f43":[()=>n.e(8059).then(n.t.bind(n,3290,19)),"~docs/references/tag-references-tags-file-permissions-d5d.json",3290],"85d6e74d":[()=>n.e(4819).then(n.t.bind(n,5745,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"866d553a":[()=>n.e(8668).then(n.bind(n,1534)),"@site/references/Lightning CLI/frequently-used-commands-for-native-setup.md",1534],"86c3bd1d":[()=>n.e(2421).then(n.t.bind(n,813,19)),"~docs/references/tag-references-tags-user-service-d6a.json",813],"8a92e787":[()=>n.e(2517).then(n.bind(n,6739)),"@site/references/Systemd/shutting-down-persistance.md",6739],"8cf21e85":[()=>n.e(6854).then(n.t.bind(n,90,19)),"~docs/default/tag-docs-tags-client-ceb.json",90],"8def2dd5":[()=>n.e(382).then(n.bind(n,4610)),"@site/docs/learn/index.md",4610],"90decb6d":[()=>n.e(9649).then(n.t.bind(n,2570,19)),"~docs/guides/tag-guides-tags-private-keys-b97.json",2570],"933a69d3":[()=>n.e(7813).then(n.t.bind(n,1853,19)),"~docs/default/tag-docs-tags-getting-started-980.json",1853],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93df2695":[()=>n.e(2386).then(n.bind(n,1367)),"@site/docs/learn/delivery-acknowledgements.md",1367],"95f4d37c":[()=>n.e(814).then(n.bind(n,7497)),"@site/docs/develop/index.md",7497],"965d240c":[()=>n.e(6577).then(n.t.bind(n,7668,19)),"~docs/guides/tag-guides-tags-rebuild-cdb.json",7668],"9722e053":[()=>n.e(1955).then(n.bind(n,6410)),"@site/references/Docker/frequently-used-commands-for-docker-setup.md",6410],"98f9308d":[()=>n.e(1025).then(n.bind(n,2150)),"@site/references/Systemd/service-keeps-running-after-shutdown.md",2150],"9bca08cf":[()=>n.e(8318).then(n.t.bind(n,7618,19)),"~docs/references/tag-references-tags-upgrade-b60.json",7618],"9bd69ffc":[()=>n.e(6699).then(n.t.bind(n,9790,19)),"~docs/default/tag-docs-tags-node-status-a43.json",9790],"9cc140f3":[()=>n.e(5049).then(n.t.bind(n,429,19)),"~docs/default/tag-docs-tags-repository-b8c.json",429],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9f1c3232":[()=>n.e(373).then(n.bind(n,9129)),"@site/docs/node/index.md",9129],"9f7d0305":[()=>n.e(4713).then(n.bind(n,3890)),"@site/docs/node/analyzing-logs.md",3890],a13e0645:[()=>n.e(7136).then(n.t.bind(n,3120,19)),"~docs/default/tag-docs-tags-codebase-878.json",3120],a50e2e4f:[()=>n.e(7796).then(n.t.bind(n,2752,19)),"~docs/default/tag-docs-tags-awards-c13.json",2752],a626c4f3:[()=>n.e(581).then(n.t.bind(n,4218,19)),"~docs/default/tag-docs-tags-lightning-f7e.json",4218],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(7874),n.e(130),n.e(3089)]).then(n.bind(n,3402)),"@theme/BlogListPage",3402],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a771de40:[()=>n.e(6074).then(n.t.bind(n,8606,19)),"~docs/default/tag-docs-tags-control-341.json",8606],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],a9a76bf7:[()=>n.e(4356).then(n.t.bind(n,8826,19)),"~docs/default/tag-docs-tags-onboarding-2eb.json",8826],aa81941d:[()=>n.e(3012).then(n.t.bind(n,5689,19)),"~docs/default/tag-docs-tags-edge-platform-754.json",5689],ad04e600:[()=>n.e(5844).then(n.t.bind(n,3998,19)),"~docs/guides/tag-guides-tags-container-e63.json",3998],ae013ba6:[()=>n.e(9981).then(n.t.bind(n,2879,19)),"~docs/references/tag-references-tags-image-9d7.json",2879],ae70e824:[()=>n.e(1433).then(n.t.bind(n,360,19)),"~docs/guides/tag-guides-tags-logs-5d1.json",360],af6a11bf:[()=>n.e(3503).then(n.t.bind(n,5296,19)),"~docs/references/tag-references-tags-help-9a8.json",5296],b02525a9:[()=>n.e(6980).then(n.t.bind(n,3993,19)),"~docs/guides/tag-guides-tags-guides-141.json",3993],b03a0ac1:[()=>n.e(4785).then(n.t.bind(n,2312,19)),"~docs/default/tag-docs-tags-cdn-fa9.json",2312],b249ed45:[()=>n.e(5767).then(n.bind(n,1583)),"@site/references/Docker/uninstall-docker-setup.md",1583],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b35f1b7f:[()=>n.e(7706).then(n.bind(n,9747)),"@site/references/Systemd/user-service.md",9747],b40daf0f:[()=>n.e(2126).then(n.bind(n,9303)),"@site/docs/node/configuration.md",9303],b4f44b9b:[()=>n.e(551).then(n.t.bind(n,2960,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-docs/references/plugin-route-context-module-100.json",2960],b5954e33:[()=>n.e(2114).then(n.bind(n,852)),"@site/docs/learn/token-and-economics.md",852],b696d13b:[()=>n.e(327).then(n.t.bind(n,5212,19)),"~docs/default/tag-docs-tags-verification-caa.json",5212],b8466c91:[()=>n.e(4939).then(n.t.bind(n,942,19)),"~docs/guides/tag-guides-tags-setup-8ad.json",942],b8c37621:[()=>n.e(920).then(n.t.bind(n,3908,19)),"~docs/default/tag-docs-tags-guide-a32.json",3908],b9b7817e:[()=>n.e(1476).then(n.t.bind(n,7913,19)),"~docs/references/tag-references-tags-docker-edf.json",7913],bd59af11:[()=>n.e(9188).then(n.t.bind(n,7522,19)),"~docs/default/tag-docs-tags-diagnostics-265.json",7522],bea6e15b:[()=>n.e(8754).then(n.t.bind(n,815,19)),"~docs/references/tag-references-tags-fix-c13.json",815],c222de09:[()=>n.e(7563).then(n.bind(n,4342)),"@site/docs/whitepaper.md",4342],c377a04b:[()=>n.e(6971).then(n.bind(n,4606)),"@site/docs/index.md",4606],c3f5dd14:[()=>n.e(1345).then(n.t.bind(n,9826,19)),"~docs/references/tag-references-tags-clean-55b.json",9826],caaedc90:[()=>n.e(572).then(n.t.bind(n,8988,19)),"~docs/references/tag-references-tags-unit-0cd.json",8988],cc8e0b88:[()=>n.e(6310).then(n.t.bind(n,2560,19)),"~docs/default/tag-docs-tags-pledge-e5c.json",2560],cc9d5bf1:[()=>n.e(3236).then(n.t.bind(n,300,19)),"~blog/default/blog-tags-fleek-network-995-list.json",300],ccc49370:[()=>Promise.all([n.e(532),n.e(7874),n.e(130),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],ce321ae3:[()=>n.e(1837).then(n.t.bind(n,2141,19)),"~docs/default/tag-docs-tags-configuration-143.json",2141],ce4635d7:[()=>n.e(9395).then(n.t.bind(n,6062,19)),"~docs/references/tag-references-tags-lost-keys-940.json",6062],ceabd901:[()=>n.e(1354).then(n.t.bind(n,5e3,19)),"~docs/guides/tag-guides-tags-update-e5f.json",5e3],d16f6fc6:[()=>n.e(5530).then(n.t.bind(n,8316,19)),"~docs/references/tag-references-tags-clear-34f.json",8316],d1b78a4d:[()=>n.e(3023).then(n.bind(n,756)),"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md?truncated=true",756],d1d29319:[()=>n.e(2027).then(n.t.bind(n,9887,19)),"~docs/references/tag-references-tags-service-error-f6a.json",9887],d23df0ea:[()=>n.e(5548).then(n.bind(n,5081)),"@site/references/Docker/build-and-run-in-docker.md",5081],d464210a:[()=>n.e(2023).then(n.t.bind(n,4075,19)),"~docs/default/tag-docs-tags-code-of-conduct-379.json",4075],d7d81bf6:[()=>n.e(2918).then(n.bind(n,6710)),"@site/references/Lightning CLI/error-building-on-arm64.md",6710],d8be0e5a:[()=>n.e(1706).then(n.bind(n,4751)),"@site/references/Lightning CLI/error-linking-with-cc-failed.md",4751],da002ab0:[()=>n.e(5888).then(n.t.bind(n,831,19)),"~blog/default/blog-tags-fleek-network-995.json",831],da8f35c6:[()=>n.e(4541).then(n.t.bind(n,4257,19)),"~blog/default/blog-tags-content-routing-b90-list.json",4257],dc2776f2:[()=>n.e(8644).then(n.bind(n,8864)),"@site/docs/Open-source/repositories.md",8864],dd97a9bc:[()=>n.e(9707).then(n.bind(n,7538)),"@site/docs/node/systemd-service.md",7538],de225737:[()=>n.e(6726).then(n.t.bind(n,4536,19)),"~docs/default/tag-docs-tags-lgtn-e06.json",4536],df203c0f:[()=>Promise.all([n.e(532),n.e(9924)]).then(n.bind(n,491)),"@theme/DocTagDocListPage",491],e10957d6:[()=>n.e(4708).then(n.t.bind(n,4469,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],e331fbd7:[()=>n.e(9995).then(n.t.bind(n,7568,19)),"~docs/default/tag-docs-tags-permissionless-576.json",7568],e6a08407:[()=>n.e(2450).then(n.t.bind(n,607,19)),"~docs/references/tag-references-tags-container-a9e.json",607],e91f52c1:[()=>n.e(7091).then(n.t.bind(n,5393,19)),"~docs/references/tag-references-tags-process-5fa.json",5393],ec98ad91:[()=>n.e(4034).then(n.t.bind(n,1323,19)),"~docs/default/tag-docs-tags-testnet-9cf.json",1323],ecfddbd4:[()=>n.e(7804).then(n.bind(n,9893)),"@site/docs/Open-source.md",9893],f02c0d6e:[()=>n.e(3707).then(n.t.bind(n,3422,19)),"~docs/default/tag-docs-tags-tokenomics-43c.json",3422],f3d7f34e:[()=>n.e(982).then(n.t.bind(n,9299,19)),"~docs/references/version-current-metadata-prop-751.json",9299],f3f8ecb0:[()=>n.e(6939).then(n.bind(n,2200)),"@site/docs/develop/service-development.md",2200],f41bce02:[()=>n.e(3719).then(n.t.bind(n,4729,19)),"~docs/guides/tag-guides-tags-docker-ee0.json",4729],f4fd4511:[()=>n.e(6461).then(n.t.bind(n,6514,19)),"~docs/default/tag-docs-tags-phases-f9f.json",6514],f50a4147:[()=>n.e(4888).then(n.bind(n,8810)),"@site/docs/Open-source/contributing.md",8810],f6807fb4:[()=>n.e(4788).then(n.t.bind(n,9836,19)),"~docs/default/tag-docs-tags-architecture-68d.json",9836],f893ec16:[()=>n.e(3131).then(n.t.bind(n,2661,19)),"~docs/default/tag-docs-tags-command-line-interface-bff.json",2661],f9537533:[()=>n.e(5347).then(n.t.bind(n,881,19)),"~docs/references/tags-list-current-prop-15a.json",881],fa69a7f4:[()=>n.e(6798).then(n.t.bind(n,2469,19)),"~docs/guides/version-current-metadata-prop-751.json",2469],fa7546af:[()=>n.e(1611).then(n.t.bind(n,7327,19)),"~docs/references/tag-references-tags-shutdown-0e6.json",7327],fcc63351:[()=>n.e(9743).then(n.t.bind(n,7495,19)),"~docs/default/tag-docs-tags-services-754.json",7495],fd2b74dc:[()=>n.e(4846).then(n.bind(n,949)),"@site/references/Lightning CLI/keys-not-found.md",949],ffc337e7:[()=>n.e(7310).then(n.t.bind(n,2110,19)),"~docs/default/tag-docs-tags-learn-579.json",2110],ffcb1b32:[()=>n.e(5120).then(n.bind(n,8465)),"@site/docs/develop/json-rpc.md",8465]};var s=n(5893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(9670),u=n(226);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},f=[],p=[],g=(0,c.Z)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),o().Map({loading:l,loader:d,modules:f,webpack:()=>p,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;return delete o.__context,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(a,{...o,...n})})}})}const f=[{path:"/blog/",component:d("/blog/","951"),exact:!0},{path:"/blog/archive/",component:d("/blog/archive/","d54"),exact:!0},{path:"/blog/bloom-and-cuckoo-filters-for-cache-summarization/",component:d("/blog/bloom-and-cuckoo-filters-for-cache-summarization/","5a5"),exact:!0},{path:"/blog/tags/",component:d("/blog/tags/","f8d"),exact:!0},{path:"/blog/tags/blog/",component:d("/blog/tags/blog/","dc0"),exact:!0},{path:"/blog/tags/content-routing/",component:d("/blog/tags/content-routing/","f84"),exact:!0},{path:"/blog/tags/engineering/",component:d("/blog/tags/engineering/","6c6"),exact:!0},{path:"/blog/tags/fleek-network/",component:d("/blog/tags/fleek-network/","490"),exact:!0},{path:"/search/",component:d("/search/","2a3"),exact:!0},{path:"/docs/",component:d("/docs/","605"),routes:[{path:"/docs/",component:d("/docs/","7aa"),routes:[{path:"/docs/tags/",component:d("/docs/tags/","71d"),exact:!0},{path:"/docs/tags/about/",component:d("/docs/tags/about/","4e0"),exact:!0},{path:"/docs/tags/algorithms/",component:d("/docs/tags/algorithms/","23a"),exact:!0},{path:"/docs/tags/architecture/",component:d("/docs/tags/architecture/","64c"),exact:!0},{path:"/docs/tags/awards/",component:d("/docs/tags/awards/","7ea"),exact:!0},{path:"/docs/tags/build/",component:d("/docs/tags/build/","0e4"),exact:!0},{path:"/docs/tags/cdn/",component:d("/docs/tags/cdn/","3d4"),exact:!0},{path:"/docs/tags/cli/",component:d("/docs/tags/cli/","cb7"),exact:!0},{path:"/docs/tags/client/",component:d("/docs/tags/client/","7ed"),exact:!0},{path:"/docs/tags/code-of-conduct/",component:d("/docs/tags/code-of-conduct/","b7d"),exact:!0},{path:"/docs/tags/codebase/",component:d("/docs/tags/codebase/","629"),exact:!0},{path:"/docs/tags/command-line-interface/",component:d("/docs/tags/command-line-interface/","b12"),exact:!0},{path:"/docs/tags/compile/",component:d("/docs/tags/compile/","3d0"),exact:!0},{path:"/docs/tags/configuration/",component:d("/docs/tags/configuration/","d0c"),exact:!0},{path:"/docs/tags/consensus/",component:d("/docs/tags/consensus/","5e9"),exact:!0},{path:"/docs/tags/contribute/",component:d("/docs/tags/contribute/","a58"),exact:!0},{path:"/docs/tags/control/",component:d("/docs/tags/control/","8ba"),exact:!0},{path:"/docs/tags/decentralization/",component:d("/docs/tags/decentralization/","516"),exact:!0},{path:"/docs/tags/develop/",component:d("/docs/tags/develop/","010"),exact:!0},{path:"/docs/tags/diagnostic/",component:d("/docs/tags/diagnostic/","9cb"),exact:!0},{path:"/docs/tags/diagnostics/",component:d("/docs/tags/diagnostics/","6bf"),exact:!0},{path:"/docs/tags/economics/",component:d("/docs/tags/economics/","6af"),exact:!0},{path:"/docs/tags/edge-network/",component:d("/docs/tags/edge-network/","d3f"),exact:!0},{path:"/docs/tags/edge-platform/",component:d("/docs/tags/edge-platform/","1fd"),exact:!0},{path:"/docs/tags/fleek-network/",component:d("/docs/tags/fleek-network/","0e0"),exact:!0},{path:"/docs/tags/getting-started/",component:d("/docs/tags/getting-started/","bc6"),exact:!0},{path:"/docs/tags/git/",component:d("/docs/tags/git/","810"),exact:!0},{path:"/docs/tags/guide/",component:d("/docs/tags/guide/","dbf"),exact:!0},{path:"/docs/tags/healthcheck/",component:d("/docs/tags/healthcheck/","008"),exact:!0},{path:"/docs/tags/incentives/",component:d("/docs/tags/incentives/","c6d"),exact:!0},{path:"/docs/tags/learn/",component:d("/docs/tags/learn/","73a"),exact:!0},{path:"/docs/tags/lgtn/",component:d("/docs/tags/lgtn/","6a9"),exact:!0},{path:"/docs/tags/lightning/",component:d("/docs/tags/lightning/","dd1"),exact:!0},{path:"/docs/tags/logs/",component:d("/docs/tags/logs/","d51"),exact:!0},{path:"/docs/tags/manage/",component:d("/docs/tags/manage/","8ec"),exact:!0},{path:"/docs/tags/manual/",component:d("/docs/tags/manual/","c7d"),exact:!0},{path:"/docs/tags/node-status/",component:d("/docs/tags/node-status/","c59"),exact:!0},{path:"/docs/tags/onboarding/",component:d("/docs/tags/onboarding/","bfa"),exact:!0},{path:"/docs/tags/open-source/",component:d("/docs/tags/open-source/","bbc"),exact:!0},{path:"/docs/tags/permissionless/",component:d("/docs/tags/permissionless/","42c"),exact:!0},{path:"/docs/tags/phases/",component:d("/docs/tags/phases/","643"),exact:!0},{path:"/docs/tags/pledge/",component:d("/docs/tags/pledge/","b60"),exact:!0},{path:"/docs/tags/ports/",component:d("/docs/tags/ports/","f53"),exact:!0},{path:"/docs/tags/protocol/",component:d("/docs/tags/protocol/","dfe"),exact:!0},{path:"/docs/tags/repository/",component:d("/docs/tags/repository/","425"),exact:!0},{path:"/docs/tags/reputation/",component:d("/docs/tags/reputation/","32e"),exact:!0},{path:"/docs/tags/requirements/",component:d("/docs/tags/requirements/","64a"),exact:!0},{path:"/docs/tags/rewards/",component:d("/docs/tags/rewards/","a8a"),exact:!0},{path:"/docs/tags/roadmap/",component:d("/docs/tags/roadmap/","af1"),exact:!0},{path:"/docs/tags/rpc/",component:d("/docs/tags/rpc/","4b6"),exact:!0},{path:"/docs/tags/rust-dependencies/",component:d("/docs/tags/rust-dependencies/","260"),exact:!0},{path:"/docs/tags/sdk/",component:d("/docs/tags/sdk/","e09"),exact:!0},{path:"/docs/tags/server/",component:d("/docs/tags/server/","6ce"),exact:!0},{path:"/docs/tags/services/",component:d("/docs/tags/services/","d7f"),exact:!0},{path:"/docs/tags/snarks/",component:d("/docs/tags/snarks/","dad"),exact:!0},{path:"/docs/tags/standards/",component:d("/docs/tags/standards/","83e"),exact:!0},{path:"/docs/tags/systemctl/",component:d("/docs/tags/systemctl/","6a1"),exact:!0},{path:"/docs/tags/systemd/",component:d("/docs/tags/systemd/","6d2"),exact:!0},{path:"/docs/tags/testnet/",component:d("/docs/tags/testnet/","f95"),exact:!0},{path:"/docs/tags/token/",component:d("/docs/tags/token/","e53"),exact:!0},{path:"/docs/tags/tokenomics/",component:d("/docs/tags/tokenomics/","e22"),exact:!0},{path:"/docs/tags/toolkit/",component:d("/docs/tags/toolkit/","7bc"),exact:!0},{path:"/docs/tags/verification/",component:d("/docs/tags/verification/","136"),exact:!0},{path:"/docs/tags/whitepaper/",component:d("/docs/tags/whitepaper/","949"),exact:!0},{path:"/docs/tags/wizard/",component:d("/docs/tags/wizard/","2cb"),exact:!0},{path:"/docs/",component:d("/docs/","b48"),routes:[{path:"/docs/",component:d("/docs/","e7a"),exact:!0,sidebar:"docs"},{path:"/docs/develop/client/",component:d("/docs/develop/client/","720"),exact:!0},{path:"/docs/develop/json-rpc/",component:d("/docs/develop/json-rpc/","3b0"),exact:!0},{path:"/docs/develop/overview/",component:d("/docs/develop/overview/","4ab"),exact:!0},{path:"/docs/develop/service-development/",component:d("/docs/develop/service-development/","a0d"),exact:!0},{path:"/docs/learn/delivery-acknowledgements/",component:d("/docs/learn/delivery-acknowledgements/","76f"),exact:!0,sidebar:"docs"},{path:"/docs/learn/developers/",component:d("/docs/learn/developers/","a5d"),exact:!0,sidebar:"docs"},{path:"/docs/learn/introduction/",component:d("/docs/learn/introduction/","0c9"),exact:!0,sidebar:"docs"},{path:"/docs/learn/services/",component:d("/docs/learn/services/","095"),exact:!0,sidebar:"docs"},{path:"/docs/learn/the-network/",component:d("/docs/learn/the-network/","8fa"),exact:!0,sidebar:"docs"},{path:"/docs/learn/token-and-economics/",component:d("/docs/learn/token-and-economics/","ede"),exact:!0,sidebar:"docs"},{path:"/docs/node/analyzing-logs/",component:d("/docs/node/analyzing-logs/","98d"),exact:!0,sidebar:"docs"},{path:"/docs/node/configuration/",component:d("/docs/node/configuration/","191"),exact:!0},{path:"/docs/node/diagnostics/",component:d("/docs/node/diagnostics/","83b"),exact:!0},{path:"/docs/node/health-check/",component:d("/docs/node/health-check/","59e"),exact:!0,sidebar:"docs"},{path:"/docs/node/install/",component:d("/docs/node/install/","0d6"),exact:!0,sidebar:"docs"},{path:"/docs/node/lightning-cli/",component:d("/docs/node/lightning-cli/","88d"),exact:!0,sidebar:"docs"},{path:"/docs/node/overview/",component:d("/docs/node/overview/","603"),exact:!0,sidebar:"docs"},{path:"/docs/node/requirements/",component:d("/docs/node/requirements/","8ae"),exact:!0,sidebar:"docs"},{path:"/docs/node/systemd-service/",component:d("/docs/node/systemd-service/","a24"),exact:!0,sidebar:"docs"},{path:"/docs/node/testnet-onboarding/",component:d("/docs/node/testnet-onboarding/","2f1"),exact:!0,sidebar:"docs"},{path:"/docs/Open-source/",component:d("/docs/Open-source/","81b"),exact:!0},{path:"/docs/Open-source/code-of-conduct/",component:d("/docs/Open-source/code-of-conduct/","ff8"),exact:!0,sidebar:"docs"},{path:"/docs/Open-source/contributing/",component:d("/docs/Open-source/contributing/","27e"),exact:!0,sidebar:"docs"},{path:"/docs/Open-source/repositories/",component:d("/docs/Open-source/repositories/","93e"),exact:!0,sidebar:"docs"},{path:"/docs/roadmap/",component:d("/docs/roadmap/","532"),exact:!0,sidebar:"docs"},{path:"/docs/whitepaper/",component:d("/docs/whitepaper/","d8d"),exact:!0,sidebar:"docs"}]}]}]},{path:"/guides/",component:d("/guides/","221"),routes:[{path:"/guides/",component:d("/guides/","fe0"),routes:[{path:"/guides/tags/",component:d("/guides/tags/","dae"),exact:!0},{path:"/guides/tags/configuration/",component:d("/guides/tags/configuration/","fea"),exact:!0},{path:"/guides/tags/container/",component:d("/guides/tags/container/","6ef"),exact:!0},{path:"/guides/tags/docker/",component:d("/guides/tags/docker/","06e"),exact:!0},{path:"/guides/tags/edge-computing/",component:d("/guides/tags/edge-computing/","1db"),exact:!0},{path:"/guides/tags/fleek-network/",component:d("/guides/tags/fleek-network/","f99"),exact:!0},{path:"/guides/tags/getting-started/",component:d("/guides/tags/getting-started/","21e"),exact:!0},{path:"/guides/tags/guide/",component:d("/guides/tags/guide/","218"),exact:!0},{path:"/guides/tags/guides/",component:d("/guides/tags/guides/","a6e"),exact:!0},{path:"/guides/tags/help/",component:d("/guides/tags/help/","d58"),exact:!0},{path:"/guides/tags/keys/",component:d("/guides/tags/keys/","61c"),exact:!0},{path:"/guides/tags/keystore/",component:d("/guides/tags/keystore/","873"),exact:!0},{path:"/guides/tags/logs/",component:d("/guides/tags/logs/","9fa"),exact:!0},{path:"/guides/tags/ownership/",component:d("/guides/tags/ownership/","99f"),exact:!0},{path:"/guides/tags/private-keys/",component:d("/guides/tags/private-keys/","a77"),exact:!0},{path:"/guides/tags/public-keys/",component:d("/guides/tags/public-keys/","29f"),exact:!0},{path:"/guides/tags/rebuild/",component:d("/guides/tags/rebuild/","ef7"),exact:!0},{path:"/guides/tags/setup/",component:d("/guides/tags/setup/","e31"),exact:!0},{path:"/guides/tags/transfer/",component:d("/guides/tags/transfer/","874"),exact:!0},{path:"/guides/tags/update/",component:d("/guides/tags/update/","30a"),exact:!0},{path:"/guides/",component:d("/guides/","6c0"),routes:[{path:"/guides/",component:d("/guides/","ef7"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/getting-started/",component:d("/guides/Node Operators/getting-started/","a1f"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/how-to-manage-log-files/",component:d("/guides/Node Operators/how-to-manage-log-files/","951"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/managing-the-keystore/",component:d("/guides/Node Operators/managing-the-keystore/","176"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/running-a-node-in-docker/",component:d("/guides/Node Operators/running-a-node-in-docker/","afa"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/transfering-setup-ownership/",component:d("/guides/Node Operators/transfering-setup-ownership/","2d8"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/updating-lightning/",component:d("/guides/Node Operators/updating-lightning/","a3e"),exact:!0,sidebar:"defaultSidebar"}]}]}]},{path:"/references/",component:d("/references/","d36"),routes:[{path:"/references/",component:d("/references/","d0d"),routes:[{path:"/references/tags/",component:d("/references/tags/","68a"),exact:!0},{path:"/references/tags/backup/",component:d("/references/tags/backup/","d58"),exact:!0},{path:"/references/tags/build/",component:d("/references/tags/build/","97c"),exact:!0},{path:"/references/tags/clean/",component:d("/references/tags/clean/","810"),exact:!0},{path:"/references/tags/clear/",component:d("/references/tags/clear/","e8b"),exact:!0},{path:"/references/tags/cli/",component:d("/references/tags/cli/","16b"),exact:!0},{path:"/references/tags/commands/",component:d("/references/tags/commands/","637"),exact:!0},{path:"/references/tags/container/",component:d("/references/tags/container/","8e1"),exact:!0},{path:"/references/tags/delete/",component:d("/references/tags/delete/","a94"),exact:!0},{path:"/references/tags/docker/",component:d("/references/tags/docker/","042"),exact:!0},{path:"/references/tags/file-permissions/",component:d("/references/tags/file-permissions/","148"),exact:!0},{path:"/references/tags/fix/",component:d("/references/tags/fix/","bd5"),exact:!0},{path:"/references/tags/frozen/",component:d("/references/tags/frozen/","07d"),exact:!0},{path:"/references/tags/help/",component:d("/references/tags/help/","74d"),exact:!0},{path:"/references/tags/idle/",component:d("/references/tags/idle/","109"),exact:!0},{path:"/references/tags/image/",component:d("/references/tags/image/","500"),exact:!0},{path:"/references/tags/keystore/",component:d("/references/tags/keystore/","7e3"),exact:!0},{path:"/references/tags/lightning/",component:d("/references/tags/lightning/","4db"),exact:!0},{path:"/references/tags/lost-keys/",component:d("/references/tags/lost-keys/","dde"),exact:!0},{path:"/references/tags/ownership/",component:d("/references/tags/ownership/","b97"),exact:!0},{path:"/references/tags/permissions/",component:d("/references/tags/permissions/","5ee"),exact:!0},{path:"/references/tags/pkill/",component:d("/references/tags/pkill/","c53"),exact:!0},{path:"/references/tags/process/",component:d("/references/tags/process/","108"),exact:!0},{path:"/references/tags/reference/",component:d("/references/tags/reference/","235"),exact:!0},{path:"/references/tags/references/",component:d("/references/tags/references/","440"),exact:!0},{path:"/references/tags/remove/",component:d("/references/tags/remove/","57a"),exact:!0},{path:"/references/tags/restore/",component:d("/references/tags/restore/","4c9"),exact:!0},{path:"/references/tags/root/",component:d("/references/tags/root/","923"),exact:!0},{path:"/references/tags/service-error/",component:d("/references/tags/service-error/","07d"),exact:!0},{path:"/references/tags/shutdown/",component:d("/references/tags/shutdown/","821"),exact:!0},{path:"/references/tags/sudoer/",component:d("/references/tags/sudoer/","302"),exact:!0},{path:"/references/tags/systemctl/",component:d("/references/tags/systemctl/","56f"),exact:!0},{path:"/references/tags/systemd/",component:d("/references/tags/systemd/","298"),exact:!0},{path:"/references/tags/uninstall/",component:d("/references/tags/uninstall/","dd6"),exact:!0},{path:"/references/tags/unit/",component:d("/references/tags/unit/","882"),exact:!0},{path:"/references/tags/update/",component:d("/references/tags/update/","e1c"),exact:!0},{path:"/references/tags/upgrade/",component:d("/references/tags/upgrade/","ace"),exact:!0},{path:"/references/tags/user-service/",component:d("/references/tags/user-service/","f65"),exact:!0},{path:"/references/",component:d("/references/","7ec"),routes:[{path:"/references/",component:d("/references/","418"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Docker/build-and-run-in-docker/",component:d("/references/Docker/build-and-run-in-docker/","8c9"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Docker/frequently-used-commands-for-docker-setup/",component:d("/references/Docker/frequently-used-commands-for-docker-setup/","070"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Docker/uninstall-docker-setup/",component:d("/references/Docker/uninstall-docker-setup/","ab1"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/backing-up-the-keystore/",component:d("/references/Lightning CLI/backing-up-the-keystore/","4c3"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/error-building-on-arm64/",component:d("/references/Lightning CLI/error-building-on-arm64/","cb1"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/",component:d("/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/","bb4"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/file-permissions-and-ownership/",component:d("/references/Lightning CLI/file-permissions-and-ownership/","974"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/frequently-used-commands-for-native-setup/",component:d("/references/Lightning CLI/frequently-used-commands-for-native-setup/","a39"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/keys-not-found/",component:d("/references/Lightning CLI/keys-not-found/","45f"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/node-secret-key-does-not-exist/",component:d("/references/Lightning CLI/node-secret-key-does-not-exist/","c72"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/permission-denied-os-error-13/",component:d("/references/Lightning CLI/permission-denied-os-error-13/","eed"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/restore-the-keystore/",component:d("/references/Lightning CLI/restore-the-keystore/","d91"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/uninstall-lightning-node/",component:d("/references/Lightning CLI/uninstall-lightning-node/","a83"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/update-cli-from-source-code/",component:d("/references/Lightning CLI/update-cli-from-source-code/","6a3"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Systemd/service-keeps-running-after-shutdown/",component:d("/references/Systemd/service-keeps-running-after-shutdown/","176"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Systemd/shutting-down-persistance/",component:d("/references/Systemd/shutting-down-persistance/","27f"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Systemd/user-service/",component:d("/references/Systemd/user-service/","9d7"),exact:!0,sidebar:"defaultSidebar"}]}]}]},{path:"/",component:d("/","a33"),exact:!0},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(745),a=n(3727),i=n(405),s=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790),f=n(5893);function p(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var g=n(5742),m=n(2263),h=n(4996),b=n(6668),y=n(833),v=n(4711),w=n(9727),k=n(3320),x=n(8780),S=n(197);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.Z)(),r=(0,v.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(g.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.Z)(),{pathname:r}=(0,u.TH)();return e+(0,x.applyTrailingSlash)((0,h.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(g.Z,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function E(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(g.Z,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:w.h})]}),n&&(0,f.jsx)(y.d,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(_,{}),(0,f.jsx)(S.Z,{tag:k.HX,locale:e}),(0,f.jsx)(g.Z,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;function j(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),A=n(8940),N=n(469);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const o=l.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,N.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(O,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(u.AW,{location:t,render:()=>e})})}}const D=I,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${F}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${z}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${z}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function U(){const{siteConfig:{baseUrl:e}}=(0,m.Z)();return(0,f.jsx)(f.Fragment,{children:!s.Z.canUseDOM&&(0,f.jsx)(g.Z,{children:(0,f.jsx)("script",{children:B(e)})})})}function $(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?(0,f.jsx)(U,{}):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,m.Z)(),a=(0,h.Z)(e),{htmlLang:i,direction:s}=o[r];return(0,f.jsxs)(g.Z,{children:[(0,f.jsx)("html",{lang:i,dir:s}),(0,f.jsx)("title",{children:t}),(0,f.jsx)("meta",{property:"og:title",content:t}),(0,f.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,f.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,f.jsx)("link",{rel:"icon",href:a})]})}var H=n(4763),Z=n(2389);function G(){const e=(0,Z.Z)();return(0,f.jsx)(g.Z,{children:(0,f.jsx)("html",{"data-has-hydrated":e})})}function V(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return(0,f.jsx)(H.Z,{children:(0,f.jsx)(A.M,{children:(0,f.jsxs)(L.t,{children:[(0,f.jsxs)(p,{children:[(0,f.jsx)(q,{}),(0,f.jsx)(E,{}),(0,f.jsx)($,{}),(0,f.jsx)(D,{location:j(t),children:e})]}),(0,f.jsx)(G,{})]})})})}var W=n(6887);const K=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Q=n(9670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Q.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),P(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(i.B6,{children:(0,f.jsx)(a.VK,{children:(0,f.jsx)(V,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{o.hydrateRoot(e,t,{onRecoverableError:n})}));else{const a=o.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{a.render(t)}))}};P(window.location.pathname).then(s)}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>f});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-PC422SF","id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"index","docs":[{"id":"develop/client","path":"/docs/develop/client"},{"id":"develop/index","path":"/docs/develop/overview"},{"id":"develop/json-rpc","path":"/docs/develop/json-rpc"},{"id":"develop/service-development","path":"/docs/develop/service-development"},{"id":"index","path":"/docs/","sidebar":"docs"},{"id":"learn/delivery-acknowledgements","path":"/docs/learn/delivery-acknowledgements","sidebar":"docs"},{"id":"learn/developers","path":"/docs/learn/developers","sidebar":"docs"},{"id":"learn/index","path":"/docs/learn/introduction","sidebar":"docs"},{"id":"learn/services","path":"/docs/learn/services","sidebar":"docs"},{"id":"learn/the-network","path":"/docs/learn/the-network","sidebar":"docs"},{"id":"learn/token-and-economics","path":"/docs/learn/token-and-economics","sidebar":"docs"},{"id":"node/analyzing-logs","path":"/docs/node/analyzing-logs","sidebar":"docs"},{"id":"node/configuration","path":"/docs/node/configuration"},{"id":"node/diagnostics","path":"/docs/node/diagnostics"},{"id":"node/health-check","path":"/docs/node/health-check","sidebar":"docs"},{"id":"node/index","path":"/docs/node/overview","sidebar":"docs"},{"id":"node/install","path":"/docs/node/install","sidebar":"docs"},{"id":"node/lightning-cli","path":"/docs/node/lightning-cli","sidebar":"docs"},{"id":"node/requirements","path":"/docs/node/requirements","sidebar":"docs"},{"id":"node/systemd-service","path":"/docs/node/systemd-service","sidebar":"docs"},{"id":"node/testnet-onboarding","path":"/docs/node/testnet-onboarding","sidebar":"docs"},{"id":"Open-source","path":"/docs/Open-source"},{"id":"Open-source/code-of-conduct","path":"/docs/Open-source/code-of-conduct","sidebar":"docs"},{"id":"Open-source/contributing","path":"/docs/Open-source/contributing","sidebar":"docs"},{"id":"Open-source/repositories","path":"/docs/Open-source/repositories","sidebar":"docs"},{"id":"roadmap","path":"/docs/roadmap","sidebar":"docs"},{"id":"whitepaper","path":"/docs/whitepaper","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/docs/","label":"index"}}}}],"breadcrumbs":true},"references":{"path":"/references","versions":[{"name":"current","label":"Next","isLast":true,"path":"/references","mainDocId":"index","docs":[{"id":"Docker/build-and-run-in-docker","path":"/references/Docker/build-and-run-in-docker","sidebar":"defaultSidebar"},{"id":"Docker/frequently-used-commands-for-docker-setup","path":"/references/Docker/frequently-used-commands-for-docker-setup","sidebar":"defaultSidebar"},{"id":"Docker/uninstall-docker-setup","path":"/references/Docker/uninstall-docker-setup","sidebar":"defaultSidebar"},{"id":"index","path":"/references/","sidebar":"defaultSidebar"},{"id":"Lightning CLI/error-building-on-arm64","path":"/references/Lightning CLI/error-building-on-arm64","sidebar":"defaultSidebar"},{"id":"Lightning CLI/error-linking-with-cc-failed","path":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1","sidebar":"defaultSidebar"},{"id":"Lightning CLI/file-permissions-and-ownership","path":"/references/Lightning CLI/file-permissions-and-ownership","sidebar":"defaultSidebar"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","path":"/references/Lightning CLI/frequently-used-commands-for-native-setup","sidebar":"defaultSidebar"},{"id":"Lightning CLI/keys-not-found","path":"/references/Lightning CLI/keys-not-found","sidebar":"defaultSidebar"},{"id":"Lightning CLI/keystore-backup","path":"/references/Lightning CLI/backing-up-the-keystore","sidebar":"defaultSidebar"},{"id":"Lightning CLI/node-secret-key-does-not-exist","path":"/references/Lightning CLI/node-secret-key-does-not-exist","sidebar":"defaultSidebar"},{"id":"Lightning CLI/permission-denied-os-error-13","path":"/references/Lightning CLI/permission-denied-os-error-13","sidebar":"defaultSidebar"},{"id":"Lightning CLI/restore-keystore","path":"/references/Lightning CLI/restore-the-keystore","sidebar":"defaultSidebar"},{"id":"Lightning CLI/uninstall-lightning-node","path":"/references/Lightning CLI/uninstall-lightning-node","sidebar":"defaultSidebar"},{"id":"Lightning CLI/update-cli-from-source-code","path":"/references/Lightning CLI/update-cli-from-source-code","sidebar":"defaultSidebar"},{"id":"Systemd/service-keeps-running-after-shutdown","path":"/references/Systemd/service-keeps-running-after-shutdown","sidebar":"defaultSidebar"},{"id":"Systemd/shutting-down-persistance","path":"/references/Systemd/shutting-down-persistance","sidebar":"defaultSidebar"},{"id":"Systemd/user-service","path":"/references/Systemd/user-service","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/references/","label":"index"}}}}],"breadcrumbs":false},"guides":{"path":"/guides","versions":[{"name":"current","label":"Next","isLast":true,"path":"/guides","mainDocId":"index","docs":[{"id":"index","path":"/guides/","sidebar":"defaultSidebar"},{"id":"Node Operators/getting-started-guide","path":"/guides/Node Operators/getting-started","sidebar":"defaultSidebar"},{"id":"Node Operators/how-to-manage-logfiles","path":"/guides/Node Operators/how-to-manage-log-files","sidebar":"defaultSidebar"},{"id":"Node Operators/managing-the-keystore","path":"/guides/Node Operators/managing-the-keystore","sidebar":"defaultSidebar"},{"id":"Node Operators/running-a-node-in-docker","path":"/guides/Node Operators/running-a-node-in-docker","sidebar":"defaultSidebar"},{"id":"Node Operators/transfering-setup-ownership","path":"/guides/Node Operators/transfering-setup-ownership","sidebar":"defaultSidebar"},{"id":"Node Operators/updating-lightning","path":"/guides/Node Operators/updating-lightning","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/guides/","label":"index"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(7529);const l=JSON.parse('{"docusaurusVersion":"3.0.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.0.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.0.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.0.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.0.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.0.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.0.0"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"3.0.0"}}}');var c=n(5893);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function f(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),o=n(412),a=n(5742),i=n(8780),s=n(8888),l=n(5893);function c(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(u,{error:t})]})}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(p,{fallback:()=>(0,l.jsx)(c,{error:t,tryAgain:n}),children:[(0,l.jsx)(a.Z,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.Z,{children:(0,l.jsx)(c,{error:t,tryAgain:n})})]})}const f=e=>(0,l.jsx)(d,{...e});class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??f)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(405),o=n(5893);function a(e){return(0,o.jsx)(r.ql,{...e})}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),o=n(3727),a=n(8780),i=n(2263),s=n(3919),l=n(412),c=n(5893);const u=r.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:k}=(0,d.C)(),x=(0,r.useContext)(u),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=f||p;const C=(0,s.Z)(_),E=_?.replace("pathname://","");let T=void 0!==E?(j=E,b&&(e=>e.startsWith("/"))(j)?k(j):j):void 0;var j;T&&C&&(T=(0,a.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const L=(0,r.useRef)(!1),A=n?o.OL:o.rU,N=l.Z.canUseIntersectionObserver,R=(0,r.useRef)(),O=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,r.useEffect)((()=>(!N&&C&&null!=T&&window.docusaurus.prefetch(T),()=>{N&&R.current&&R.current.disconnect()})),[R,T,N,C]);const P=T?.startsWith("#")??!1,I=!T||!C||P;return I||h||x.collectLink(T),I?(0,c.jsx)("a",{ref:S,href:T,..._&&!C&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,c.jsx)(A,{...y,onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,N&&e&&C&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),R.current.observe(e))},to:T,...n&&{isActive:m,activeClassName:g}})}const p=r.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(7294),o=n(5893);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(7529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(7294),o=n(2263),a=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8940);function a(){return(0,r.useContext)(o._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8934);function a(){return(0,r.useContext)(o._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>g,_r:()=>d,Jo:()=>y,zh:()=>f,yW:()=>h,gB:()=>m});var r=n(6550),o=n(2263),a=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function g(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function m(e){return f(e).versions}function h(e){const t=f(e);return s(t)}function b(e){const t=f(e),{pathname:n}=(0,r.TH)();return c(t,n)}function y(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(204),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(7294);var r=n(4334),o=n(5999),a=n(6668),i=n(9960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var l=n(5893);function c(e){let{as:t,id:n,...c}=e;const{navbar:{hideOnScroll:u}}=(0,a.L)();if("h1"===t||!n)return(0,l.jsx)(t,{...c,id:void 0});const d=(0,o.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,l.jsxs)(t,{...c,className:(0,r.Z)("anchor",u?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,l.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(5893);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},8888:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Nt});var r=n(7294),o=n(4334),a=n(4763),i=n(833),s=n(6550),l=n(5999),c=n(5936),u=n(5893);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=p();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(5281),b=n(9727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var w=n(6668),k=n(9689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.Z)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const C={content:"content_knG7"};function E(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(E,{className:T.announcementBarContent}),a&&(0,u.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var L=n(3163),A=n(2466);var N=n(902),R=n(3102);const O=r.createContext(null);function P(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,R.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,N.D9)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(O.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(O);if(!e)throw new N.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,R.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(2949),z=n(2389);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.Z)($.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.Z)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.Z)($.toggleIcon,$.lightToggleIcon)}),(0,u.jsx)(U,{className:(0,o.Z)($.toggleIcon,$.darkToggleIcon)})]})})}const H=r.memo(q),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.I)();return r?null:(0,u.jsx)(H,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var V=n(1327);function W(){return(0,u.jsx)(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,L.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(W,{}),(0,u.jsx)(G,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Y=n(9960),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Z)(r),f=(0,X.Z)(t),p=(0,X.Z)(o,{forcePrependBaseUrl:!0}),g=a&&o&&!(0,J.Z)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,g&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Y.Z,{href:l?p:o,...c,...m}):(0,u.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(f)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.Z)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6043),se=n(8596),le=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.Z)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(qe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function de(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ce(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[c,d,g]),(0,u.jsxs)("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,u.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(qe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?de:ue;return(0,u.jsx)(r,{...n})}var pe=n(4711);function ge(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const me="iconLanguage_nlXk";function he(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var be=n(830),ye=["translations"];function ve(){return ve=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},ve.apply(this,arguments)}function we(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,a=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(l){s=!0,o=l}finally{try{i||null==n.return||n.return()}finally{if(s)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return ke(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ke(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ke(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function xe(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Se="Ctrl";var _e=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=xe(e,ye),i=o.buttonText,s=void 0===i?"Search":i,l=o.buttonAriaLabel,c=void 0===l?"Search":l,u=we((0,r.useState)(null),2),d=u[0],f=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Se))}),[]),r.createElement("button",ve({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(be.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Se?r.createElement(he,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Ce=n(5742),Ee=n(6177),Te=n(239),je=n(3320);var Le=n(3935);const Ae={button:{buttonText:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ne=null;function Re(e){let{hit:t,children:n}=e;return(0,u.jsx)(Y.Z,{to:t.url,children:n})}function Oe(e){let{state:t,onClose:n}=e;const r=(0,Ee.M)();return(0,u.jsx)(Y.Z,{to:r(t.query),onClick:n,children:(0,u.jsx)(l.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Pe(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,le.Z)(),l=(0,Te.l)(),c=function(){const{locale:e,tags:t}=(0,je._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,p={...a.searchParameters,facetFilters:f},g=(0,s.k6)(),m=(0,r.useRef)(null),h=(0,r.useRef)(null),[b,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Ne?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,6672)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Ne=t}))),[]),x=(0,r.useCallback)((()=>{k().then((()=>{m.current=document.createElement("div"),document.body.insertBefore(m.current,document.body.firstChild),y(!0)}))}),[k,y]),S=(0,r.useCallback)((()=>{y(!1),m.current?.remove()}),[y]),_=(0,r.useCallback)((e=>{k().then((()=>{y(!0),w(e.key)}))}),[k,y,w]),C=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(o,t)?window.location.href=t:g.push(t)}}).current,E=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:l(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,u.jsx)(Oe,{...e,onClose:S})),[S]),j=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:b,onOpen:x,onClose:S,onInput:_,searchButtonRef:h}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ce.Z,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(_e,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:x,ref:h,translations:Ae.button}),b&&Ne&&m.current&&(0,Le.createPortal)((0,u.jsx)(Ne,{onClose:S,initialScrollY:window.scrollY,initialQuery:v,navigator:C,transformItems:E,hitComponent:Re,transformSearchClient:j,...a.searchPagePath&&{resultsFooterComponent:T},...a,searchParameters:p,placeholder:Ae.placeholder,translations:Ae.modal}),m.current)]})}function Ie(){const{siteConfig:e}=(0,le.Z)();return(0,u.jsx)(Pe,{...e.themeConfig.algolia})}const De={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Me(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.Z)(n,De.navbarSearchContainer),children:t})}var Fe=n(143),ze=n(2802);var Be=n(373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const $e={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),f=(0,pe.l)(),{search:p,hash:g}=(0,s.TH)(),m=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ge,{className:me}),h]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Me,{className:n,children:(0,u.jsx)(Ie,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.Z)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Fe.Iw)(r),i=(0,ze.vY)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Fe.Iw)(r),i=(0,ze.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ze.lO)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.TH)(),f=(0,Fe.Iw)(n),p=(0,Fe.gB)(n),{savePreferredVersionName:g}=(0,Be.J)(n),m=[...o,...p.map((e=>{const t=f.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...a],h=(0,ze.lO)(n)[0],b=t&&m.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&m.length>1?void 0:Ue(h).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function qe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=$e[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function He(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(qe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ze(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ge(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ze,{onClick:()=>t.hide()}),t.content]})}function Ve(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(M,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(He,{}),secondaryMenu:(0,u.jsx)(Ge,{})}):null}const We={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ke(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.Z)("navbar-sidebar__backdrop",e.className)})}function Qe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,A.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<a.current)return void n(!0);if(o.current)return void(o.current=!1);const s=r?.scrollY,l=document.documentElement.scrollHeight-a.current,c=window.innerHeight;s&&i>=s?n(!1):i+c<l&&n(!0)})),(0,c.S)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[We.navbarHideable,!d&&We.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ke,{onClick:i.toggle}),(0,u.jsx)(Ve,{})]})}const Ye="right";function Xe(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Je(){const{toggle:e,shown:t}=(0,L.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Xe,{})})}const et={colorModeToggle:"colorModeToggle_x44X"};function tt(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,r.createElement)(qe,{...e,key:t})))})}function nt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function rt(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Ye)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(nt,{left:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)("div",{children:[!e.disabled&&(0,u.jsx)(Je,{}),(0,u.jsx)(W,{}),(0,u.jsx)(tt,{items:n})]}),(0,u.jsx)("div",{children:!o&&(0,u.jsx)(Me,{children:(0,u.jsx)(Ie,{})})})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(tt,{items:r}),(0,u.jsx)(G,{className:et.colorModeToggle})]})})}function ot(){return(0,u.jsx)(Qe,{children:(0,u.jsx)(rt,{})})}function at(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Z)(n),l=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function it(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(at,{item:t})},t.href??t.to)}function st(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(it,{item:e},t)))})]})}function lt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(st,{column:e},t)))})}function ct(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function ut(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(at,{item:t})}function dt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(ut,{item:e}),t.length!==n+1&&(0,u.jsx)(ct,{})]},n)))})})}function ft(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(lt,{columns:t}):(0,u.jsx)(dt,{links:t})}var pt=n(9965);const gt={footerLogoLink:"footerLogoLink_BH7S"};function mt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(pt.Z,{className:(0,o.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function ht(e){let{logo:t}=e;return t.href?(0,u.jsx)(Y.Z,{href:t.href,className:gt.footerLogoLink,target:t.target,children:(0,u.jsx)(mt,{logo:t})}):(0,u.jsx)(mt,{logo:t})}function bt(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}var yt=n(512);function vt(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,yt.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--left",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function wt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(vt,{style:o,links:n&&n.length>0&&(0,u.jsx)(ft,{links:n}),logo:r&&(0,u.jsx)(ht,{logo:r}),copyright:t&&(0,u.jsx)(bt,{copyright:t})})}const kt=r.memo(wt),xt=(0,N.Qc)([F.S,k.pl,A.OC,Be.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(R.n2,{children:(0,u.jsx)(L.M,{children:(0,u.jsx)(P,{children:t})})})}]);function St(e){let{children:t}=e;return(0,u.jsx)(xt,{children:t})}var _t=n(8780);const Ct={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Et(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Tt(e){let{error:t}=e;const n=(0,_t.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Ct.errorBoundaryError,children:n})}r.Component;var jt=n(2503);function Lt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(jt.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Et,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Tt,{error:t})})]})})})}const At={mainWrapper:"mainWrapper_z2l0"};function Nt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,u.jsxs)(St,{children:[(0,u.jsx)(i.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(j,{}),(0,u.jsx)(ot,{}),(0,u.jsx)("div",{id:d,className:(0,o.Z)(h.k.wrapper.main,At.mainWrapper,r),children:(0,u.jsx)(a.Z,{fallback:e=>(0,u.jsx)(Lt,{...e}),children:t})}),!n&&(0,u.jsx)(kt,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(9960),o=n(4996),a=n(2263),i=n(6668),s=n(9965),l=n(5893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Z)(t.src),dark:(0,o.Z)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...f}=e,p=(0,o.Z)(s?.href||"/"),g=n?"":t,m=s?.alt??g;return(0,l.jsxs)(r.Z,{to:p,...f,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(5742),o=n(5893);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.Z,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),o=n(7459),a=n(2389),i=n(2949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(5893);function c(e){let{className:t,children:n}=e;const c=(0,a.Z)(),{colorMode:u}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>b});var r=n(7294),o=n(412),a=n(469),i=n(1442),s=n(5893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return f(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.Z.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(u.current,n),i?.(n))},className:l,children:o})}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.Z)((()=>{t||i(!0)}),[t]),(0,a.Z)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:m;return(0,s.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>g});var r=n(7294),o=n(2389),a=n(12),i=n(902),s=n(6668),l=n(5893);const c=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),f=e=>c.set(String(e)),p=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&f(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(p.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>h});var r=n(7294),o=n(412),a=n(902),i=n(12),s=n(6668),l=n(5893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,g=e=>o.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{d.set(p(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[o,a]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>b,Oh:()=>w});var r=n(7294),o=n(143),a=n(9935),i=n(6668),s=n(2802),l=n(902),c=n(12),u=n(5893);const d=e=>`docs-preferred-version-${e}`,f={save:(e,t,n)=>{(0,c.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(d(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const g=r.createContext(null);function m(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=f.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(f.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){f.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return(0,u.jsx)(g.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.cE?(0,u.jsx)(h,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(g);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,o._r)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(7294),o=n(902),a=n(5893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),o=n(3102),a=n(7524),i=n(1980),s=n(6668),l=n(902),c=n(5893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function f(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function p(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(7294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>s,M:()=>l});var r=n(7294),o=n(2263),a=n(1980);const i="q";function s(){return(0,a.Nc)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(7294),o=n(412);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){const[e,t]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){t(function(){if(!o.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>i?a.desktop:a.mobile}())}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{LM:()=>p,_F:()=>h,cE:()=>f,SN:()=>_,lO:()=>k,vY:()=>S,oz:()=>x,s1:()=>w,f:()=>y});var r=n(7294),o=n(6550),a=n(8790),i=n(143),s=n(373),l=n(4477),c=n(1116);function u(e){return Array.from(new Set(e))}var d=n(8596);const f=!!i._r;function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}const g=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return h(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||h(e,t);default:return!1}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function w(){const e=(0,c.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,o].filter(Boolean))),[t,n,o])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.TH)(),r=(0,l.E)(),i=t.routes,s=i.find((e=>(0,o.LX)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.H)(i),sidebarName:c,sidebarItems:u}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(2263);function o(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>l,Rb:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){!function(e){const t=(0,o.k6)(),n=(0,a.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,o.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function l(e){const t=s(e)??"",n=function(){const e=(0,o.k6)();return(0,r.useCallback)(((t,n,r)=>{const o=new URLSearchParams(e.location.search);n?o.set(t,n):o.delete(t),(r?.push?e.push:e.replace)({search:o.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>d,VC:()=>g});var r=n(7294),o=n(7459),a=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),c=n(2128),u=n(5893);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const s=(0,c.p)(t),{withBaseUrl:d}=(0,l.C)(),f=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.Z,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,u.jsx)("meta",{property:"og:image",content:f}),f&&(0,u.jsx)("meta",{name:"twitter:image",content:f}),i]})}const f=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(f),s=(0,o.Z)(i,t);return(0,u.jsxs)(f.Provider,{value:s,children:[(0,u.jsx)(a.Z,{children:(0,u.jsx)("html",{className:s})}),n]})}function g(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(p,{className:(0,o.Z)(r,a),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>i});var r=n(7294),o=n(469),a=n(5893);function i(e){const t=(0,r.useRef)(e);return(0,o.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(7294),o=n(723),a=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>c,RF:()=>f});var r=n(7294),o=n(412),a=n(2389),i=(n(469),n(902)),s=n(5893);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const d=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>l,os:()=>s});var r=n(143),o=n(2263),a=n(373);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,o.Z)(),t=(0,r._r)(),n=(0,r.WS)(),l=(0,a.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=l[e],a=t[e].versions.find((e=>e.isLast));return s(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>l});n(7294);const r="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=a(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),o=n(6550),a=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,o.TH)(),c=(0,a.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(7294),o=n(8022),a=n(4996),i=n(6278);function s(){const{withBaseUrl:e}=(0,a.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.F)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[o]=e.split(/[#?]/),a="/"===o||o===r?o:(i=o,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(o,a)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}});var a=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return a.getErrorCausalChain}})},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>E,ob:()=>p,PP:()=>j,Ep:()=>f});var r=n(7462);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],s=e&&o(e),l=t&&o(t),c=s||l;if(e&&o(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?a(i,f):".."===p?(a(i,f),d++):d&&(a(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function p(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var m=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",y="hashchange";function v(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),m||(0,s.Z)(!1);var t,n=window.history,o=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,a=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,w=void 0!==c&&c,k=i.getUserConfirmation,x=void 0===k?h:k,S=i.keyLength,_=void 0===S?6:S,C=e.basename?d(l(e.basename)):"";function E(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return C&&(a=u(a,C)),p(a,r,n)}function T(){return Math.random().toString(36).substr(2,_)}var j=g();function L(e){(0,r.Z)(U,e),U.length=n.length,j.notifyListeners(U.location,U.action)}function A(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||O(E(e.state))}function N(){O(E(v()))}var R=!1;function O(e){if(R)R=!1,L();else{j.confirmTransitionTo(e,"POP",x,(function(t){t?L({action:"POP",location:e}):function(e){var t=U.location,n=I.indexOf(t.key);-1===n&&(n=0);var r=I.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(R=!0,M(o))}(e)}))}}var P=E(v()),I=[P.key];function D(e){return C+f(e)}function M(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,A),a&&window.addEventListener(y,N)):0===F&&(window.removeEventListener(b,A),a&&window.removeEventListener(y,N))}var B=!1;var U={length:n.length,action:"POP",location:P,createHref:D,push:function(e,t){var r="PUSH",a=p(e,t,T(),U.location);j.confirmTransitionTo(a,r,x,(function(e){if(e){var t=D(a),i=a.key,s=a.state;if(o)if(n.pushState({key:i,state:s},null,t),w)window.location.href=t;else{var l=I.indexOf(U.location.key),c=I.slice(0,l+1);c.push(a.key),I=c,L({action:r,location:a})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,T(),U.location);j.confirmTransitionTo(a,r,x,(function(e){if(e){var t=D(a),i=a.key,s=a.state;if(o)if(n.replaceState({key:i,state:s},null,t),w)window.location.replace(t);else{var l=I.indexOf(U.location.key);-1!==l&&(I[l]=a.key),L({action:r,location:a})}else window.location.replace(t)}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=j.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=j.appendListener(e);return z(1),function(){z(-1),t()}}};return U}var k="hashchange",x={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+c(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:c,decodePath:l},slash:{encodePath:l,decodePath:l}};function S(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function _(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function C(e){window.location.replace(S(window.location.href)+"#"+e)}function E(e){void 0===e&&(e={}),m||(0,s.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?h:o,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(l(e.basename)):"",y=x[c],v=y.encodePath,w=y.decodePath;function E(){var e=w(_());return b&&(e=u(e,b)),p(e)}var T=g();function j(e){(0,r.Z)(B,e),B.length=t.length,T.notifyListeners(B.location,B.action)}var L=!1,A=null;function N(){var e,t,n=_(),r=v(n);if(n!==r)C(r);else{var o=E(),i=B.location;if(!L&&(t=o,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(A===f(o))return;A=null,function(e){if(L)L=!1,j();else{var t="POP";T.confirmTransitionTo(e,t,a,(function(n){n?j({action:t,location:e}):function(e){var t=B.location,n=I.lastIndexOf(f(t));-1===n&&(n=0);var r=I.lastIndexOf(f(e));-1===r&&(r=0);var o=n-r;o&&(L=!0,D(o))}(e)}))}}(o)}}var R=_(),O=v(R);R!==O&&C(O);var P=E(),I=[f(P)];function D(e){t.go(e)}var M=0;function F(e){1===(M+=e)&&1===e?window.addEventListener(k,N):0===M&&window.removeEventListener(k,N)}var z=!1;var B={length:t.length,action:"POP",location:P,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=S(window.location.href)),n+"#"+v(b+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=f(r),o=v(b+t);if(_()!==o){A=t,function(e){window.location.hash=e}(o);var a=I.lastIndexOf(f(B.location)),i=I.slice(0,a+1);i.push(t),I=i,j({action:n,location:r})}else j()}}))},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,B.location);T.confirmTransitionTo(r,n,a,(function(e){if(e){var t=f(r),o=v(b+t);_()!==o&&(A=t,C(o));var a=I.indexOf(f(B.location));-1!==a&&(I[a]=t),j({action:n,location:r})}}))},go:D,goBack:function(){D(-1)},goForward:function(){D(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=T.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function T(e,t,n){return Math.min(Math.max(e,t),n)}function j(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,i=t.initialIndex,s=void 0===i?0:i,l=t.keyLength,c=void 0===l?6:l,u=g();function d(e){(0,r.Z)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function m(){return Math.random().toString(36).substr(2,c)}var h=T(s,0,a.length-1),b=a.map((function(e){return p(e,void 0,"string"==typeof e?m():e.key||m())})),y=f;function v(e){var t=T(w.index+e,0,w.entries.length-1),r=w.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:y,push:function(e,t){var r="PUSH",o=p(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},8679:(e,t,n)=>{"use strict";var r=n(9864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=p(n);o&&o!==g&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),h=0;h<i.length;++h){var b=i[h];if(!(a[b]||r&&r[b]||m&&m[b]||s&&s[b])){var y=f(n,b);try{c(t,b,y)}catch(v){}}}}return t}},1143:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},4779:(e,t,n)=>{var r=n(5826);e.exports=p,e.exports.parse=a,e.exports.compile=function(e,t){return s(a(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=f;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],f=n[1],p=n.index;if(s+=e.slice(i,p),i=p+d.length,f)s+=f[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],y=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var k=null!=m&&null!=g&&g!==m,x="+"===v||"*"===v,S="?"===v||"*"===v,_=n[2]||u,C=b||y;r.push({name:h||a++,prefix:m||"",delimiter:_,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:C?c(C):w?".*":"[^"+l(_)+"]+?"})}}return i<e.length&&(s+=e.substr(i)),s&&r.push(s),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(e,t){for(var n=new Array(e.length),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",d(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=s[u.name];if(null==f){if(u.optional){u.partial&&(a+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=l(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");a+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');a+=u.prefix+d}}else a+=u}return a}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,i="",s=0;s<e.length;s++){var c=e[s];if("string"==typeof c)i+=l(c);else{var f=l(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var g=l(n.delimiter||"/"),m=i.slice(-g.length)===g;return o||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=a?"$":o&&m?"":"(?="+g+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(p(e[o],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(a(e,n),t,n)}(e,t,n)}},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),o=n(9642),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),a.add(e)}))}i.silent=!1,e.exports=i},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l<s.length&&!(o>=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),g=f.indexOf(p);if(g>-1){++o;var m=f.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(g+p.length),y=[];m&&y.push.apply(y,i([m])),y.push(h),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},6726:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6726},6500:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function o(r,a){if(!(r in n)){a.push(r);var i=a.indexOf(r);if(i<a.length-1)throw new Error("Circular dependency: "+a.slice(i).join(" -> "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in o(t,a),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var f,p=r(l),g=u;o(g);){for(var m in f={},g){var h=l[m];t(h&&h.modify,(function(e){e in d&&(f[e]=!0)}))}for(var b in d)if(!(b in u))for(var y in p(b))if(y in u){f[b]=!0;break}for(var v in g=f)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var f=i(u.map((function(e){var t=c(e);return delete l[e],t})));a?o=a(f,(function(){return r(e)})):r(e)}return s[e]=o}for(var u in n)c(u);var d=[];for(var f in l)d.push(s[f]);return i(d)}(p,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),o=n(3840);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var i=new Set,s={};function l(e,t){c(e,t),c(e+"Capture",t)}function c(e,t){for(s[e]=t,e=0;e<t.length;e++)i.add(t[e])}var u=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),d=Object.prototype.hasOwnProperty,f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},g={};function m(e,t,n,r,o,a,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=i}var h={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){h[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];h[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){h[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){h[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){h[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){h[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){h[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){h[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){h[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var b=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function v(e,t,n,r){var o=h.hasOwnProperty(t)?h[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(g,e)||!d.call(p,e)&&(f.test(e)?g[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(b,y);h[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),h.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){h[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,k=Symbol.for("react.element"),x=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),_=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),E=Symbol.for("react.provider"),T=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),L=Symbol.for("react.suspense"),A=Symbol.for("react.suspense_list"),N=Symbol.for("react.memo"),R=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var O=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var P=Symbol.iterator;function I(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=P&&e[P]||e["@@iterator"])?e:null}var D,M=Object.assign;function F(e){if(void 0===D)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);D=t&&t[1]||""}return"\n"+D+e}var z=!1;function B(e,t){if(!e||z)return"";z=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes("<anonymous>")&&(l=l.replace("<anonymous>",e.displayName)),l}}while(1<=i&&0<=s);break}}}finally{z=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?F(e):""}function U(e){switch(e.tag){case 5:return F(e.type);case 16:return F("Lazy");case 13:return F("Suspense");case 19:return F("SuspenseList");case 0:case 2:case 15:return e=B(e.type,!1);case 11:return e=B(e.type.render,!1);case 1:return e=B(e.type,!0);default:return""}}function $(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case S:return"Fragment";case x:return"Portal";case C:return"Profiler";case _:return"StrictMode";case L:return"Suspense";case A:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case E:return(e._context.displayName||"Context")+".Provider";case j:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case N:return null!==(t=e.displayName||null)?t:$(e.type)||"Memo";case R:t=e._payload,e=e._init;try{return $(e(t))}catch(n){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return $(t);case 8:return t===_?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function Z(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function G(e){e._valueTracker||(e._valueTracker=function(e){var t=Z(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function V(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Z(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function W(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function K(e,t){var n=t.checked;return M({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Q(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Y(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function X(e,t){Y(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&W(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return M({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(te(n)){if(1<n.length)throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ae(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function se(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?se(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ce,ue,de=(ue=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ce=ce||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ge=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||pe.hasOwnProperty(e)&&pe[e]?(""+t).trim():t+"px"}function he(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(pe).forEach((function(e){ge.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var be=M({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function ke(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var xe=null,Se=null,_e=null;function Ce(e){if(e=wo(e)){if("function"!=typeof xe)throw Error(a(280));var t=e.stateNode;t&&(t=xo(t),xe(e.stateNode,e.type,t))}}function Ee(e){Se?_e?_e.push(e):_e=[e]:Se=e}function Te(){if(Se){var e=Se,t=_e;if(_e=Se=null,Ce(e),t)for(e=0;e<t.length;e++)Ce(t[e])}}function je(e,t){return e(t)}function Le(){}var Ae=!1;function Ne(e,t,n){if(Ae)return e(t,n);Ae=!0;try{return je(e,t,n)}finally{Ae=!1,(null!==Se||null!==_e)&&(Le(),Te())}}function Re(e,t){var n=e.stateNode;if(null===n)return null;var r=xo(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(a(231,t,typeof n));return n}var Oe=!1;if(u)try{var Pe={};Object.defineProperty(Pe,"passive",{get:function(){Oe=!0}}),window.addEventListener("test",Pe,Pe),window.removeEventListener("test",Pe,Pe)}catch(ue){Oe=!1}function Ie(e,t,n,r,o,a,i,s,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var De=!1,Me=null,Fe=!1,ze=null,Be={onError:function(e){De=!0,Me=e}};function Ue(e,t,n,r,o,a,i,s,l){De=!1,Me=null,Ie.apply(Be,arguments)}function $e(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if($e(e)!==e)throw Error(a(188))}function Ze(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=$e(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var i=o.alternate;if(null===i){if(null!==(r=o.return)){n=r;continue}break}if(o.child===i.child){for(i=o.child;i;){if(i===n)return He(o),e;if(i===r)return He(o),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=o,r=i;else{for(var s=!1,l=o.child;l;){if(l===n){s=!0,n=o,r=i;break}if(l===r){s=!0,r=o,n=i;break}l=l.sibling}if(!s){for(l=i.child;l;){if(l===n){s=!0,n=i,r=o;break}if(l===r){s=!0,r=i,n=o;break}l=l.sibling}if(!s)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e))?Ge(e):null}function Ge(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ge(e);if(null!==t)return t;e=e.sibling}return null}var Ve=o.unstable_scheduleCallback,We=o.unstable_cancelCallback,Ke=o.unstable_shouldYield,Qe=o.unstable_requestPaint,Ye=o.unstable_now,Xe=o.unstable_getCurrentPriorityLevel,Je=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,at=null;var it=Math.clz32?Math.clz32:function(e){return e>>>=0,0===e?32:31-(st(e)/lt|0)|0},st=Math.log,lt=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var s=i&~o;0!==s?r=dt(s):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&0==(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&0!=(4194240&a)))return t;if(0!=(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-it(t)),r|=e[n],t&=~o;return r}function pt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function gt(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function mt(){var e=ct;return 0==(4194240&(ct<<=1))&&(ct=64),e}function ht(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var vt=0;function wt(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}var kt,xt,St,_t,Ct,Et=!1,Tt=[],jt=null,Lt=null,At=null,Nt=new Map,Rt=new Map,Ot=[],Pt="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function It(e,t){switch(e){case"focusin":case"focusout":jt=null;break;case"dragenter":case"dragleave":Lt=null;break;case"mouseover":case"mouseout":At=null;break;case"pointerover":case"pointerout":Nt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Rt.delete(t.pointerId)}}function Dt(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=wo(t))&&xt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Mt(e){var t=vo(e.target);if(null!==t){var n=$e(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=qe(n)))return e.blockedOn=t,void Ct(e.priority,(function(){St(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Ft(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Kt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=wo(n))&&xt(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);we=r,n.target.dispatchEvent(r),we=null,t.shift()}return!0}function zt(e,t,n){Ft(e)&&n.delete(t)}function Bt(){Et=!1,null!==jt&&Ft(jt)&&(jt=null),null!==Lt&&Ft(Lt)&&(Lt=null),null!==At&&Ft(At)&&(At=null),Nt.forEach(zt),Rt.forEach(zt)}function Ut(e,t){e.blockedOn===t&&(e.blockedOn=null,Et||(Et=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Bt)))}function $t(e){function t(t){return Ut(t,e)}if(0<Tt.length){Ut(Tt[0],e);for(var n=1;n<Tt.length;n++){var r=Tt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==jt&&Ut(jt,e),null!==Lt&&Ut(Lt,e),null!==At&&Ut(At,e),Nt.forEach(t),Rt.forEach(t),n=0;n<Ot.length;n++)(r=Ot[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Ot.length&&null===(n=Ot[0]).blockedOn;)Mt(n),null===n.blockedOn&&Ot.shift()}var qt=w.ReactCurrentBatchConfig,Ht=!0;function Zt(e,t,n,r){var o=vt,a=qt.transition;qt.transition=null;try{vt=1,Vt(e,t,n,r)}finally{vt=o,qt.transition=a}}function Gt(e,t,n,r){var o=vt,a=qt.transition;qt.transition=null;try{vt=4,Vt(e,t,n,r)}finally{vt=o,qt.transition=a}}function Vt(e,t,n,r){if(Ht){var o=Kt(e,t,n,r);if(null===o)Hr(e,t,r,Wt,n),It(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return jt=Dt(jt,e,t,n,r,o),!0;case"dragenter":return Lt=Dt(Lt,e,t,n,r,o),!0;case"mouseover":return At=Dt(At,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return Nt.set(a,Dt(Nt.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,Rt.set(a,Dt(Rt.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(It(e,r),4&t&&-1<Pt.indexOf(e)){for(;null!==o;){var a=wo(o);if(null!==a&&kt(a),null===(a=Kt(e,t,n,r))&&Hr(e,t,r,Wt,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Wt=null;function Kt(e,t,n,r){if(Wt=null,null!==(e=vo(e=ke(r))))if(null===(t=$e(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=qe(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Wt=e,null}function Qt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Xe()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Yt=null,Xt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Xt,r=n.length,o="value"in Yt?Yt.value:Yt.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Jt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,sn,ln,cn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},un=on(cn),dn=M({},cn,{view:0,detail:0}),fn=on(dn),pn=M({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Cn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==ln&&(ln&&"mousemove"===e.type?(an=e.screenX-ln.screenX,sn=e.screenY-ln.screenY):sn=an=0,ln=e),an)},movementY:function(e){return"movementY"in e?e.movementY:sn}}),gn=on(pn),mn=on(M({},pn,{dataTransfer:0})),hn=on(M({},dn,{relatedTarget:0})),bn=on(M({},cn,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=M({},cn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),vn=on(yn),wn=on(M({},cn,{data:0})),kn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},xn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function _n(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Sn[e])&&!!t[e]}function Cn(){return _n}var En=M({},dn,{key:function(e){if(e.key){var t=kn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?xn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Cn,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Tn=on(En),jn=on(M({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Ln=on(M({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Cn})),An=on(M({},cn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Nn=M({},pn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Rn=on(Nn),On=[9,13,27,32],Pn=u&&"CompositionEvent"in window,In=null;u&&"documentMode"in document&&(In=document.documentMode);var Dn=u&&"TextEvent"in window&&!In,Mn=u&&(!Pn||In&&8<In&&11>=In),Fn=String.fromCharCode(32),zn=!1;function Bn(e,t){switch(e){case"keyup":return-1!==On.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Un(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var $n=!1;var qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Zn(e,t,n,r){Ee(r),0<(t=Gr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Gn=null,Vn=null;function Wn(e){Fr(e,0)}function Kn(e){if(V(ko(e)))return e}function Qn(e,t){if("change"===e)return t}var Yn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Yn=Xn&&(!document.documentMode||9<document.documentMode)}function tr(){Gn&&(Gn.detachEvent("onpropertychange",nr),Vn=Gn=null)}function nr(e){if("value"===e.propertyName&&Kn(Vn)){var t=[];Zn(t,Vn,e,ke(e)),Ne(Wn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Vn=n,(Gn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Kn(Vn)}function ar(e,t){if("click"===e)return Kn(t)}function ir(e,t){if("input"===e||"change"===e)return Kn(t)}var sr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function lr(e,t){if(sr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!sr(e[o],t[o]))return!1}return!0}function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ur(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function fr(){for(var e=window,t=W();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=W((e=t.contentWindow).document)}return t}function pr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function gr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var mr=u&&"documentMode"in document&&11>=document.documentMode,hr=null,br=null,yr=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==hr||hr!==W(r)||("selectionStart"in(r=hr)&&pr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},yr&&lr(yr,r)||(yr=r,0<(r=Gr(br,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=hr)))}function kr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var xr={animationend:kr("Animation","AnimationEnd"),animationiteration:kr("Animation","AnimationIteration"),animationstart:kr("Animation","AnimationStart"),transitionend:kr("Transition","TransitionEnd")},Sr={},_r={};function Cr(e){if(Sr[e])return Sr[e];if(!xr[e])return e;var t,n=xr[e];for(t in n)if(n.hasOwnProperty(t)&&t in _r)return Sr[e]=n[t];return e}u&&(_r=document.createElement("div").style,"AnimationEvent"in window||(delete xr.animationend.animation,delete xr.animationiteration.animation,delete xr.animationstart.animation),"TransitionEvent"in window||delete xr.transitionend.transition);var Er=Cr("animationend"),Tr=Cr("animationiteration"),jr=Cr("animationstart"),Lr=Cr("transitionend"),Ar=new Map,Nr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Rr(e,t){Ar.set(e,t),l(t,[e])}for(var Or=0;Or<Nr.length;Or++){var Pr=Nr[Or];Rr(Pr.toLowerCase(),"on"+(Pr[0].toUpperCase()+Pr.slice(1)))}Rr(Er,"onAnimationEnd"),Rr(Tr,"onAnimationIteration"),Rr(jr,"onAnimationStart"),Rr("dblclick","onDoubleClick"),Rr("focusin","onFocus"),Rr("focusout","onBlur"),Rr(Lr,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),l("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),l("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),l("onBeforeInput",["compositionend","keypress","textInput","paste"]),l("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),l("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ir="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Dr=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ir));function Mr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,i,s,l,c){if(Ue.apply(this,arguments),De){if(!De)throw Error(a(198));var u=Me;De=!1,Me=null,Fe||(Fe=!0,ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Fr(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;Mr(o,s,c),a=l}}}if(Fe)throw e=ze,Fe=!1,ze=null,e}function zr(e,t){var n=t[ho];void 0===n&&(n=t[ho]=new Set);var r=e+"__bubble";n.has(r)||(qr(t,e,2,!1),n.add(r))}function Br(e,t,n){var r=0;t&&(r|=4),qr(n,e,r,t)}var Ur="_reactListening"+Math.random().toString(36).slice(2);function $r(e){if(!e[Ur]){e[Ur]=!0,i.forEach((function(t){"selectionchange"!==t&&(Dr.has(t)||Br(t,!1,e),Br(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Ur]||(t[Ur]=!0,Br("selectionchange",!1,t))}}function qr(e,t,n,r){switch(Qt(t)){case 1:var o=Zt;break;case 4:o=Gt;break;default:o=Vt}n=o.bind(null,t,n,e),o=void 0,!Oe||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===o||8===s.nodeType&&s.parentNode===o)break;if(4===i)for(i=r.return;null!==i;){var l=i.tag;if((3===l||4===l)&&((l=i.stateNode.containerInfo)===o||8===l.nodeType&&l.parentNode===o))return;i=i.return}for(;null!==s;){if(null===(i=vo(s)))return;if(5===(l=i.tag)||6===l){r=a=i;continue e}s=s.parentNode}}r=r.return}Ne((function(){var r=a,o=ke(n),i=[];e:{var s=Ar.get(e);if(void 0!==s){var l=un,c=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":l=Tn;break;case"focusin":c="focus",l=hn;break;case"focusout":c="blur",l=hn;break;case"beforeblur":case"afterblur":l=hn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=gn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=mn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=Ln;break;case Er:case Tr:case jr:l=bn;break;case Lr:l=An;break;case"scroll":l=fn;break;case"wheel":l=Rn;break;case"copy":case"cut":case"paste":l=vn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=jn}var u=0!=(4&t),d=!u&&"scroll"===e,f=u?null!==s?s+"Capture":null:s;u=[];for(var p,g=r;null!==g;){var m=(p=g).stateNode;if(5===p.tag&&null!==m&&(p=m,null!==f&&(null!=(m=Re(g,f))&&u.push(Zr(g,m,p)))),d)break;g=g.return}0<u.length&&(s=new l(s,c,null,n,o),i.push({event:s,listeners:u}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||n===we||!(c=n.relatedTarget||n.fromElement)||!vo(c)&&!c[mo])&&(l||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(c=(c=n.relatedTarget||n.toElement)?vo(c):null)&&(c!==(d=$e(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(l=null,c=r),l!==c)){if(u=gn,m="onMouseLeave",f="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(u=jn,m="onPointerLeave",f="onPointerEnter",g="pointer"),d=null==l?s:ko(l),p=null==c?s:ko(c),(s=new u(m,g+"leave",l,n,o)).target=d,s.relatedTarget=p,m=null,vo(o)===r&&((u=new u(f,g+"enter",c,n,o)).target=p,u.relatedTarget=d,m=u),d=m,l&&c)e:{for(f=c,g=0,p=u=l;p;p=Vr(p))g++;for(p=0,m=f;m;m=Vr(m))p++;for(;0<g-p;)u=Vr(u),g--;for(;0<p-g;)f=Vr(f),p--;for(;g--;){if(u===f||null!==f&&u===f.alternate)break e;u=Vr(u),f=Vr(f)}u=null}else u=null;null!==l&&Wr(i,s,l,u,!1),null!==c&&null!==d&&Wr(i,d,c,u,!0)}if("select"===(l=(s=r?ko(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var h=Qn;else if(Hn(s))if(Yn)h=ir;else{h=or;var b=rr}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(h=ar);switch(h&&(h=h(e,r))?Zn(i,h,n,o):(b&&b(e,s,r),"focusout"===e&&(b=s._wrapperState)&&b.controlled&&"number"===s.type&&ee(s,"number",s.value)),b=r?ko(r):window,e){case"focusin":(Hn(b)||"true"===b.contentEditable)&&(hr=b,br=r,yr=null);break;case"focusout":yr=br=hr=null;break;case"mousedown":vr=!0;break;case"contextmenu":case"mouseup":case"dragend":vr=!1,wr(i,n,o);break;case"selectionchange":if(mr)break;case"keydown":case"keyup":wr(i,n,o)}var y;if(Pn)e:{switch(e){case"compositionstart":var v="onCompositionStart";break e;case"compositionend":v="onCompositionEnd";break e;case"compositionupdate":v="onCompositionUpdate";break e}v=void 0}else $n?Bn(e,n)&&(v="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(v="onCompositionStart");v&&(Mn&&"ko"!==n.locale&&($n||"onCompositionStart"!==v?"onCompositionEnd"===v&&$n&&(y=en()):(Xt="value"in(Yt=o)?Yt.value:Yt.textContent,$n=!0)),0<(b=Gr(r,v)).length&&(v=new wn(v,e,null,n,o),i.push({event:v,listeners:b}),y?v.data=y:null!==(y=Un(n))&&(v.data=y))),(y=Dn?function(e,t){switch(e){case"compositionend":return Un(t);case"keypress":return 32!==t.which?null:(zn=!0,Fn);case"textInput":return(e=t.data)===Fn&&zn?null:e;default:return null}}(e,n):function(e,t){if($n)return"compositionend"===e||!Pn&&Bn(e,t)?(e=en(),Jt=Xt=Yt=null,$n=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Mn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Gr(r,"onBeforeInput")).length&&(o=new wn("onBeforeInput","beforeinput",null,n,o),i.push({event:o,listeners:r}),o.data=y))}Fr(i,t)}))}function Zr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Gr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;5===o.tag&&null!==a&&(o=a,null!=(a=Re(e,n))&&r.unshift(Zr(e,a,o)),null!=(a=Re(e,t))&&r.push(Zr(e,a,o))),e=e.return}return r}function Vr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Wr(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==c&&(s=c,o?null!=(l=Re(n,a))&&i.unshift(Zr(n,l,s)):o||null!=(l=Re(n,a))&&i.push(Zr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Kr=/\r\n?/g,Qr=/\u0000|\uFFFD/g;function Yr(e){return("string"==typeof e?e:""+e).replace(Kr,"\n").replace(Qr,"")}function Xr(e,t,n){if(t=Yr(t),Yr(e)!==t&&n)throw Error(a(425))}function Jr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"==typeof setTimeout?setTimeout:void 0,oo="function"==typeof clearTimeout?clearTimeout:void 0,ao="function"==typeof Promise?Promise:void 0,io="function"==typeof queueMicrotask?queueMicrotask:void 0!==ao?function(e){return ao.resolve(null).then(e).catch(so)}:ro;function so(e){setTimeout((function(){throw e}))}function lo(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void $t(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);$t(t)}function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function uo(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var fo=Math.random().toString(36).slice(2),po="__reactFiber$"+fo,go="__reactProps$"+fo,mo="__reactContainer$"+fo,ho="__reactEvents$"+fo,bo="__reactListeners$"+fo,yo="__reactHandles$"+fo;function vo(e){var t=e[po];if(t)return t;for(var n=e.parentNode;n;){if(t=n[mo]||n[po]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=uo(e);null!==e;){if(n=e[po])return n;e=uo(e)}return t}n=(e=n).parentNode}return null}function wo(e){return!(e=e[po]||e[mo])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ko(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function xo(e){return e[go]||null}var So=[],_o=-1;function Co(e){return{current:e}}function Eo(e){0>_o||(e.current=So[_o],So[_o]=null,_o--)}function To(e,t){_o++,So[_o]=e.current,e.current=t}var jo={},Lo=Co(jo),Ao=Co(!1),No=jo;function Ro(e,t){var n=e.type.contextTypes;if(!n)return jo;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Oo(e){return null!=(e=e.childContextTypes)}function Po(){Eo(Ao),Eo(Lo)}function Io(e,t,n){if(Lo.current!==jo)throw Error(a(168));To(Lo,t),To(Ao,n)}function Do(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,q(e)||"Unknown",o));return M({},n,r)}function Mo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||jo,No=Lo.current,To(Lo,e),To(Ao,Ao.current),!0}function Fo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Do(e,t,No),r.__reactInternalMemoizedMergedChildContext=e,Eo(Ao),Eo(Lo),To(Lo,e)):Eo(Ao),To(Ao,n)}var zo=null,Bo=!1,Uo=!1;function $o(e){null===zo?zo=[e]:zo.push(e)}function qo(){if(!Uo&&null!==zo){Uo=!0;var e=0,t=vt;try{var n=zo;for(vt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}zo=null,Bo=!1}catch(o){throw null!==zo&&(zo=zo.slice(e+1)),Ve(Je,qo),o}finally{vt=t,Uo=!1}}return null}var Ho=[],Zo=0,Go=null,Vo=0,Wo=[],Ko=0,Qo=null,Yo=1,Xo="";function Jo(e,t){Ho[Zo++]=Vo,Ho[Zo++]=Go,Go=e,Vo=t}function ea(e,t,n){Wo[Ko++]=Yo,Wo[Ko++]=Xo,Wo[Ko++]=Qo,Qo=e;var r=Yo;e=Xo;var o=32-it(r)-1;r&=~(1<<o),n+=1;var a=32-it(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Yo=1<<32-it(t)+o|n<<o|r,Xo=a+e}else Yo=1<<a|n<<o|r,Xo=e}function ta(e){null!==e.return&&(Jo(e,1),ea(e,1,0))}function na(e){for(;e===Go;)Go=Ho[--Zo],Ho[Zo]=null,Vo=Ho[--Zo],Ho[Zo]=null;for(;e===Qo;)Qo=Wo[--Ko],Wo[Ko]=null,Xo=Wo[--Ko],Wo[Ko]=null,Yo=Wo[--Ko],Wo[Ko]=null}var ra=null,oa=null,aa=!1,ia=null;function sa(e,t){var n=Rc(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function la(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ra=e,oa=co(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ra=e,oa=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Qo?{id:Yo,overflow:Xo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Rc(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ra=e,oa=null,!0);default:return!1}}function ca(e){return 0!=(1&e.mode)&&0==(128&e.flags)}function ua(e){if(aa){var t=oa;if(t){var n=t;if(!la(e,t)){if(ca(e))throw Error(a(418));t=co(n.nextSibling);var r=ra;t&&la(e,t)?sa(r,n):(e.flags=-4097&e.flags|2,aa=!1,ra=e)}}else{if(ca(e))throw Error(a(418));e.flags=-4097&e.flags|2,aa=!1,ra=e}}}function da(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ra=e}function fa(e){if(e!==ra)return!1;if(!aa)return da(e),aa=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oa)){if(ca(e))throw pa(),Error(a(418));for(;t;)sa(e,t),t=co(t.nextSibling)}if(da(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oa=co(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oa=null}}else oa=ra?co(e.stateNode.nextSibling):null;return!0}function pa(){for(var e=oa;e;)e=co(e.nextSibling)}function ga(){oa=ra=null,aa=!1}function ma(e){null===ia?ia=[e]:ia.push(e)}var ha=w.ReactCurrentBatchConfig;function ba(e,t){if(e&&e.defaultProps){for(var n in t=M({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var ya=Co(null),va=null,wa=null,ka=null;function xa(){ka=wa=va=null}function Sa(e){var t=ya.current;Eo(ya),e._currentValue=t}function _a(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Ca(e,t){va=e,ka=wa=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(ws=!0),e.firstContext=null)}function Ea(e){var t=e._currentValue;if(ka!==e)if(e={context:e,memoizedValue:t,next:null},null===wa){if(null===va)throw Error(a(308));wa=e,va.dependencies={lanes:0,firstContext:e}}else wa=wa.next=e;return t}var Ta=null;function ja(e){null===Ta?Ta=[e]:Ta.push(e)}function La(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,ja(t)):(n.next=o.next,o.next=n),t.interleaved=n,Aa(e,r)}function Aa(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Na=!1;function Ra(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Oa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Pa(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ia(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!=(2&Ll)){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Aa(e,n)}return null===(o=r.interleaved)?(t.next=t,ja(r)):(t.next=o.next,o.next=t),r.interleaved=t,Aa(e,n)}function Da(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194240&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Ma(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Fa(e,t,n,r){var o=e.updateQueue;Na=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var f=s.lane,p=s.eventTime;if((r&f)===f){null!==u&&(u=u.next={eventTime:p,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var g=e,m=s;switch(f=t,p=n,m.tag){case 1:if("function"==typeof(g=m.payload)){d=g.call(p,d,f);break e}d=g;break e;case 3:g.flags=-65537&g.flags|128;case 0:if(null==(f="function"==typeof(g=m.payload)?g.call(p,d,f):g))break e;d=M({},d,f);break e;case 2:Na=!0}}null!==s.callback&&0!==s.lane&&(e.flags|=64,null===(f=o.effects)?o.effects=[s]:f.push(s))}else p={eventTime:p,lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=p,l=d):u=u.next=p,i|=f;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(f=s).next,f.next=null,o.lastBaseUpdate=f,o.shared.pending=null}}if(null===u&&(l=d),o.baseState=l,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Ml|=i,e.lanes=i,e.memoizedState=d}}function za(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!=typeof o)throw Error(a(191,o));o.call(r)}}}var Ba=(new r.Component).refs;function Ua(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:M({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var $a={isMounted:function(e){return!!(e=e._reactInternals)&&$e(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Pa(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=Ia(e,a,o))&&(rc(t,e,o,r),Da(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=tc(),o=nc(e),a=Pa(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=Ia(e,a,o))&&(rc(t,e,o,r),Da(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=tc(),r=nc(e),o=Pa(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=Ia(e,o,r))&&(rc(t,e,r,n),Da(t,e,r))}};function qa(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!lr(n,r)||!lr(o,a))}function Ha(e,t,n){var r=!1,o=jo,a=t.contextType;return"object"==typeof a&&null!==a?a=Ea(a):(o=Oo(t)?No:Lo.current,a=(r=null!=(r=t.contextTypes))?Ro(e,o):jo),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=$a,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function Za(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&$a.enqueueReplaceState(t,t.state,null)}function Ga(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=Ba,Ra(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Ea(a):(a=Oo(t)?No:Lo.current,o.context=Ro(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(Ua(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&$a.enqueueReplaceState(o,o.state,null),Fa(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function Va(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var o=r,i=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===i?t.ref:(t=function(e){var t=o.refs;t===Ba&&(t=o.refs={}),null===e?delete t[i]:t[i]=e},t._stringRef=i,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function Wa(e,t){throw e=Object.prototype.toString.call(t),Error(a(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function Ka(e){return(0,e._init)(e._payload)}function Qa(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Pc(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function s(t){return e&&null===t.alternate&&(t.flags|=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Fc(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===S?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===R&&Ka(a)===t.type)?((r=o(t,n.props)).ref=Va(e,t,n),r.return=e,r):((r=Ic(n.type,n.key,n.props,null,e.mode,r)).ref=Va(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=zc(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Dc(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t)return(t=Fc(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case k:return(n=Ic(t.type,t.key,t.props,null,e.mode,n)).ref=Va(e,null,t),n.return=e,n;case x:return(t=zc(t,e.mode,n)).return=e,t;case R:return f(e,(0,t._init)(t._payload),n)}if(te(t)||I(t))return(t=Dc(t,e.mode,n,null)).return=e,t;Wa(e,t)}return null}function p(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n)return null!==o?null:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case k:return n.key===o?c(e,t,n,r):null;case x:return n.key===o?u(e,t,n,r):null;case R:return p(e,t,(o=n._init)(n._payload),r)}if(te(n)||I(n))return null!==o?null:d(e,t,n,r,null);Wa(e,n)}return null}function g(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r)return l(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case k:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case x:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case R:return g(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||I(r))return d(t,e=e.get(n)||null,r,o,null);Wa(t,r)}return null}function m(o,a,s,l){for(var c=null,u=null,d=a,m=a=0,h=null;null!==d&&m<s.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var b=p(o,d,s[m],l);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(o,d),a=i(b,a,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===s.length)return n(o,d),aa&&Jo(o,m),c;if(null===d){for(;m<s.length;m++)null!==(d=f(o,s[m],l))&&(a=i(d,a,m),null===u?c=d:u.sibling=d,u=d);return aa&&Jo(o,m),c}for(d=r(o,d);m<s.length;m++)null!==(h=g(d,o,m,s[m],l))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),a=i(h,a,m),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(o,e)})),aa&&Jo(o,m),c}function h(o,s,l,c){var u=I(l);if("function"!=typeof u)throw Error(a(150));if(null==(l=u.call(l)))throw Error(a(151));for(var d=u=null,m=s,h=s=0,b=null,y=l.next();null!==m&&!y.done;h++,y=l.next()){m.index>h?(b=m,m=null):b=m.sibling;var v=p(o,m,y.value,c);if(null===v){null===m&&(m=b);break}e&&m&&null===v.alternate&&t(o,m),s=i(v,s,h),null===d?u=v:d.sibling=v,d=v,m=b}if(y.done)return n(o,m),aa&&Jo(o,h),u;if(null===m){for(;!y.done;h++,y=l.next())null!==(y=f(o,y.value,c))&&(s=i(y,s,h),null===d?u=y:d.sibling=y,d=y);return aa&&Jo(o,h),u}for(m=r(o,m);!y.done;h++,y=l.next())null!==(y=g(m,o,h,y.value,c))&&(e&&null!==y.alternate&&m.delete(null===y.key?h:y.key),s=i(y,s,h),null===d?u=y:d.sibling=y,d=y);return e&&m.forEach((function(e){return t(o,e)})),aa&&Jo(o,h),u}return function e(r,a,i,l){if("object"==typeof i&&null!==i&&i.type===S&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case k:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===S){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===R&&Ka(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=Va(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===S?((a=Dc(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Ic(i.type,i.key,i.props,null,r.mode,l)).ref=Va(r,a,i),l.return=r,r=l)}return s(r);case x:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=zc(i,r.mode,l)).return=r,r=a}return s(r);case R:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return m(r,a,i,l);if(I(i))return h(r,a,i,l);Wa(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Fc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var Ya=Qa(!0),Xa=Qa(!1),Ja={},ei=Co(Ja),ti=Co(Ja),ni=Co(Ja);function ri(e){if(e===Ja)throw Error(a(174));return e}function oi(e,t){switch(To(ni,t),To(ti,e),To(ei,Ja),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:le(null,"");break;default:t=le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Eo(ei),To(ei,t)}function ai(){Eo(ei),Eo(ti),Eo(ni)}function ii(e){ri(ni.current);var t=ri(ei.current),n=le(t,e.type);t!==n&&(To(ti,e),To(ei,n))}function si(e){ti.current===e&&(Eo(ei),Eo(ti))}var li=Co(0);function ci(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ui=[];function di(){for(var e=0;e<ui.length;e++)ui[e]._workInProgressVersionPrimary=null;ui.length=0}var fi=w.ReactCurrentDispatcher,pi=w.ReactCurrentBatchConfig,gi=0,mi=null,hi=null,bi=null,yi=!1,vi=!1,wi=0,ki=0;function xi(){throw Error(a(321))}function Si(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!sr(e[n],t[n]))return!1;return!0}function _i(e,t,n,r,o,i){if(gi=i,mi=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,fi.current=null===e||null===e.memoizedState?ss:ls,e=n(r,o),vi){i=0;do{if(vi=!1,wi=0,25<=i)throw Error(a(301));i+=1,bi=hi=null,t.updateQueue=null,fi.current=cs,e=n(r,o)}while(vi)}if(fi.current=is,t=null!==hi&&null!==hi.next,gi=0,bi=hi=mi=null,yi=!1,t)throw Error(a(300));return e}function Ci(){var e=0!==wi;return wi=0,e}function Ei(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===bi?mi.memoizedState=bi=e:bi=bi.next=e,bi}function Ti(){if(null===hi){var e=mi.alternate;e=null!==e?e.memoizedState:null}else e=hi.next;var t=null===bi?mi.memoizedState:bi.next;if(null!==t)bi=t,hi=e;else{if(null===e)throw Error(a(310));e={memoizedState:(hi=e).memoizedState,baseState:hi.baseState,baseQueue:hi.baseQueue,queue:hi.queue,next:null},null===bi?mi.memoizedState=bi=e:bi=bi.next=e}return bi}function ji(e,t){return"function"==typeof t?t(e):t}function Li(e){var t=Ti(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=hi,o=r.baseQueue,i=n.pending;if(null!==i){if(null!==o){var s=o.next;o.next=i.next,i.next=s}r.baseQueue=o=i,n.pending=null}if(null!==o){i=o.next,r=r.baseState;var l=s=null,c=null,u=i;do{var d=u.lane;if((gi&d)===d)null!==c&&(c=c.next={lane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),r=u.hasEagerState?u.eagerState:e(r,u.action);else{var f={lane:d,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null};null===c?(l=c=f,s=r):c=c.next=f,mi.lanes|=d,Ml|=d}u=u.next}while(null!==u&&u!==i);null===c?s=r:c.next=l,sr(r,t.memoizedState)||(ws=!0),t.memoizedState=r,t.baseState=s,t.baseQueue=c,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{i=o.lane,mi.lanes|=i,Ml|=i,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Ai(e){var t=Ti(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,i=t.memoizedState;if(null!==o){n.pending=null;var s=o=o.next;do{i=e(i,s.action),s=s.next}while(s!==o);sr(i,t.memoizedState)||(ws=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Ni(){}function Ri(e,t){var n=mi,r=Ti(),o=t(),i=!sr(r.memoizedState,o);if(i&&(r.memoizedState=o,ws=!0),r=r.queue,Hi(Ii.bind(null,n,r,e),[e]),r.getSnapshot!==t||i||null!==bi&&1&bi.memoizedState.tag){if(n.flags|=2048,zi(9,Pi.bind(null,n,r,o,t),void 0,null),null===Al)throw Error(a(349));0!=(30&gi)||Oi(n,t,o)}return o}function Oi(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=mi.updateQueue)?(t={lastEffect:null,stores:null},mi.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Pi(e,t,n,r){t.value=n,t.getSnapshot=r,Di(t)&&Mi(e)}function Ii(e,t,n){return n((function(){Di(t)&&Mi(e)}))}function Di(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!sr(e,n)}catch(r){return!0}}function Mi(e){var t=Aa(e,1);null!==t&&rc(t,e,1,-1)}function Fi(e){var t=Ei();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:ji,lastRenderedState:e},t.queue=e,e=e.dispatch=ns.bind(null,mi,e),[t.memoizedState,e]}function zi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=mi.updateQueue)?(t={lastEffect:null,stores:null},mi.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Bi(){return Ti().memoizedState}function Ui(e,t,n,r){var o=Ei();mi.flags|=e,o.memoizedState=zi(1|t,n,void 0,void 0===r?null:r)}function $i(e,t,n,r){var o=Ti();r=void 0===r?null:r;var a=void 0;if(null!==hi){var i=hi.memoizedState;if(a=i.destroy,null!==r&&Si(r,i.deps))return void(o.memoizedState=zi(t,n,a,r))}mi.flags|=e,o.memoizedState=zi(1|t,n,a,r)}function qi(e,t){return Ui(8390656,8,e,t)}function Hi(e,t){return $i(2048,8,e,t)}function Zi(e,t){return $i(4,2,e,t)}function Gi(e,t){return $i(4,4,e,t)}function Vi(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Wi(e,t,n){return n=null!=n?n.concat([e]):null,$i(4,4,Vi.bind(null,t,e),n)}function Ki(){}function Qi(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Yi(e,t){var n=Ti();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Si(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Xi(e,t,n){return 0==(21&gi)?(e.baseState&&(e.baseState=!1,ws=!0),e.memoizedState=n):(sr(n,t)||(n=mt(),mi.lanes|=n,Ml|=n,e.baseState=!0),t)}function Ji(e,t){var n=vt;vt=0!==n&&4>n?n:4,e(!0);var r=pi.transition;pi.transition={};try{e(!1),t()}finally{vt=n,pi.transition=r}}function es(){return Ti().memoizedState}function ts(e,t,n){var r=nc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rs(e))os(t,n);else if(null!==(n=La(e,t,n,r))){rc(n,e,r,tc()),as(n,t,r)}}function ns(e,t,n){var r=nc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rs(e))os(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,ja(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=La(e,t,o,r))&&(rc(n,e,r,o=tc()),as(n,t,r))}}function rs(e){var t=e.alternate;return e===mi||null!==t&&t===mi}function os(e,t){vi=yi=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function as(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var is={readContext:Ea,useCallback:xi,useContext:xi,useEffect:xi,useImperativeHandle:xi,useInsertionEffect:xi,useLayoutEffect:xi,useMemo:xi,useReducer:xi,useRef:xi,useState:xi,useDebugValue:xi,useDeferredValue:xi,useTransition:xi,useMutableSource:xi,useSyncExternalStore:xi,useId:xi,unstable_isNewReconciler:!1},ss={readContext:Ea,useCallback:function(e,t){return Ei().memoizedState=[e,void 0===t?null:t],e},useContext:Ea,useEffect:qi,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ui(4194308,4,Vi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ui(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ui(4,2,e,t)},useMemo:function(e,t){var n=Ei();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ei();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=ts.bind(null,mi,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Ei().memoizedState=e},useState:Fi,useDebugValue:Ki,useDeferredValue:function(e){return Ei().memoizedState=e},useTransition:function(){var e=Fi(!1),t=e[0];return e=Ji.bind(null,e[1]),Ei().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=mi,o=Ei();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Al)throw Error(a(349));0!=(30&gi)||Oi(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,qi(Ii.bind(null,r,i,e),[e]),r.flags|=2048,zi(9,Pi.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Ei(),t=Al.identifierPrefix;if(aa){var n=Xo;t=":"+t+"R"+(n=(Yo&~(1<<32-it(Yo)-1)).toString(32)+n),0<(n=wi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=ki++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ls={readContext:Ea,useCallback:Qi,useContext:Ea,useEffect:Hi,useImperativeHandle:Wi,useInsertionEffect:Zi,useLayoutEffect:Gi,useMemo:Yi,useReducer:Li,useRef:Bi,useState:function(){return Li(ji)},useDebugValue:Ki,useDeferredValue:function(e){return Xi(Ti(),hi.memoizedState,e)},useTransition:function(){return[Li(ji)[0],Ti().memoizedState]},useMutableSource:Ni,useSyncExternalStore:Ri,useId:es,unstable_isNewReconciler:!1},cs={readContext:Ea,useCallback:Qi,useContext:Ea,useEffect:Hi,useImperativeHandle:Wi,useInsertionEffect:Zi,useLayoutEffect:Gi,useMemo:Yi,useReducer:Ai,useRef:Bi,useState:function(){return Ai(ji)},useDebugValue:Ki,useDeferredValue:function(e){var t=Ti();return null===hi?t.memoizedState=e:Xi(t,hi.memoizedState,e)},useTransition:function(){return[Ai(ji)[0],Ti().memoizedState]},useMutableSource:Ni,useSyncExternalStore:Ri,useId:es,unstable_isNewReconciler:!1};function us(e,t){try{var n="",r=t;do{n+=U(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function ds(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function fs(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var ps="function"==typeof WeakMap?WeakMap:Map;function gs(e,t,n){(n=Pa(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Zl||(Zl=!0,Gl=r),fs(0,t)},n}function ms(e,t,n){(n=Pa(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){fs(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){fs(0,t),"function"!=typeof r&&(null===Vl?Vl=new Set([this]):Vl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function hs(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new ps;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Ec.bind(null,e,t,n),t.then(e,e))}function bs(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function ys(e,t,n,r,o){return 0==(1&e.mode)?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Pa(-1,1)).tag=2,Ia(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var vs=w.ReactCurrentOwner,ws=!1;function ks(e,t,n,r){t.child=null===e?Xa(t,null,n,r):Ya(t,e.child,n,r)}function xs(e,t,n,r,o){n=n.render;var a=t.ref;return Ca(t,o),r=_i(e,t,n,r,a,o),n=Ci(),null===e||ws?(aa&&n&&ta(t),t.flags|=1,ks(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Zs(e,t,o))}function Ss(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Oc(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Ic(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,_s(e,t,a,r,o))}if(a=e.child,0==(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Zs(e,t,o)}return t.flags|=1,(e=Pc(a,r)).ref=t.ref,e.return=t,t.child=e}function _s(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(ws=!1,t.pendingProps=r=a,0==(e.lanes&o))return t.lanes=e.lanes,Zs(e,t,o);0!=(131072&e.flags)&&(ws=!0)}}return Ts(e,t,n,r,o)}function Cs(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0==(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},To(Pl,Ol),Ol|=n;else{if(0==(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,To(Pl,Ol),Ol|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,To(Pl,Ol),Ol|=r}else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,To(Pl,Ol),Ol|=r;return ks(e,t,o,n),t.child}function Es(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Ts(e,t,n,r,o){var a=Oo(n)?No:Lo.current;return a=Ro(t,a),Ca(t,o),n=_i(e,t,n,r,a,o),r=Ci(),null===e||ws?(aa&&r&&ta(t),t.flags|=1,ks(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Zs(e,t,o))}function js(e,t,n,r,o){if(Oo(n)){var a=!0;Mo(t)}else a=!1;if(Ca(t,o),null===t.stateNode)Hs(e,t),Ha(t,n,r),Ga(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Ea(c):c=Ro(t,c=Oo(n)?No:Lo.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&Za(t,i,r,c),Na=!1;var f=t.memoizedState;i.state=f,Fa(t,r,i,o),l=t.memoizedState,s!==r||f!==l||Ao.current||Na?("function"==typeof u&&(Ua(t,n,u,r),l=t.memoizedState),(s=Na||qa(t,n,s,r,f,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Oa(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ba(t.type,s),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=Ea(l):l=Ro(t,l=Oo(n)?No:Lo.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||f!==l)&&Za(t,i,r,l),Na=!1,f=t.memoizedState,i.state=f,Fa(t,r,i,o);var g=t.memoizedState;s!==d||f!==g||Ao.current||Na?("function"==typeof p&&(Ua(t,n,p,r),g=t.memoizedState),(c=Na||qa(t,n,c,r,f,g,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,g,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,g,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=g),i.props=r,i.state=g,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Ls(e,t,n,r,a,o)}function Ls(e,t,n,r,o,a){Es(e,t);var i=0!=(128&t.flags);if(!r&&!i)return o&&Fo(t,n,!1),Zs(e,t,a);r=t.stateNode,vs.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Ya(t,e.child,null,a),t.child=Ya(t,null,s,a)):ks(e,t,s,a),t.memoizedState=r.state,o&&Fo(t,n,!0),t.child}function As(e){var t=e.stateNode;t.pendingContext?Io(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Io(0,t.context,!1),oi(e,t.containerInfo)}function Ns(e,t,n,r,o){return ga(),ma(o),t.flags|=256,ks(e,t,n,r),t.child}var Rs,Os,Ps,Is,Ds={dehydrated:null,treeContext:null,retryLane:0};function Ms(e){return{baseLanes:e,cachePool:null,transitions:null}}function Fs(e,t,n){var r,o=t.pendingProps,i=li.current,s=!1,l=0!=(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&0!=(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),To(li,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(0==(1&t.mode)?t.lanes=1:"$!"===e.data?t.lanes=8:t.lanes=1073741824,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},0==(1&o)&&null!==s?(s.childLanes=0,s.pendingProps=l):s=Mc(l,o,0,null),e=Dc(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Ms(n),t.memoizedState=Ds,e):zs(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,Bs(e,t,s,r=ds(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Mc({mode:"visible",children:r.children},o,0,null),(i=Dc(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,0!=(1&t.mode)&&Ya(t,e.child,null,s),t.child.memoizedState=Ms(s),t.memoizedState=Ds,i);if(0==(1&t.mode))return Bs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,Bs(e,t,s,r=ds(i=Error(a(419)),r,void 0))}if(l=0!=(s&e.childLanes),ws||l){if(null!==(r=Al)){switch(s&-s){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=0!=(o&(r.suspendedLanes|s))?0:o)&&o!==i.retryLane&&(i.retryLane=o,Aa(e,o),rc(r,e,o,-1))}return hc(),Bs(e,t,s,r=ds(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=jc.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Wo[Ko++]=Yo,Wo[Ko++]=Xo,Wo[Ko++]=Qo,Yo=e.id,Xo=e.overflow,Qo=t),t=zs(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 0==(1&l)&&t.child!==i?((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null):(o=Pc(i,c)).subtreeFlags=14680064&i.subtreeFlags,null!==r?s=Pc(r,s):(s=Dc(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Ms(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Ds,o}return e=(s=e.child).sibling,o=Pc(s,{mode:"visible",children:o.children}),0==(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function zs(e,t){return(t=Mc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Bs(e,t,n,r){return null!==r&&ma(r),Ya(t,e.child,null,n),(e=zs(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Us(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),_a(e.return,t,n)}function $s(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function qs(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(ks(e,t,r.children,n),0!=(2&(r=li.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!=(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Us(e,n,t);else if(19===e.tag)Us(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(To(li,r),0==(1&t.mode))t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ci(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),$s(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ci(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}$s(t,!0,n,null,a);break;case"together":$s(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Hs(e,t){0==(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Zs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ml|=t.lanes,0==(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Pc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Pc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Gs(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Vs(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ws(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Vs(t),null;case 1:case 17:return Oo(t.type)&&Po(),Vs(t),null;case 3:return r=t.stateNode,ai(),Eo(Ao),Eo(Lo),di(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0==(256&t.flags)||(t.flags|=1024,null!==ia&&(sc(ia),ia=null))),Os(e,t),Vs(t),null;case 5:si(t);var o=ri(ni.current);if(n=t.type,null!==e&&null!=t.stateNode)Ps(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Vs(t),null}if(e=ri(ei.current),fa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[po]=t,r[go]=i,e=0!=(1&t.mode),n){case"dialog":zr("cancel",r),zr("close",r);break;case"iframe":case"object":case"embed":zr("load",r);break;case"video":case"audio":for(o=0;o<Ir.length;o++)zr(Ir[o],r);break;case"source":zr("error",r);break;case"img":case"image":case"link":zr("error",r),zr("load",r);break;case"details":zr("toggle",r);break;case"input":Q(r,i),zr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!i.multiple},zr("invalid",r);break;case"textarea":oe(r,i),zr("invalid",r)}for(var l in ye(n,i),o=null,i)if(i.hasOwnProperty(l)){var c=i[l];"children"===l?"string"==typeof c?r.textContent!==c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==i.suppressHydrationWarning&&Xr(r.textContent,c,e),o=["children",""+c]):s.hasOwnProperty(l)&&null!=c&&"onScroll"===l&&zr("scroll",r)}switch(n){case"input":G(r),J(r,i,!0);break;case"textarea":G(r),ie(r);break;case"select":case"option":break;default:"function"==typeof i.onClick&&(r.onclick=Jr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{l=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=se(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[po]=t,e[go]=r,Rs(e,t,!1,!1),t.stateNode=e;e:{switch(l=ve(n,r),n){case"dialog":zr("cancel",e),zr("close",e),o=r;break;case"iframe":case"object":case"embed":zr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Ir.length;o++)zr(Ir[o],e);o=r;break;case"source":zr("error",e),o=r;break;case"img":case"image":case"link":zr("error",e),zr("load",e),o=r;break;case"details":zr("toggle",e),o=r;break;case"input":Q(e,r),o=K(e,r),zr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=M({},r,{value:void 0}),zr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),zr("invalid",e)}for(i in ye(n,o),c=o)if(c.hasOwnProperty(i)){var u=c[i];"style"===i?he(e,u):"dangerouslySetInnerHTML"===i?null!=(u=u?u.__html:void 0)&&de(e,u):"children"===i?"string"==typeof u?("textarea"!==n||""!==u)&&fe(e,u):"number"==typeof u&&fe(e,""+u):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(s.hasOwnProperty(i)?null!=u&&"onScroll"===i&&zr("scroll",e):null!=u&&v(e,i,u,l))}switch(n){case"input":G(e),J(e,r,!1);break;case"textarea":G(e),ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(i=r.value)?ne(e,!!r.multiple,i,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Jr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Vs(t),null;case 6:if(e&&null!=t.stateNode)Is(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));if(n=ri(ni.current),ri(ei.current),fa(t)){if(r=t.stateNode,n=t.memoizedProps,r[po]=t,(i=r.nodeValue!==n)&&null!==(e=ra))switch(e.tag){case 3:Xr(r.nodeValue,n,0!=(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Xr(r.nodeValue,n,0!=(1&e.mode))}i&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[po]=t,t.stateNode=r}return Vs(t),null;case 13:if(Eo(li),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(aa&&null!==oa&&0!=(1&t.mode)&&0==(128&t.flags))pa(),ga(),t.flags|=98560,i=!1;else if(i=fa(t),null!==r&&null!==r.dehydrated){if(null===e){if(!i)throw Error(a(318));if(!(i=null!==(i=t.memoizedState)?i.dehydrated:null))throw Error(a(317));i[po]=t}else ga(),0==(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Vs(t),i=!1}else null!==ia&&(sc(ia),ia=null),i=!0;if(!i)return 65536&t.flags?t:null}return 0!=(128&t.flags)?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,0!=(1&t.mode)&&(null===e||0!=(1&li.current)?0===Il&&(Il=3):hc())),null!==t.updateQueue&&(t.flags|=4),Vs(t),null);case 4:return ai(),Os(e,t),null===e&&$r(t.stateNode.containerInfo),Vs(t),null;case 10:return Sa(t.type._context),Vs(t),null;case 19:if(Eo(li),null===(i=t.memoizedState))return Vs(t),null;if(r=0!=(128&t.flags),null===(l=i.rendering))if(r)Gs(i,!1);else{if(0!==Il||null!==e&&0!=(128&e.flags))for(e=t.child;null!==e;){if(null!==(l=ci(e))){for(t.flags|=128,Gs(i,!1),null!==(r=l.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(i=n).flags&=14680066,null===(l=i.alternate)?(i.childLanes=0,i.lanes=e,i.child=null,i.subtreeFlags=0,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null,i.stateNode=null):(i.childLanes=l.childLanes,i.lanes=l.lanes,i.child=l.child,i.subtreeFlags=0,i.deletions=null,i.memoizedProps=l.memoizedProps,i.memoizedState=l.memoizedState,i.updateQueue=l.updateQueue,i.type=l.type,e=l.dependencies,i.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return To(li,1&li.current|2),t.child}e=e.sibling}null!==i.tail&&Ye()>ql&&(t.flags|=128,r=!0,Gs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ci(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Gs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Vs(t),null}else 2*Ye()-i.renderingStartTime>ql&&1073741824!==n&&(t.flags|=128,r=!0,Gs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ye(),t.sibling=null,n=li.current,To(li,r?1&n|2:1&n),t):(Vs(t),null);case 22:case 23:return fc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!=(1&t.mode)?0!=(1073741824&Ol)&&(Vs(t),6&t.subtreeFlags&&(t.flags|=8192)):Vs(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Ks(e,t){switch(na(t),t.tag){case 1:return Oo(t.type)&&Po(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ai(),Eo(Ao),Eo(Lo),di(),0!=(65536&(e=t.flags))&&0==(128&e)?(t.flags=-65537&e|128,t):null;case 5:return si(t),null;case 13:if(Eo(li),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ga()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Eo(li),null;case 4:return ai(),null;case 10:return Sa(t.type._context),null;case 22:case 23:return fc(),null;default:return null}}Rs=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Os=function(){},Ps=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ri(ei.current);var a,i=null;switch(n){case"input":o=K(e,o),r=K(e,r),i=[];break;case"select":o=M({},o,{value:void 0}),r=M({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in ye(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&zr("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Is=function(e,t,n,r){n!==r&&(t.flags|=4)};var Qs=!1,Ys=!1,Xs="function"==typeof WeakSet?WeakSet:Set,Js=null;function el(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){Cc(e,t,r)}else n.current=null}function tl(e,t,n){try{n()}catch(r){Cc(e,t,r)}}var nl=!1;function rl(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&tl(t,n,a)}o=o.next}while(o!==r)}}function ol(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function al(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function il(e){var t=e.alternate;null!==t&&(e.alternate=null,il(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[po],delete t[go],delete t[ho],delete t[bo],delete t[yo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function sl(e){return 5===e.tag||3===e.tag||4===e.tag}function ll(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||sl(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function cl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}function ul(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(ul(e,t,n),e=e.sibling;null!==e;)ul(e,t,n),e=e.sibling}var dl=null,fl=!1;function pl(e,t,n){for(n=n.child;null!==n;)gl(e,t,n),n=n.sibling}function gl(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Ys||el(n,t);case 6:var r=dl,o=fl;dl=null,pl(e,t,n),fl=o,null!==(dl=r)&&(fl?(e=dl,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):dl.removeChild(n.stateNode));break;case 18:null!==dl&&(fl?(e=dl,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),$t(e)):lo(dl,n.stateNode));break;case 4:r=dl,o=fl,dl=n.stateNode.containerInfo,fl=!0,pl(e,t,n),dl=r,fl=o;break;case 0:case 11:case 14:case 15:if(!Ys&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(0!=(2&a)||0!=(4&a))&&tl(n,t,i),o=o.next}while(o!==r)}pl(e,t,n);break;case 1:if(!Ys&&(el(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){Cc(n,t,s)}pl(e,t,n);break;case 21:pl(e,t,n);break;case 22:1&n.mode?(Ys=(r=Ys)||null!==n.memoizedState,pl(e,t,n),Ys=r):pl(e,t,n);break;default:pl(e,t,n)}}function ml(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Xs),t.forEach((function(t){var r=Lc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function hl(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var i=e,s=t,l=s;e:for(;null!==l;){switch(l.tag){case 5:dl=l.stateNode,fl=!1;break e;case 3:case 4:dl=l.stateNode.containerInfo,fl=!0;break e}l=l.return}if(null===dl)throw Error(a(160));gl(i,s,o),dl=null,fl=!1;var c=o.alternate;null!==c&&(c.return=null),o.return=null}catch(u){Cc(o,t,u)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)bl(t,e),t=t.sibling}function bl(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(hl(t,e),yl(e),4&r){try{rl(3,e,e.return),ol(3,e)}catch(h){Cc(e,e.return,h)}try{rl(5,e,e.return)}catch(h){Cc(e,e.return,h)}}break;case 1:hl(t,e),yl(e),512&r&&null!==n&&el(n,n.return);break;case 5:if(hl(t,e),yl(e),512&r&&null!==n&&el(n,n.return),32&e.flags){var o=e.stateNode;try{fe(o,"")}catch(h){Cc(e,e.return,h)}}if(4&r&&null!=(o=e.stateNode)){var i=e.memoizedProps,s=null!==n?n.memoizedProps:i,l=e.type,c=e.updateQueue;if(e.updateQueue=null,null!==c)try{"input"===l&&"radio"===i.type&&null!=i.name&&Y(o,i),ve(l,s);var u=ve(l,i);for(s=0;s<c.length;s+=2){var d=c[s],f=c[s+1];"style"===d?he(o,f):"dangerouslySetInnerHTML"===d?de(o,f):"children"===d?fe(o,f):v(o,d,f,u)}switch(l){case"input":X(o,i);break;case"textarea":ae(o,i);break;case"select":var p=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!i.multiple;var g=i.value;null!=g?ne(o,!!i.multiple,g,!1):p!==!!i.multiple&&(null!=i.defaultValue?ne(o,!!i.multiple,i.defaultValue,!0):ne(o,!!i.multiple,i.multiple?[]:"",!1))}o[go]=i}catch(h){Cc(e,e.return,h)}}break;case 6:if(hl(t,e),yl(e),4&r){if(null===e.stateNode)throw Error(a(162));o=e.stateNode,i=e.memoizedProps;try{o.nodeValue=i}catch(h){Cc(e,e.return,h)}}break;case 3:if(hl(t,e),yl(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{$t(t.containerInfo)}catch(h){Cc(e,e.return,h)}break;case 4:default:hl(t,e),yl(e);break;case 13:hl(t,e),yl(e),8192&(o=e.child).flags&&(i=null!==o.memoizedState,o.stateNode.isHidden=i,!i||null!==o.alternate&&null!==o.alternate.memoizedState||($l=Ye())),4&r&&ml(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Ys=(u=Ys)||d,hl(t,e),Ys=u):hl(t,e),yl(e),8192&r){if(u=null!==e.memoizedState,(e.stateNode.isHidden=u)&&!d&&0!=(1&e.mode))for(Js=e,d=e.child;null!==d;){for(f=Js=d;null!==Js;){switch(g=(p=Js).child,p.tag){case 0:case 11:case 14:case 15:rl(4,p,p.return);break;case 1:el(p,p.return);var m=p.stateNode;if("function"==typeof m.componentWillUnmount){r=p,n=p.return;try{t=r,m.props=t.memoizedProps,m.state=t.memoizedState,m.componentWillUnmount()}catch(h){Cc(r,n,h)}}break;case 5:el(p,p.return);break;case 22:if(null!==p.memoizedState){xl(f);continue}}null!==g?(g.return=p,Js=g):xl(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{o=f.stateNode,u?"function"==typeof(i=o.style).setProperty?i.setProperty("display","none","important"):i.display="none":(l=f.stateNode,s=null!=(c=f.memoizedProps.style)&&c.hasOwnProperty("display")?c.display:null,l.style.display=me("display",s))}catch(h){Cc(e,e.return,h)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=u?"":f.memoizedProps}catch(h){Cc(e,e.return,h)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:hl(t,e),yl(e),4&r&&ml(e);case 21:}}function yl(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(sl(n)){var r=n;break e}n=n.return}throw Error(a(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(fe(o,""),r.flags&=-33),ul(e,ll(e),o);break;case 3:case 4:var i=r.stateNode.containerInfo;cl(e,ll(e),i);break;default:throw Error(a(161))}}catch(s){Cc(e,e.return,s)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function vl(e,t,n){Js=e,wl(e,t,n)}function wl(e,t,n){for(var r=0!=(1&e.mode);null!==Js;){var o=Js,a=o.child;if(22===o.tag&&r){var i=null!==o.memoizedState||Qs;if(!i){var s=o.alternate,l=null!==s&&null!==s.memoizedState||Ys;s=Qs;var c=Ys;if(Qs=i,(Ys=l)&&!c)for(Js=o;null!==Js;)l=(i=Js).child,22===i.tag&&null!==i.memoizedState?Sl(o):null!==l?(l.return=i,Js=l):Sl(o);for(;null!==a;)Js=a,wl(a,t,n),a=a.sibling;Js=o,Qs=s,Ys=c}kl(e)}else 0!=(8772&o.subtreeFlags)&&null!==a?(a.return=o,Js=a):kl(e)}}function kl(e){for(;null!==Js;){var t=Js;if(0!=(8772&t.flags)){var n=t.alternate;try{if(0!=(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Ys||ol(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Ys)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:ba(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var i=t.updateQueue;null!==i&&za(t,i,r);break;case 3:var s=t.updateQueue;if(null!==s){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}za(t,s,n)}break;case 5:var l=t.stateNode;if(null===n&&4&t.flags){n=l;var c=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":c.autoFocus&&n.focus();break;case"img":c.src&&(n.src=c.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var u=t.alternate;if(null!==u){var d=u.memoizedState;if(null!==d){var f=d.dehydrated;null!==f&&$t(f)}}}break;default:throw Error(a(163))}Ys||512&t.flags&&al(t)}catch(p){Cc(t,t.return,p)}}if(t===e){Js=null;break}if(null!==(n=t.sibling)){n.return=t.return,Js=n;break}Js=t.return}}function xl(e){for(;null!==Js;){var t=Js;if(t===e){Js=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Js=n;break}Js=t.return}}function Sl(e){for(;null!==Js;){var t=Js;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{ol(4,t)}catch(l){Cc(t,n,l)}break;case 1:var r=t.stateNode;if("function"==typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(l){Cc(t,o,l)}}var a=t.return;try{al(t)}catch(l){Cc(t,a,l)}break;case 5:var i=t.return;try{al(t)}catch(l){Cc(t,i,l)}}}catch(l){Cc(t,t.return,l)}if(t===e){Js=null;break}var s=t.sibling;if(null!==s){s.return=t.return,Js=s;break}Js=t.return}}var _l,Cl=Math.ceil,El=w.ReactCurrentDispatcher,Tl=w.ReactCurrentOwner,jl=w.ReactCurrentBatchConfig,Ll=0,Al=null,Nl=null,Rl=0,Ol=0,Pl=Co(0),Il=0,Dl=null,Ml=0,Fl=0,zl=0,Bl=null,Ul=null,$l=0,ql=1/0,Hl=null,Zl=!1,Gl=null,Vl=null,Wl=!1,Kl=null,Ql=0,Yl=0,Xl=null,Jl=-1,ec=0;function tc(){return 0!=(6&Ll)?Ye():-1!==Jl?Jl:Jl=Ye()}function nc(e){return 0==(1&e.mode)?1:0!=(2&Ll)&&0!==Rl?Rl&-Rl:null!==ha.transition?(0===ec&&(ec=mt()),ec):0!==(e=vt)?e:e=void 0===(e=window.event)?16:Qt(e.type)}function rc(e,t,n,r){if(50<Yl)throw Yl=0,Xl=null,Error(a(185));bt(e,n,r),0!=(2&Ll)&&e===Al||(e===Al&&(0==(2&Ll)&&(Fl|=n),4===Il&&lc(e,Rl)),oc(e,r),1===n&&0===Ll&&0==(1&t.mode)&&(ql=Ye()+500,Bo&&qo()))}function oc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=e.pendingLanes;0<a;){var i=31-it(a),s=1<<i,l=o[i];-1===l?0!=(s&n)&&0==(s&r)||(o[i]=pt(s,t)):l<=t&&(e.expiredLanes|=s),a&=~s}}(e,t);var r=ft(e,e===Al?Rl:0);if(0===r)null!==n&&We(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&We(n),1===t)0===e.tag?function(e){Bo=!0,$o(e)}(cc.bind(null,e)):$o(cc.bind(null,e)),io((function(){0==(6&Ll)&&qo()})),n=null;else{switch(wt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Ac(n,ac.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ac(e,t){if(Jl=-1,ec=0,0!=(6&Ll))throw Error(a(327));var n=e.callbackNode;if(Sc()&&e.callbackNode!==n)return null;var r=ft(e,e===Al?Rl:0);if(0===r)return null;if(0!=(30&r)||0!=(r&e.expiredLanes)||t)t=bc(e,r);else{t=r;var o=Ll;Ll|=2;var i=mc();for(Al===e&&Rl===t||(Hl=null,ql=Ye()+500,pc(e,t));;)try{vc();break}catch(l){gc(e,l)}xa(),El.current=i,Ll=o,null!==Nl?t=0:(Al=null,Rl=0,t=Il)}if(0!==t){if(2===t&&(0!==(o=gt(e))&&(r=o,t=ic(e,o))),1===t)throw n=Dl,pc(e,0),lc(e,r),oc(e,Ye()),n;if(6===t)lc(e,r);else{if(o=e.current.alternate,0==(30&r)&&!function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!sr(a(),o))return!1}catch(s){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)&&(2===(t=bc(e,r))&&(0!==(i=gt(e))&&(r=i,t=ic(e,i))),1===t))throw n=Dl,pc(e,0),lc(e,r),oc(e,Ye()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(a(345));case 2:case 5:xc(e,Ul,Hl);break;case 3:if(lc(e,r),(130023424&r)===r&&10<(t=$l+500-Ye())){if(0!==ft(e,0))break;if(((o=e.suspendedLanes)&r)!==r){tc(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(xc.bind(null,e,Ul,Hl),t);break}xc(e,Ul,Hl);break;case 4:if(lc(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var s=31-it(r);i=1<<s,(s=t[s])>o&&(o=s),r&=~i}if(r=o,10<(r=(120>(r=Ye()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Cl(r/1960))-r)){e.timeoutHandle=ro(xc.bind(null,e,Ul,Hl),r);break}xc(e,Ul,Hl);break;default:throw Error(a(329))}}}return oc(e,Ye()),e.callbackNode===n?ac.bind(null,e):null}function ic(e,t){var n=Bl;return e.current.memoizedState.isDehydrated&&(pc(e,t).flags|=256),2!==(e=bc(e,t))&&(t=Ul,Ul=n,null!==t&&sc(t)),e}function sc(e){null===Ul?Ul=e:Ul.push.apply(Ul,e)}function lc(e,t){for(t&=~zl,t&=~Fl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-it(t),r=1<<n;e[n]=-1,t&=~r}}function cc(e){if(0!=(6&Ll))throw Error(a(327));Sc();var t=ft(e,0);if(0==(1&t))return oc(e,Ye()),null;var n=bc(e,t);if(0!==e.tag&&2===n){var r=gt(e);0!==r&&(t=r,n=ic(e,r))}if(1===n)throw n=Dl,pc(e,0),lc(e,t),oc(e,Ye()),n;if(6===n)throw Error(a(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,xc(e,Ul,Hl),oc(e,Ye()),null}function uc(e,t){var n=Ll;Ll|=1;try{return e(t)}finally{0===(Ll=n)&&(ql=Ye()+500,Bo&&qo())}}function dc(e){null!==Kl&&0===Kl.tag&&0==(6&Ll)&&Sc();var t=Ll;Ll|=1;var n=jl.transition,r=vt;try{if(jl.transition=null,vt=1,e)return e()}finally{vt=r,jl.transition=n,0==(6&(Ll=t))&&qo()}}function fc(){Ol=Pl.current,Eo(Pl)}function pc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Nl)for(n=Nl.return;null!==n;){var r=n;switch(na(r),r.tag){case 1:null!=(r=r.type.childContextTypes)&&Po();break;case 3:ai(),Eo(Ao),Eo(Lo),di();break;case 5:si(r);break;case 4:ai();break;case 13:case 19:Eo(li);break;case 10:Sa(r.type._context);break;case 22:case 23:fc()}n=n.return}if(Al=e,Nl=e=Pc(e.current,null),Rl=Ol=t,Il=0,Dl=null,zl=Fl=Ml=0,Ul=Bl=null,null!==Ta){for(t=0;t<Ta.length;t++)if(null!==(r=(n=Ta[t]).interleaved)){n.interleaved=null;var o=r.next,a=n.pending;if(null!==a){var i=a.next;a.next=o,r.next=i}n.pending=r}Ta=null}return e}function gc(e,t){for(;;){var n=Nl;try{if(xa(),fi.current=is,yi){for(var r=mi.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}yi=!1}if(gi=0,bi=hi=mi=null,vi=!1,wi=0,Tl.current=null,null===n||null===n.return){Il=1,Dl=t,Nl=null;break}e:{var i=e,s=n.return,l=n,c=t;if(t=Rl,l.flags|=32768,null!==c&&"object"==typeof c&&"function"==typeof c.then){var u=c,d=l,f=d.tag;if(0==(1&d.mode)&&(0===f||11===f||15===f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var g=bs(s);if(null!==g){g.flags&=-257,ys(g,s,l,0,t),1&g.mode&&hs(i,u,t),c=u;var m=(t=g).updateQueue;if(null===m){var h=new Set;h.add(c),t.updateQueue=h}else m.add(c);break e}if(0==(1&t)){hs(i,u,t),hc();break e}c=Error(a(426))}else if(aa&&1&l.mode){var b=bs(s);if(null!==b){0==(65536&b.flags)&&(b.flags|=256),ys(b,s,l,0,t),ma(us(c,l));break e}}i=c=us(c,l),4!==Il&&(Il=2),null===Bl?Bl=[i]:Bl.push(i),i=s;do{switch(i.tag){case 3:i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,gs(0,c,t));break e;case 1:l=c;var y=i.type,v=i.stateNode;if(0==(128&i.flags)&&("function"==typeof y.getDerivedStateFromError||null!==v&&"function"==typeof v.componentDidCatch&&(null===Vl||!Vl.has(v)))){i.flags|=65536,t&=-t,i.lanes|=t,Ma(i,ms(i,l,t));break e}}i=i.return}while(null!==i)}kc(n)}catch(w){t=w,Nl===n&&null!==n&&(Nl=n=n.return);continue}break}}function mc(){var e=El.current;return El.current=is,null===e?is:e}function hc(){0!==Il&&3!==Il&&2!==Il||(Il=4),null===Al||0==(268435455&Ml)&&0==(268435455&Fl)||lc(Al,Rl)}function bc(e,t){var n=Ll;Ll|=2;var r=mc();for(Al===e&&Rl===t||(Hl=null,pc(e,t));;)try{yc();break}catch(o){gc(e,o)}if(xa(),Ll=n,El.current=r,null!==Nl)throw Error(a(261));return Al=null,Rl=0,Il}function yc(){for(;null!==Nl;)wc(Nl)}function vc(){for(;null!==Nl&&!Ke();)wc(Nl)}function wc(e){var t=_l(e.alternate,e,Ol);e.memoizedProps=e.pendingProps,null===t?kc(e):Nl=t,Tl.current=null}function kc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(32768&t.flags)){if(null!==(n=Ws(n,t,Ol)))return void(Nl=n)}else{if(null!==(n=Ks(n,t)))return n.flags&=32767,void(Nl=n);if(null===e)return Il=6,void(Nl=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Nl=t);Nl=t=e}while(null!==t);0===Il&&(Il=5)}function xc(e,t,n){var r=vt,o=jl.transition;try{jl.transition=null,vt=1,function(e,t,n,r){do{Sc()}while(null!==Kl);if(0!=(6&Ll))throw Error(a(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackPriority=0;var i=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-it(n),a=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~a}}(e,i),e===Al&&(Nl=Al=null,Rl=0),0==(2064&n.subtreeFlags)&&0==(2064&n.flags)||Wl||(Wl=!0,Ac(tt,(function(){return Sc(),null}))),i=0!=(15990&n.flags),0!=(15990&n.subtreeFlags)||i){i=jl.transition,jl.transition=null;var s=vt;vt=1;var l=Ll;Ll|=4,Tl.current=null,function(e,t){if(eo=Ht,pr(e=fr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch(k){n=null;break e}var s=0,l=-1,c=-1,u=0,d=0,f=e,p=null;t:for(;;){for(var g;f!==n||0!==o&&3!==f.nodeType||(l=s+o),f!==i||0!==r&&3!==f.nodeType||(c=s+r),3===f.nodeType&&(s+=f.nodeValue.length),null!==(g=f.firstChild);)p=f,f=g;for(;;){if(f===e)break t;if(p===n&&++u===o&&(l=s),p===i&&++d===r&&(c=s),null!==(g=f.nextSibling))break;p=(f=p).parentNode}f=g}n=-1===l||-1===c?null:{start:l,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Js=t;null!==Js;)if(e=(t=Js).child,0!=(1028&t.subtreeFlags)&&null!==e)e.return=t,Js=e;else for(;null!==Js;){t=Js;try{var m=t.alternate;if(0!=(1024&t.flags))switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==m){var h=m.memoizedProps,b=m.memoizedState,y=t.stateNode,v=y.getSnapshotBeforeUpdate(t.elementType===t.type?h:ba(t.type,h),b);y.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var w=t.stateNode.containerInfo;1===w.nodeType?w.textContent="":9===w.nodeType&&w.documentElement&&w.removeChild(w.documentElement);break;default:throw Error(a(163))}}catch(k){Cc(t,t.return,k)}if(null!==(e=t.sibling)){e.return=t.return,Js=e;break}Js=t.return}m=nl,nl=!1}(e,n),bl(n,e),gr(to),Ht=!!eo,to=eo=null,e.current=n,vl(n,e,o),Qe(),Ll=l,vt=s,jl.transition=i}else e.current=n;if(Wl&&(Wl=!1,Kl=e,Ql=o),i=e.pendingLanes,0===i&&(Vl=null),function(e){if(at&&"function"==typeof at.onCommitFiberRoot)try{at.onCommitFiberRoot(ot,e,void 0,128==(128&e.current.flags))}catch(t){}}(n.stateNode),oc(e,Ye()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)o=t[n],r(o.value,{componentStack:o.stack,digest:o.digest});if(Zl)throw Zl=!1,e=Gl,Gl=null,e;0!=(1&Ql)&&0!==e.tag&&Sc(),i=e.pendingLanes,0!=(1&i)?e===Xl?Yl++:(Yl=0,Xl=e):Yl=0,qo()}(e,t,n,r)}finally{jl.transition=o,vt=r}return null}function Sc(){if(null!==Kl){var e=wt(Ql),t=jl.transition,n=vt;try{if(jl.transition=null,vt=16>e?16:e,null===Kl)var r=!1;else{if(e=Kl,Kl=null,Ql=0,0!=(6&Ll))throw Error(a(331));var o=Ll;for(Ll|=4,Js=e.current;null!==Js;){var i=Js,s=i.child;if(0!=(16&Js.flags)){var l=i.deletions;if(null!==l){for(var c=0;c<l.length;c++){var u=l[c];for(Js=u;null!==Js;){var d=Js;switch(d.tag){case 0:case 11:case 15:rl(8,d,i)}var f=d.child;if(null!==f)f.return=d,Js=f;else for(;null!==Js;){var p=(d=Js).sibling,g=d.return;if(il(d),d===u){Js=null;break}if(null!==p){p.return=g,Js=p;break}Js=g}}}var m=i.alternate;if(null!==m){var h=m.child;if(null!==h){m.child=null;do{var b=h.sibling;h.sibling=null,h=b}while(null!==h)}}Js=i}}if(0!=(2064&i.subtreeFlags)&&null!==s)s.return=i,Js=s;else e:for(;null!==Js;){if(0!=(2048&(i=Js).flags))switch(i.tag){case 0:case 11:case 15:rl(9,i,i.return)}var y=i.sibling;if(null!==y){y.return=i.return,Js=y;break e}Js=i.return}}var v=e.current;for(Js=v;null!==Js;){var w=(s=Js).child;if(0!=(2064&s.subtreeFlags)&&null!==w)w.return=s,Js=w;else e:for(s=v;null!==Js;){if(0!=(2048&(l=Js).flags))try{switch(l.tag){case 0:case 11:case 15:ol(9,l)}}catch(x){Cc(l,l.return,x)}if(l===s){Js=null;break e}var k=l.sibling;if(null!==k){k.return=l.return,Js=k;break e}Js=l.return}}if(Ll=o,qo(),at&&"function"==typeof at.onPostCommitFiberRoot)try{at.onPostCommitFiberRoot(ot,e)}catch(x){}r=!0}return r}finally{vt=n,jl.transition=t}}return!1}function _c(e,t,n){e=Ia(e,t=gs(0,t=us(n,t),1),1),t=tc(),null!==e&&(bt(e,1,t),oc(e,t))}function Cc(e,t,n){if(3===e.tag)_c(e,e,n);else for(;null!==t;){if(3===t.tag){_c(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Vl||!Vl.has(r))){t=Ia(t,e=ms(t,e=us(n,e),1),1),e=tc(),null!==t&&(bt(t,1,e),oc(t,e));break}}t=t.return}}function Ec(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=tc(),e.pingedLanes|=e.suspendedLanes&n,Al===e&&(Rl&n)===n&&(4===Il||3===Il&&(130023424&Rl)===Rl&&500>Ye()-$l?pc(e,0):zl|=n),oc(e,t)}function Tc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=ut,0==(130023424&(ut<<=1))&&(ut=4194304)));var n=tc();null!==(e=Aa(e,t))&&(bt(e,t,n),oc(e,n))}function jc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Tc(e,n)}function Lc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),Tc(e,n)}function Ac(e,t){return Ve(e,t)}function Nc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Rc(e,t,n,r){return new Nc(e,t,n,r)}function Oc(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Pc(e,t){var n=e.alternate;return null===n?((n=Rc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ic(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Oc(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case S:return Dc(n.children,o,i,t);case _:s=8,o|=8;break;case C:return(e=Rc(12,n,t,2|o)).elementType=C,e.lanes=i,e;case L:return(e=Rc(13,n,t,o)).elementType=L,e.lanes=i,e;case A:return(e=Rc(19,n,t,o)).elementType=A,e.lanes=i,e;case O:return Mc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case E:s=10;break e;case T:s=9;break e;case j:s=11;break e;case N:s=14;break e;case R:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Rc(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Dc(e,t,n,r){return(e=Rc(7,e,r,t)).lanes=n,e}function Mc(e,t,n,r){return(e=Rc(22,e,r,t)).elementType=O,e.lanes=n,e.stateNode={isHidden:!1},e}function Fc(e,t,n){return(e=Rc(6,e,null,t)).lanes=n,e}function zc(e,t,n){return(t=Rc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Bc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ht(0),this.expirationTimes=ht(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ht(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Uc(e,t,n,r,o,a,i,s,l){return e=new Bc(e,t,n,s,l),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Rc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ra(a),e}function $c(e){if(!e)return jo;e:{if($e(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Oo(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(Oo(n))return Do(e,n,t)}return t}function qc(e,t,n,r,o,a,i,s,l){return(e=Uc(n,r,!0,e,0,a,0,s,l)).context=$c(null),n=e.current,(a=Pa(r=tc(),o=nc(n))).callback=null!=t?t:null,Ia(n,a,o),e.current.lanes=o,bt(e,o,r),oc(e,r),e}function Hc(e,t,n,r){var o=t.current,a=tc(),i=nc(o);return n=$c(n),null===t.context?t.context=n:t.pendingContext=n,(t=Pa(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ia(o,t,i))&&(rc(e,o,i,a),Da(e,o,i)),i}function Zc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Gc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Vc(e,t){Gc(e,t),(e=e.alternate)&&Gc(e,t)}_l=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Ao.current)ws=!0;else{if(0==(e.lanes&n)&&0==(128&t.flags))return ws=!1,function(e,t,n){switch(t.tag){case 3:As(t),ga();break;case 5:ii(t);break;case 1:Oo(t.type)&&Mo(t);break;case 4:oi(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;To(ya,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(To(li,1&li.current),t.flags|=128,null):0!=(n&t.child.childLanes)?Fs(e,t,n):(To(li,1&li.current),null!==(e=Zs(e,t,n))?e.sibling:null);To(li,1&li.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(128&e.flags)){if(r)return qs(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),To(li,li.current),r)break;return null;case 22:case 23:return t.lanes=0,Cs(e,t,n)}return Zs(e,t,n)}(e,t,n);ws=0!=(131072&e.flags)}else ws=!1,aa&&0!=(1048576&t.flags)&&ea(t,Vo,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Hs(e,t),e=t.pendingProps;var o=Ro(t,Lo.current);Ca(t,n),o=_i(null,t,r,e,o,n);var i=Ci();return t.flags|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Oo(r)?(i=!0,Mo(t)):i=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,Ra(t),o.updater=$a,t.stateNode=o,o._reactInternals=t,Ga(t,r,e,n),t=Ls(null,t,r,!0,i,n)):(t.tag=0,aa&&i&&ta(t),ks(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Hs(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"==typeof e)return Oc(e)?1:0;if(null!=e){if((e=e.$$typeof)===j)return 11;if(e===N)return 14}return 2}(r),e=ba(r,e),o){case 0:t=Ts(null,t,r,e,n);break e;case 1:t=js(null,t,r,e,n);break e;case 11:t=xs(null,t,r,e,n);break e;case 14:t=Ss(null,t,r,ba(r.type,e),n);break e}throw Error(a(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,Ts(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 1:return r=t.type,o=t.pendingProps,js(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 3:e:{if(As(t),null===e)throw Error(a(387));r=t.pendingProps,o=(i=t.memoizedState).element,Oa(e,t),Fa(t,r,null,n);var s=t.memoizedState;if(r=s.element,i.isDehydrated){if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=i,t.memoizedState=i,256&t.flags){t=Ns(e,t,r,n,o=us(Error(a(423)),t));break e}if(r!==o){t=Ns(e,t,r,n,o=us(Error(a(424)),t));break e}for(oa=co(t.stateNode.containerInfo.firstChild),ra=t,aa=!0,ia=null,n=Xa(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ga(),r===o){t=Zs(e,t,n);break e}ks(e,t,r,n)}t=t.child}return t;case 5:return ii(t),null===e&&ua(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,s=o.children,no(r,o)?s=null:null!==i&&no(r,i)&&(t.flags|=32),Es(e,t),ks(e,t,s,n),t.child;case 6:return null===e&&ua(t),null;case 13:return Fs(e,t,n);case 4:return oi(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ya(t,null,r,n):ks(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,xs(e,t,r,o=t.elementType===r?o:ba(r,o),n);case 7:return ks(e,t,t.pendingProps,n),t.child;case 8:case 12:return ks(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,s=o.value,To(ya,r._currentValue),r._currentValue=s,null!==i)if(sr(i.value,s)){if(i.children===o.children&&!Ao.current){t=Zs(e,t,n);break e}}else for(null!==(i=t.child)&&(i.return=t);null!==i;){var l=i.dependencies;if(null!==l){s=i.child;for(var c=l.firstContext;null!==c;){if(c.context===r){if(1===i.tag){(c=Pa(-1,n&-n)).tag=2;var u=i.updateQueue;if(null!==u){var d=(u=u.shared).pending;null===d?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,null!==(c=i.alternate)&&(c.lanes|=n),_a(i.return,n,t),l.lanes|=n;break}c=c.next}}else if(10===i.tag)s=i.type===t.type?null:i.child;else if(18===i.tag){if(null===(s=i.return))throw Error(a(341));s.lanes|=n,null!==(l=s.alternate)&&(l.lanes|=n),_a(s,n,t),s=i.sibling}else s=i.child;if(null!==s)s.return=i;else for(s=i;null!==s;){if(s===t){s=null;break}if(null!==(i=s.sibling)){i.return=s.return,s=i;break}s=s.return}i=s}ks(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Ca(t,n),r=r(o=Ea(o)),t.flags|=1,ks(e,t,r,n),t.child;case 14:return o=ba(r=t.type,t.pendingProps),Ss(e,t,r,o=ba(r.type,o),n);case 15:return _s(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:ba(r,o),Hs(e,t),t.tag=1,Oo(r)?(e=!0,Mo(t)):e=!1,Ca(t,n),Ha(t,r,o),Ga(t,r,o,n),Ls(null,t,r,!0,e,n);case 19:return qs(e,t,n);case 22:return Cs(e,t,n)}throw Error(a(156,t.tag))};var Wc="function"==typeof reportError?reportError:function(e){console.error(e)};function Kc(e){this._internalRoot=e}function Qc(e){this._internalRoot=e}function Yc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Xc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Jc(){}function eu(e,t,n,r,o){var a=n._reactRootContainer;if(a){var i=a;if("function"==typeof o){var s=o;o=function(){var e=Zc(i);s.call(e)}}Hc(t,i,e,o)}else i=function(e,t,n,r,o){if(o){if("function"==typeof r){var a=r;r=function(){var e=Zc(i);a.call(e)}}var i=qc(t,r,e,0,null,!1,0,"",Jc);return e._reactRootContainer=i,e[mo]=i.current,$r(8===e.nodeType?e.parentNode:e),dc(),i}for(;o=e.lastChild;)e.removeChild(o);if("function"==typeof r){var s=r;r=function(){var e=Zc(l);s.call(e)}}var l=Uc(e,0,!1,null,0,!1,0,"",Jc);return e._reactRootContainer=l,e[mo]=l.current,$r(8===e.nodeType?e.parentNode:e),dc((function(){Hc(t,l,n,r)})),l}(n,t,e,o,r);return Zc(i)}Qc.prototype.render=Kc.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(a(409));Hc(e,t,null,null)},Qc.prototype.unmount=Kc.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;dc((function(){Hc(null,e,null,null)})),t[mo]=null}},Qc.prototype.unstable_scheduleHydration=function(e){if(e){var t=_t();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Ot.length&&0!==t&&t<Ot[n].priority;n++);Ot.splice(n,0,e),0===n&&Mt(e)}},kt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),oc(t,Ye()),0==(6&Ll)&&(ql=Ye()+500,qo()))}break;case 13:dc((function(){var t=Aa(e,1);if(null!==t){var n=tc();rc(t,e,1,n)}})),Vc(e,1)}},xt=function(e){if(13===e.tag){var t=Aa(e,134217728);if(null!==t)rc(t,e,134217728,tc());Vc(e,134217728)}},St=function(e){if(13===e.tag){var t=nc(e),n=Aa(e,t);if(null!==n)rc(n,e,t,tc());Vc(e,t)}},_t=function(){return vt},Ct=function(e,t){var n=vt;try{return vt=e,t()}finally{vt=n}},xe=function(e,t,n){switch(t){case"input":if(X(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=xo(r);if(!o)throw Error(a(90));V(r),X(r,o)}}}break;case"textarea":ae(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},je=uc,Le=dc;var tu={usingClientEntryPoint:!1,Events:[wo,ko,xo,Ee,Te,uc]},nu={findFiberByHostInstance:vo,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},ru={bundleType:nu.bundleType,version:nu.version,rendererPackageName:nu.rendererPackageName,rendererConfig:nu.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:w.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ze(e))?null:e.stateNode},findFiberByHostInstance:nu.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var ou=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!ou.isDisabled&&ou.supportsFiber)try{ot=ou.inject(ru),at=ou}catch(ue){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tu,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Yc(t))throw Error(a(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:x,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.createRoot=function(e,t){if(!Yc(e))throw Error(a(299));var n=!1,r="",o=Wc;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Uc(e,1,!1,null,0,n,0,r,o),e[mo]=t.current,$r(8===e.nodeType?e.parentNode:e),new Kc(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw e=Object.keys(e).join(","),Error(a(268,e))}return e=null===(e=Ze(t))?null:e.stateNode},t.flushSync=function(e){return dc(e)},t.hydrate=function(e,t,n){if(!Xc(t))throw Error(a(200));return eu(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Yc(e))throw Error(a(405));var r=null!=n&&n.hydratedSources||null,o=!1,i="",s=Wc;if(null!=n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(i=n.identifierPrefix),void 0!==n.onRecoverableError&&(s=n.onRecoverableError)),t=qc(t,null,e,1,null!=n?n:null,o,0,i,s),e[mo]=t.current,$r(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Qc(t)},t.render=function(e,t,n){if(!Xc(t))throw Error(a(200));return eu(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Xc(e))throw Error(a(40));return!!e._reactRootContainer&&(dc((function(){eu(null,null,e,!1,(function(){e._reactRootContainer=null,e[mo]=null}))})),!0)},t.unstable_batchedUpdates=uc,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Xc(n))throw Error(a(200));if(null==e||void 0===e._reactInternals)throw Error(a(38));return eu(e,t,n,!1,r)},t.version="18.2.0-next-9e3b772b8-20220608"},745:(e,t,n)=>{"use strict";var r=n(3935);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},3935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(4448)},9590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>Z,ql:()=>J});var r=n(7294),o=n(5697),a=n.n(o),i=n(9590),s=n.n(i),l=n(1143),c=n.n(l),u=n(6774),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(h).map((function(e){return h[e]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(k).reduce((function(e,t){return e[k[t]]=t,e}),{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},_=function(e){var t=S(e,h.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=S(e,"defaultTitle");return t||r||void 0},C=function(e){return S(e,"onChangeClientState")||function(){}},E=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t}),[])},j=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var o={};n.filter((function(e){for(var n,a=Object.keys(e),i=0;i<a.length;i+=1){var s=a[i],l=s.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(s)||"innerHTML"!==s&&"cssText"!==s&&"itemprop"!==s||(n=s)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][c]&&(o[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var a=Object.keys(o),i=0;i<a.length;i+=1){var s=a[i],l=f({},r[s],o[s]);r[s]=l}return e}),[]).reverse()},L=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},A=function(e){return Array.isArray(e)?e.join(""):e},N=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},R=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},O=[h.NOSCRIPT,h.SCRIPT,h.STYLE],P=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},I=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},M=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},F=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=D(n,o),[r.createElement(h.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=I(n),a=A(t);return o?"<"+e+' data-rh="true" '+o+">"+P(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+P(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return I(t)}};default:return{toComponent:function(){return M(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+P(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===O.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"</"+e+">")}),"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=N(e.metaTags,v),a=N(t,b),i=N(n,y);return{priorityMethods:{toComponent:function(){return[].concat(M(h.META,o.priority),M(h.LINK,a.priority),M(h.SCRIPT,i.priority))},toString:function(){return F(h.META,o.priority,r)+" "+F(h.LINK,a.priority,r)+" "+F(h.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);p=g.priorityMethods,u=g.linkTags,d=g.metaTags,f=g.scriptTags}return{priority:p,base:F(h.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(h.LINK,u,r),meta:F(h.META,d,r),noscript:F(h.NOSCRIPT,a,r),script:F(h.SCRIPT,f,r),style:F(h.STYLE,i,r),title:F(h.TITLE,{title:l,titleAttributes:c},r)}},B=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),q=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,Z=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);Z.canUseDOM=H,Z.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},Z.defaultProps={context:{}},Z.displayName="HelmetProvider";var G=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},V=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),s=0;s<i.length;s+=1){var l=i[s],c=t[l]||"";n.getAttribute(l)!==c&&n.setAttribute(l,c),-1===o.indexOf(l)&&o.push(l);var u=a.indexOf(l);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},W=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;V(h.BODY,e.bodyAttributes),V(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=A(e)),V(h.TITLE,t)}(u,d);var f={baseTag:G(h.BASE,n),linkTags:G(h.LINK,o),metaTags:G(h.META,a),noscriptTags:G(h.NOSCRIPT,i),scriptTags:G(h.SCRIPT,l),styleTags:G(h.STYLE,c)},p={},g={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(g[e]=f[e].oldTags)})),t&&t(),s(e,p,g)},K=null,Q=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,o=null,a=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:E("bodyAttributes",e),defer:S(e,"defer"),encode:S(e,"encodeSpecialCharacters"),htmlAttributes:E("htmlAttributes",e),linkTags:j(h.LINK,["rel","href"],e),metaTags:j(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:j(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:C(e),scriptTags:j(h.SCRIPT,["src","innerHTML"],e),styleTags:j(h.STYLE,["cssText"],e),title:_(e),titleAttributes:E("titleAttributes",e),prioritizeSeoTags:L(e,"prioritizeSeoTags")});Z.canUseDOM?(t=a,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){W(t,(function(){K=null}))})):(W(t),K=null)):z&&(o=z(a)),r(o)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Q.propTypes={context:q.isRequired},Q.displayName="HelmetDispatcher";var Y=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!s()(R(this.props,"helmetData"),R(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return f({},o,((t={})[r.type]=i,t.titleAttributes=f({},a),t));case h.BODY:return f({},o,{bodyAttributes:f({},a)});case h.HTML:return f({},o,{htmlAttributes:f({},a)});default:return f({},o,((n={})[r.type]=f({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=m(r,Y),s=Object.keys(i).reduce((function(e,t){return e[x[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case h.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),o=f({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof U||(a=new U(a.context,a.instances)),a?r.createElement(Q,f({},o,{context:a.value,helmetData:void 0})):r.createElement($.Consumer,null,(function(e){return r.createElement(Q,f({},o,{context:e}))}))},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},9921:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case h:case m:case l:return e;default:return t}}case o:return t}}}function x(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=f,t.Fragment=a,t.Lazy=h,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return x(e)||k(e)===u},t.isConcurrentMode=x,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===f},t.isFragment=function(e){return k(e)===a},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===o},t.isProfiler=function(e){return k(e)===s},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===p||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===l||e.$$typeof===c||e.$$typeof===f||e.$$typeof===y||e.$$typeof===v||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},9864:(e,t,n)=>{"use strict";e.exports=n(9921)},8356:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var s=n(7294),l=n(5697),c=[],u=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return s.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function g(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return c.push(h),"function"==typeof g.webpack&&u.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),r._loadModule()})),h(),r.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},r}r(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.loadable.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(s.Component),a(d,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),f}function m(e){return g(d,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(f,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return s.Children.only(this.props.children)},t}(s.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}a(h,"propTypes",{report:l.func.isRequired}),a(h,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=m},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>s,f:()=>i});var r=n(6550),o=n(7462),a=n(7294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.LX)(t,e):n.length?n[n.length-1].match:r.F0.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.rs,n,e.map((function(e,n){return a.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.Z)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.Z)({},n,t,{route:e}))}})}))):null}},3727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>v,VK:()=>u,rU:()=>h});var r=n(6550),o=n(5068),a=n(7294),i=n(9318),s=n(7462),l=n(3366),c=n(8776),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.lX)(t.props),t}return(0,o.Z)(t,e),t.prototype.render=function(){return a.createElement(r.F0,{history:this.history,children:this.props.children})},t}(a.Component);a.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},p=function(e){return e},g=a.forwardRef;void 0===g&&(g=p);var m=g((function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,i=(0,l.Z)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,s.Z)({},i,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=p!==g&&t||n,a.createElement("a",u)}));var h=g((function(e,t){var n=e.component,o=void 0===n?m:n,u=e.replace,h=e.to,b=e.innerRef,y=(0,l.Z)(e,["component","replace","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=e.history,r=f(d(h,e.location),e.location),l=r?n.createHref(r):"",m=(0,s.Z)({},y,{href:l,navigate:function(){var t=d(h,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(f(t));(u||r?n.replace:n.push)(t)}});return p!==g?m.ref=t||b:m.innerRef=b,a.createElement(o,m)}))})),b=function(e){return e},y=a.forwardRef;void 0===y&&(y=b);var v=y((function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,p=e.activeStyle,g=e.className,m=e.exact,v=e.isActive,w=e.location,k=e.sensitive,x=e.strict,S=e.style,_=e.to,C=e.innerRef,E=(0,l.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=w||e.location,i=f(d(_,n),n),l=i.pathname,T=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),j=T?(0,r.LX)(n.pathname,{path:T,exact:m,sensitive:k,strict:x}):null,L=!!(v?v(j,n):j),A="function"==typeof g?g(L):g,N="function"==typeof S?S(L):S;L&&(A=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(A,u),N=(0,s.Z)({},N,p));var R=(0,s.Z)({"aria-current":L&&o||null,className:A,style:N,to:i},E);return b!==y?R.ref=t||C:R.innerRef=C,a.createElement(h,R)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>_,F0:()=>v,LX:()=>S,TH:()=>O,k6:()=>R,rs:()=>A,s6:()=>y});var r=n(5068),o=n(7294),a=n(5697),i=n.n(a),s=n(9318),l=n(8776),c=n(7462),u=n(4779),d=n.n(u),f=(n(9864),n(3366)),p=(n(8679),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i<o;i++)a[i]=arguments[i];return(t=e.call.apply(e,[this].concat(a))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.Z)(n,e);var o=n.prototype;return o.getChildContext=function(){var e;return(e={})[s]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},o.render=function(){return this.props.children},n}(o.Component);l.childContextTypes=((n={})[s]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,r.Z)(n,t);var o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},o.componentDidMount=function(){this.context[s]&&this.context[s].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},o.componentWillUnmount=function(){this.context[s]&&this.context[s].off(this.onUpdate)},o.getValue=function(){return this.context[s]?this.context[s].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return c.contextTypes=((a={})[s]=i().object,a),{Provider:l,Consumer:c}},h=function(e){var t=m();return t.displayName=e,t},b=h("Router-History"),y=h("Router"),v=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;o.Component;var w={},k=1e4,x=0;function S(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,i=n.strict,s=void 0!==i&&i,l=n.sensitive,c=void 0!==l&&l;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=w[n]||(w[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return x<k&&(r[e]=a,x++),a}(n,{end:a,strict:s,sensitive:c}),o=r.regexp,i=r.keys,l=o.exec(e);if(!l)return null;var u=l[0],f=l.slice(1),p=e===u;return a&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var _=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return o.createElement(y.Consumer,null,(function(t){t||(0,l.Z)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?S(n.pathname,e.props):t.match,a=(0,c.Z)({},t,{location:n,match:r}),i=e.props,s=i.children,u=i.component,d=i.render;return Array.isArray(s)&&function(e){return 0===o.Children.count(e)}(s)&&(s=null),o.createElement(y.Provider,{value:a},a.match?s?"function"==typeof s?s(a):s:u?o.createElement(u,a):d?d(a):null:"function"==typeof s?s(a):null)}))},t}(o.Component);function C(e){return"/"===e.charAt(0)?e:"/"+e}function E(e,t){if(!e)return t;var n=C(e);return 0!==t.pathname.indexOf(n)?t:(0,c.Z)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,s.Ep)(e)}function j(e){return function(){(0,l.Z)(!1)}}function L(){}o.Component;var A=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return o.createElement(y.Consumer,null,(function(t){t||(0,l.Z)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,(function(e){if(null==r&&o.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?S(a.pathname,(0,c.Z)({},e.props,{path:i})):t.match}})),r?o.cloneElement(n,{location:a,computedMatch:r}):null}))},t}(o.Component);var N=o.useContext;function R(){return N(b)}function O(){return N(y).location}},5251:(e,t,n)=>{"use strict";var r=n(7294),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},2408:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,h={};function b(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=h,this.updater=n||g}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var w=v.prototype=new y;w.constructor=v,m(w,b.prototype),w.isPureReactComponent=!0;var k=Array.isArray,x=Object.prototype.hasOwnProperty,S={current:null},_={key:!0,ref:!0,__self:!0,__source:!0};function C(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)x.call(t,o)&&!_.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in l=e.defaultProps)void 0===a[o]&&(a[o]=l[o]);return{$$typeof:n,type:e,key:i,ref:s,props:a,_owner:S.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function j(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function L(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l=!1;if(null===e)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case r:l=!0}}if(l)return i=i(l=e),e=""===a?"."+j(l,0):a,k(i)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),L(i,t,o,"",(function(e){return e}))):null!=i&&(E(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||l&&l.key===i.key?"":(""+i.key).replace(T,"$&/")+"/")+e)),t.push(i)),1;if(l=0,a=""===a?".":a+":",k(e))for(var c=0;c<e.length;c++){var u=a+j(s=e[c],c);l+=L(s,t,o,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(s=e.next()).done;)l+=L(s=s.value,t,o,u=a+j(s,c++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return l}function A(e,t,n){if(null==e)return e;var r=[],o=0;return L(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function N(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var R={current:null},O={transition:null},P={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:O,ReactCurrentOwner:S};t.Children={map:A,forEach:function(e,t,n){A(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return A(e,(function(){t++})),t},toArray:function(e){return A(e,(function(e){return e}))||[]},only:function(e){if(!E(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=o,t.Profiler=i,t.PureComponent=v,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=P,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=m({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=S.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)x.call(t,c)&&!_.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==l?l[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){l=Array(c);for(var u=0;u<c;u++)l[u]=arguments[u+2];o.children=l}return{$$typeof:n,type:e.type,key:a,ref:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=C,t.createFactory=function(e){var t=C.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:N}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=O.transition;O.transition={};try{e()}finally{O.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return R.current.useCallback(e,t)},t.useContext=function(e){return R.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return R.current.useDeferredValue(e)},t.useEffect=function(e,t){return R.current.useEffect(e,t)},t.useId=function(){return R.current.useId()},t.useImperativeHandle=function(e,t,n){return R.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return R.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return R.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return R.current.useMemo(e,t)},t.useReducer=function(e,t,n){return R.current.useReducer(e,t,n)},t.useRef=function(e){return R.current.useRef(e)},t.useState=function(e){return R.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return R.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return R.current.useTransition()},t.version="18.2.0"},7294:(e,t,n)=>{"use strict";e.exports=n(2408)},5893:(e,t,n)=>{"use strict";e.exports=n(5251)},53:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var s=2*(r+1)-1,l=e[s],c=s+1,u=e[c];if(0>a(l,n))c<o&&0>a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,f=null,p=3,g=!1,m=!1,h=!1,b="function"==typeof setTimeout?setTimeout:null,y="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(h=!1,w(e),!m)if(null!==r(c))m=!0,O(x);else{var t=r(u);null!==t&&P(k,t.startTime-e)}}function x(e,n){m=!1,h&&(h=!1,y(E),E=-1),g=!0;var a=p;try{for(w(n),f=r(c);null!==f&&(!(f.expirationTime>n)||e&&!L());){var i=f.callback;if("function"==typeof i){f.callback=null,p=f.priorityLevel;var s=i(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?f.callback=s:f===r(c)&&o(c),w(n)}else o(c);f=r(c)}if(null!==f)var l=!0;else{var d=r(u);null!==d&&P(k,d.startTime-n),l=!1}return l}finally{f=null,p=a,g=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var S,_=!1,C=null,E=-1,T=5,j=-1;function L(){return!(t.unstable_now()-j<T)}function A(){if(null!==C){var e=t.unstable_now();j=e;var n=!0;try{n=C(!0,e)}finally{n?S():(_=!1,C=null)}}else _=!1}if("function"==typeof v)S=function(){v(A)};else if("undefined"!=typeof MessageChannel){var N=new MessageChannel,R=N.port2;N.port1.onmessage=A,S=function(){R.postMessage(null)}}else S=function(){b(A,0)};function O(e){C=e,_||(_=!0,S())}function P(e,n){E=b((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){m||g||(m=!0,O(x))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):T=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return r(c)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:s=a+s,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(h?(y(E),E=-1):h=!0,P(k,a-i))):(e.sortIndex=s,n(c,e),m||g||(m=!0,O(x))),e},t.unstable_shouldYield=L,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},3840:(e,t,n)=>{"use strict";e.exports=n(53)},6774:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l<a.length;l++){var c=a[l];if(!s(c))return!1;var u=e[c],d=t[c];if(!1===(o=n?n.call(r,u,d,c):void 0)||void 0===o&&u!==d)return!1}return!0}},6809:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Fleek Network Docs | Decentralized Edge Platform",tagline:"Welcome to the docs of Fleek Network, a decentralized edge platform for building web3 edge services.",url:"https://docs.fleek.network",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/favicon.ico?202301091316",organizationName:"fleek-network",projectName:"fleek-network-docs",deploymentBranch:"gh-pages",trailingSlash:!0,i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{routeBasePath:"/docs",breadcrumbs:!0,sidebarPath:"/home/runner/work/fleek-network-docs/fleek-network-docs/sidebars.js",sidebarCollapsed:!1,sidebarCollapsible:!1},blog:{path:"blog",blogSidebarCount:"ALL",blogSidebarTitle:"All Blog Posts",feedOptions:{type:"all",copyright:"Copyright \xa9 2023 Fleek"}},theme:{customCss:"/home/runner/work/fleek-network-docs/fleek-network-docs/src/css/custom.css"},sitemap:{changefreq:"weekly",priority:.9,ignorePatterns:["/tags/**"],filename:"sitemap.xml"}}]],themeConfig:{image:"img/documentation.png",metadata:[{description:"Welcome to the docs of Fleek Network, a decentralized edge platform for building edge services."}],colorMode:{defaultMode:"dark",disableSwitch:!0,respectPrefersColorScheme:!1},navbar:{logo:{alt:"Fleek",src:"img/logo.png?2023091241"},items:[{to:"docs",label:"Documentation",position:"left"},{to:"blog",label:"Engineering",position:"left"},{to:"guides",label:"Guides",position:"left"},{to:"references",label:"References",position:"left"},{href:"https://github.com/fleek-network/",label:"Github",position:"left",target:"_blank"}],hideOnScroll:!1},footer:{style:"light",links:[{title:"Resources",items:[{to:"docs",label:"Documentation",position:"left"},{to:"blog",label:"Engineering",position:"left"},{to:"guides",label:"Guides",position:"left"},{to:"references",label:"References",position:"left"},{href:"https://github.com/fleek-network/",label:"Github",position:"left",target:"_blank"}]},{title:"Community",items:[{label:"Discord",href:"https://discord.gg/fleekxyz"},{label:"Twitter",href:"https://twitter.com/fleek_net"}]},{title:"Company",items:[{label:"Home",href:"https://fleek.network/"},{label:"Contact us",href:"https://discord.gg/fleekxyz"}]}],logo:{alt:"Fleek Network",src:"img/logo+named.svg?202301101154",href:"https://fleek.network",width:160}},prism:{theme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},algolia:{appId:"ZLPPXSKTFE",apiKey:"33ed5b78ac12317e4243d3f44874cbc8",indexName:"fleek",contextualSearch:!0,searchPagePath:"search",schedule:"every 1 day at 6:00 pm",searchParameters:{}},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},plugins:[["@docusaurus/plugin-google-tag-manager",{containerId:"GTM-PC422SF"}],["content-docs",{id:"guides",path:"guides",routeBasePath:"/guides",sidebarCollapsed:!1,sidebarCollapsible:!1,breadcrumbs:!1,showLastUpdateAuthor:!1,showLastUpdateTime:!0,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/"}],["content-docs",{id:"references",path:"references",routeBasePath:"/references",sidebarCollapsed:!0,sidebarCollapsible:!0,breadcrumbs:!1,showLastUpdateAuthor:!1,showLastUpdateTime:!0,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/"}]],baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0}}}},7462:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{Z:()=>r})},5068:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>o})},3366:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}n.d(t,{Z:()=>r})},512:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n);else for(t in e)e[t]&&(o&&(o+=" "),o+=t);return o}n.d(t,{Z:()=>o});const o=function(){for(var e,t,n=0,o="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},204:(e,t,n)=>{"use strict";n.d(t,{y$:()=>J,p1:()=>E});var r=n(7294);function o(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=o(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}const a=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=o(e))&&(r&&(r+=" "),r+=t);return r};var i,s,l,c,u,d=Object.create,f=Object.defineProperty,p=Object.defineProperties,g=Object.getOwnPropertyDescriptor,m=Object.getOwnPropertyDescriptors,h=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols,y=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty,w=Object.prototype.propertyIsEnumerable,k=(e,t,n)=>t in e?f(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,x=(e,t)=>{for(var n in t||(t={}))v.call(t,n)&&k(e,n,t[n]);if(b)for(var n of b(t))w.call(t,n)&&k(e,n,t[n]);return e},S=(e,t)=>p(e,m(t)),_=(e,t)=>{var n={};for(var r in e)v.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&b)for(var r of b(e))t.indexOf(r)<0&&w.call(e,r)&&(n[r]=e[r]);return n},C=(i={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var i in o={},n[a]=o,t)t.hasOwnProperty(i)&&(o[i]=e(t[i],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach((function(t,r){o[r]=e(t,n)})),o);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var o=e.classList;if(o.contains(t))return!0;if(o.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],i={};for(var s in a)if(a.hasOwnProperty(s)){if(s==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(s)||(i[s]=a[s])}var c=o[e];return o[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,o,a){a=a||{};var i=r.util.objId;for(var s in t)if(t.hasOwnProperty(s)){n.call(t,s,t[s],o||s);var l=t[s],c=r.util.type(l);"Object"!==c||a[i(l)]?"Array"!==c||a[i(l)]||(a[i(l)]=!0,e(l,n,s,a)):(a[i(l)]=!0,e(l,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new s;return l(o,o.head,e),i(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function i(e,t,n,s,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var g=0;g<p.length;++g){if(d&&d.cause==f+","+g)return;var m=p[g],h=m.inside,b=!!m.lookbehind,y=!!m.greedy,v=m.alias;if(y&&!m.pattern.global){var w=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,w+"g")}for(var k=m.pattern||m,x=s.next,S=u;x!==t.tail&&!(d&&S>=d.reach);S+=x.value.length,x=x.next){var _=x.value;if(t.length>e.length)return;if(!(_ instanceof o)){var C,E=1;if(y){if(!(C=a(k,S,e,b))||C.index>=e.length)break;var T=C.index,j=C.index+C[0].length,L=S;for(L+=x.value.length;T>=L;)L+=(x=x.next).value.length;if(S=L-=x.value.length,x.value instanceof o)continue;for(var A=x;A!==t.tail&&(L<j||"string"==typeof A.value);A=A.next)E++,L+=A.value.length;E--,_=e.slice(S,L),C.index-=S}else if(!(C=a(k,0,_,b)))continue;T=C.index;var N=C[0],R=_.slice(0,T),O=_.slice(T+N.length),P=S+_.length;d&&P>d.reach&&(d.reach=P);var I=x.prev;if(R&&(I=l(t,I,R),S+=R.length),c(t,I,E),x=l(t,I,new o(f,h?r.tokenize(N,h):N,v,N)),O&&l(t,x,O),E>1){var D={cause:f+","+g,reach:P};i(e,t,n,x.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach((function(t){o+=e(t,n)})),o}var a={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(a.classes,i):a.classes.push(i)),r.hooks.run("wrap",a);var s="";for(var l in a.attributes)s+=" "+l+'="'+(a.attributes[l]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+s+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return s||(0,i[h(i)[0]])((s={exports:{}}).exports,s),s.exports}),E=((e,t,n)=>(n=null!=e?d(y(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of h(t))v.call(e,o)||o===n||f(e,o,{get:()=>t[o],enumerable:!(r=g(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:f(n,"default",{value:e,enumerable:!0}),e)))(C());!function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(E),E.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},E.languages.javascript=E.languages.extend("clike",{"class-name":[E.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),E.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,E.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:E.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:E.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:E.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:E.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:E.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),E.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:E.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),E.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),E.languages.markup&&(E.languages.markup.tag.addInlined("script","javascript"),E.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),E.languages.js=E.languages.javascript,E.languages.actionscript=E.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),E.languages.actionscript["class-name"].alias="function",delete E.languages.actionscript.parameter,delete E.languages.actionscript["literal-property"],E.languages.markup&&E.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:E.languages.markup}}),c=/#(?!\{).+/,u={pattern:/#\{[^}]+\}/,alias:"variable"},(l=E).languages.coffeescript=l.languages.extend("javascript",{comment:c,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:u}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),l.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:c,interpolation:u}}}),l.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:l.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:u}}]}),l.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete l.languages.coffeescript["template-string"],l.languages.coffee=l.languages.coffeescript,function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var s=0,l=i.length;s<l;s++)i[s]instanceof RegExp&&(i[s]={pattern:i[s]}),r(i[s]);else r(i)}}))}}),t.addSupport(["java","javascript","php"],t)}(E),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(E),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(E),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(E),E.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},E.languages.markup.tag.inside["attr-value"].inside.entity=E.languages.markup.entity,E.languages.markup.doctype.inside["internal-subset"].inside=E.languages.markup,E.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(E.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:E.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:E.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},E.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(E.languages.markup.tag,"addAttribute",{value:function(e,t){E.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:E.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),E.languages.html=E.languages.markup,E.languages.mathml=E.languages.markup,E.languages.svg=E.languages.markup,E.languages.xml=E.languages.extend("markup",{}),E.languages.ssml=E.languages.xml,E.languages.atom=E.languages.xml,E.languages.rss=E.languages.xml,function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var c,u=e.languages[n];u?t.content=e.highlight(t.content.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n)):s[t]||e})),u,n):n&&"none"!==n&&e.plugins.autoloader&&(c="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=c,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(c);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))})))}})),RegExp(e.languages.markup.tag.pattern.source,"gi")),s={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(E),E.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:E.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},E.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=f(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),o.push(i.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),0<o.length)){var s=f(/^\{$/,/^\}$/);if(-1!==s)for(var l=n;l<s;l++){var c=t[l];"variable"===c.type&&0<=o.indexOf(c.content)&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function f(e,r){for(var o=1,a=n;a<t.length;a++){var i=t[a],s=i.content;if("punctuation"===i.type&&"string"==typeof s)if(e.test(s))o++;else if(r.test(s)&&0==--o)return a}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),E.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a<n.length;a++){if(c>=d.length)return;var i,l,f,p,g,m,h,b=n[a];"string"==typeof b||"string"==typeof b.content?(i=d[c],-1!==(h=(m="string"==typeof b?b:b.content).indexOf(i))&&(++c,l=m.substring(0,h),g=u[i],f=void 0,(p={})["interpolation-punctuation"]=o,3===(p=e.tokenize(g,p)).length&&((f=[1,1]).push.apply(f,s(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,g),p=m.substring(h+i.length),g=[],l&&g.push(l),g.push(f),p&&(t(m=[p]),g.push.apply(g,m)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(g)),a+=g.length-1):b.content=g)):(h=b.content,Array.isArray(h)?t(h):t([h]))}}(l),new e.Token(i,l,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,i,s,c=n[r];"string"!=typeof c&&(a=c.content,Array.isArray(a)?"template-string"===c.type?(c=a[1],3===a.length&&"string"!=typeof c&&"embedded-code"===c.type&&(i=u(c),c=c.alias,c=Array.isArray(c)?c[0]:c,s=e.languages[c])&&(a[1]=l(i,s,c))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)}))}(E),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(E),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(E),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(E),E.languages.n4js=E.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),E.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),E.languages.n4jsd=E.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(E),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===s(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:s(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=s(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=s(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=s(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&i(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(E),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(E),E.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},E.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=E.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(E),E.languages.c=E.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),E.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),E.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},E.languages.c.string],char:E.languages.c.char,comment:E.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:E.languages.c}}}}),E.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete E.languages.c.boolean,E.languages.objectivec=E.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete E.languages.objectivec["class-name"],E.languages.objc=E.languages.objectivec,E.languages.reason=E.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),E.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete E.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,(function(){return t}));t=t.replace(/<self>/g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(E),E.languages.go=E.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),E.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete E.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(E);((e,t)=>{for(var n in t)f(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>T,duotoneDark:()=>j,duotoneLight:()=>L,github:()=>A,jettwaveDark:()=>q,jettwaveLight:()=>H,nightOwl:()=>N,nightOwlLight:()=>R,oceanicNext:()=>I,okaidia:()=>D,oneDark:()=>Z,oneLight:()=>G,palenight:()=>M,shadesOfPurple:()=>F,synthwave84:()=>z,ultramin:()=>B,vsDark:()=>U,vsLight:()=>$});var T={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},j={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},L={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},A={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},N={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},R={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},O="#c5a5c5",P="#8dc891",I={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:O}},{types:["attr-value"],style:{color:P}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:P}},{types:["punctuation"],style:{color:P}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:O}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},D={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},M={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},F={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},z={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},B={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},U={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},$={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},q={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},H={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},Z={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},G={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},V=(e,t)=>{const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=x(x({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=S(x({},n),{backgroundColor:void 0}),r},W=/\r\n|\r|\n/,K=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},Q=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},Y=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,s=[];const l=[s];for(;i>-1;){for(;(a=r[i]++)<o[i];){let e,c=t[i];const u=n[i][a];if("string"==typeof u?(c=i>0?c:["plain"],e=u):(c=Q(c,u.type),u.alias&&(c=Q(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(W),f=d.length;s.push({types:c,content:d[0]});for(let t=1;t<f;t++)K(s),l.push(s=[]),s.push({types:c,content:d[t]})}i--,t.pop(),n.pop(),r.pop(),o.pop()}return K(s),l},X=({children:e,language:t,code:n,theme:o,prism:i})=>{const s=t.toLowerCase(),l=((e,t)=>{const[n,o]=(0,r.useState)(V(t,e)),a=(0,r.useRef)(),i=(0,r.useRef)();return(0,r.useEffect)((()=>{t===a.current&&e===i.current||(a.current=t,i.current=e,o(V(t,e)))}),[e,t]),n})(s,o),c=(e=>(0,r.useCallback)((t=>{var n=t,{className:r,style:o,line:i}=n,s=_(n,["className","style","line"]);const l=S(x({},s),{className:a("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=x(x({},l.style||{}),o)),l}),[e]))(l),u=(e=>{const t=(0,r.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,r.useCallback)((e=>{var n=e,{token:r,className:o,style:i}=n,s=_(n,["token","className","style"]);const l=S(x({},s),{className:a("token",...r.types,o),children:r.content,style:t(r)});return null!=i&&(l.style=x(x({},l.style||{}),i)),l}),[t])})(l),d=(({prism:e,code:t,grammar:n,language:o})=>{const a=(0,r.useRef)(e);return(0,r.useMemo)((()=>{if(null==n)return Y([t]);const e={code:t,grammar:n,language:o,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),Y(e.tokens)}),[t,n,o])})({prism:i,language:s,code:n,grammar:i.languages[s]});return e({tokens:d,className:`prism-code language-${s}`,style:null!=l?l.root:{},getLineProps:c,getTokenProps:u})},J=e=>(0,r.createElement)(X,S(x({},e),{prism:e.prism||E,theme:e.theme||U,code:e.code,language:e.language}))},8776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},7529:e=>{"use strict";e.exports={}},6887:e=>{"use strict";e.exports=JSON.parse('{"/blog/-951":{"__comp":"a6aa9e1f","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"metadata":"b2b675dd"},"/blog/archive/-d54":{"__comp":"9e4087bc","__context":{"plugin":"e10957d6"},"archive":"b2f554cd"},"/blog/bloom-and-cuckoo-filters-for-cache-summarization/-5a5":{"__comp":"ccc49370","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","content":"6be32138"},"/blog/tags/-f8d":{"__comp":"01a85c17","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","tags":"a7023ddc"},"/blog/tags/blog/-dc0":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"631037e5","listMetadata":"3f3a03c1"},"/blog/tags/content-routing/-f84":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"5ef0bdde","listMetadata":"da8f35c6"},"/blog/tags/engineering/-6c6":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"4035650f","listMetadata":"6cbb3cde"},"/blog/tags/fleek-network/-490":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"da002ab0","listMetadata":"cc9d5bf1"},"/search/-2a3":{"__comp":"1a4e3797","__context":{"plugin":"4061bfd3"}},"/docs/-605":{"__comp":"5e95c892","__context":{"plugin":"2218035b"}},"/docs/-7aa":{"__comp":"a7bd4aaa","version":"935f2afb"},"/docs/tags/-71d":{"__comp":"3720c009","tags":"55960ee5"},"/docs/tags/about/-4e0":{"__comp":"df203c0f","tag":"45c86e35"},"/docs/tags/algorithms/-23a":{"__comp":"df203c0f","tag":"143de299"},"/docs/tags/architecture/-64c":{"__comp":"df203c0f","tag":"f6807fb4"},"/docs/tags/awards/-7ea":{"__comp":"df203c0f","tag":"a50e2e4f"},"/docs/tags/build/-0e4":{"__comp":"df203c0f","tag":"39e94577"},"/docs/tags/cdn/-3d4":{"__comp":"df203c0f","tag":"b03a0ac1"},"/docs/tags/cli/-cb7":{"__comp":"df203c0f","tag":"54436d06"},"/docs/tags/client/-7ed":{"__comp":"df203c0f","tag":"8cf21e85"},"/docs/tags/code-of-conduct/-b7d":{"__comp":"df203c0f","tag":"d464210a"},"/docs/tags/codebase/-629":{"__comp":"df203c0f","tag":"a13e0645"},"/docs/tags/command-line-interface/-b12":{"__comp":"df203c0f","tag":"f893ec16"},"/docs/tags/compile/-3d0":{"__comp":"df203c0f","tag":"153c226b"},"/docs/tags/configuration/-d0c":{"__comp":"df203c0f","tag":"ce321ae3"},"/docs/tags/consensus/-5e9":{"__comp":"df203c0f","tag":"4247aede"},"/docs/tags/contribute/-a58":{"__comp":"df203c0f","tag":"35a7e2bf"},"/docs/tags/control/-8ba":{"__comp":"df203c0f","tag":"a771de40"},"/docs/tags/decentralization/-516":{"__comp":"df203c0f","tag":"39574d2e"},"/docs/tags/develop/-010":{"__comp":"df203c0f","tag":"82893666"},"/docs/tags/diagnostic/-9cb":{"__comp":"df203c0f","tag":"75d8af72"},"/docs/tags/diagnostics/-6bf":{"__comp":"df203c0f","tag":"bd59af11"},"/docs/tags/economics/-6af":{"__comp":"df203c0f","tag":"53ca291c"},"/docs/tags/edge-network/-d3f":{"__comp":"df203c0f","tag":"187c6361"},"/docs/tags/edge-platform/-1fd":{"__comp":"df203c0f","tag":"aa81941d"},"/docs/tags/fleek-network/-0e0":{"__comp":"df203c0f","tag":"00309d1b"},"/docs/tags/getting-started/-bc6":{"__comp":"df203c0f","tag":"933a69d3"},"/docs/tags/git/-810":{"__comp":"df203c0f","tag":"7b667a7f"},"/docs/tags/guide/-dbf":{"__comp":"df203c0f","tag":"b8c37621"},"/docs/tags/healthcheck/-008":{"__comp":"df203c0f","tag":"7b9de75f"},"/docs/tags/incentives/-c6d":{"__comp":"df203c0f","tag":"48e81e49"},"/docs/tags/learn/-73a":{"__comp":"df203c0f","tag":"ffc337e7"},"/docs/tags/lgtn/-6a9":{"__comp":"df203c0f","tag":"de225737"},"/docs/tags/lightning/-dd1":{"__comp":"df203c0f","tag":"a626c4f3"},"/docs/tags/logs/-d51":{"__comp":"df203c0f","tag":"79055aff"},"/docs/tags/manage/-8ec":{"__comp":"df203c0f","tag":"180ee354"},"/docs/tags/manual/-c7d":{"__comp":"df203c0f","tag":"49b5e83d"},"/docs/tags/node-status/-c59":{"__comp":"df203c0f","tag":"9bd69ffc"},"/docs/tags/onboarding/-bfa":{"__comp":"df203c0f","tag":"a9a76bf7"},"/docs/tags/open-source/-bbc":{"__comp":"df203c0f","tag":"48857ff6"},"/docs/tags/permissionless/-42c":{"__comp":"df203c0f","tag":"e331fbd7"},"/docs/tags/phases/-643":{"__comp":"df203c0f","tag":"f4fd4511"},"/docs/tags/pledge/-b60":{"__comp":"df203c0f","tag":"cc8e0b88"},"/docs/tags/ports/-f53":{"__comp":"df203c0f","tag":"7aba1839"},"/docs/tags/protocol/-dfe":{"__comp":"df203c0f","tag":"179183ba"},"/docs/tags/repository/-425":{"__comp":"df203c0f","tag":"9cc140f3"},"/docs/tags/reputation/-32e":{"__comp":"df203c0f","tag":"4beaa780"},"/docs/tags/requirements/-64a":{"__comp":"df203c0f","tag":"64d03520"},"/docs/tags/rewards/-a8a":{"__comp":"df203c0f","tag":"433ff3d6"},"/docs/tags/roadmap/-af1":{"__comp":"df203c0f","tag":"469c924f"},"/docs/tags/rpc/-4b6":{"__comp":"df203c0f","tag":"399f21a8"},"/docs/tags/rust-dependencies/-260":{"__comp":"df203c0f","tag":"5d38c936"},"/docs/tags/sdk/-e09":{"__comp":"df203c0f","tag":"3a6297ac"},"/docs/tags/server/-6ce":{"__comp":"df203c0f","tag":"51f2bfad"},"/docs/tags/services/-d7f":{"__comp":"df203c0f","tag":"fcc63351"},"/docs/tags/snarks/-dad":{"__comp":"df203c0f","tag":"08dd5264"},"/docs/tags/standards/-83e":{"__comp":"df203c0f","tag":"68b99ecd"},"/docs/tags/systemctl/-6a1":{"__comp":"df203c0f","tag":"45ac3af8"},"/docs/tags/systemd/-6d2":{"__comp":"df203c0f","tag":"5559e604"},"/docs/tags/testnet/-f95":{"__comp":"df203c0f","tag":"ec98ad91"},"/docs/tags/token/-e53":{"__comp":"df203c0f","tag":"2adfdcac"},"/docs/tags/tokenomics/-e22":{"__comp":"df203c0f","tag":"f02c0d6e"},"/docs/tags/toolkit/-7bc":{"__comp":"df203c0f","tag":"763344b9"},"/docs/tags/verification/-136":{"__comp":"df203c0f","tag":"b696d13b"},"/docs/tags/whitepaper/-949":{"__comp":"df203c0f","tag":"4a821728"},"/docs/tags/wizard/-2cb":{"__comp":"df203c0f","tag":"74ec46b4"},"/docs/-b48":{"__comp":"a94703ab"},"/docs/-e7a":{"__comp":"17896441","content":"c377a04b"},"/docs/develop/client/-720":{"__comp":"17896441","content":"3290fbc2"},"/docs/develop/json-rpc/-3b0":{"__comp":"17896441","content":"ffcb1b32"},"/docs/develop/overview/-4ab":{"__comp":"17896441","content":"95f4d37c"},"/docs/develop/service-development/-a0d":{"__comp":"17896441","content":"f3f8ecb0"},"/docs/learn/delivery-acknowledgements/-76f":{"__comp":"17896441","content":"93df2695"},"/docs/learn/developers/-a5d":{"__comp":"17896441","content":"35230925"},"/docs/learn/introduction/-0c9":{"__comp":"17896441","content":"8def2dd5"},"/docs/learn/services/-095":{"__comp":"17896441","content":"3f90f51b"},"/docs/learn/the-network/-8fa":{"__comp":"17896441","content":"7ceaa645"},"/docs/learn/token-and-economics/-ede":{"__comp":"17896441","content":"b5954e33"},"/docs/node/analyzing-logs/-98d":{"__comp":"17896441","content":"9f7d0305"},"/docs/node/configuration/-191":{"__comp":"17896441","content":"b40daf0f"},"/docs/node/diagnostics/-83b":{"__comp":"17896441","content":"8428fe34"},"/docs/node/health-check/-59e":{"__comp":"17896441","content":"581d5240"},"/docs/node/install/-0d6":{"__comp":"17896441","content":"51d5b592"},"/docs/node/lightning-cli/-88d":{"__comp":"17896441","content":"1366d7ae"},"/docs/node/overview/-603":{"__comp":"17896441","content":"9f1c3232"},"/docs/node/requirements/-8ae":{"__comp":"17896441","content":"44969bae"},"/docs/node/systemd-service/-a24":{"__comp":"17896441","content":"dd97a9bc"},"/docs/node/testnet-onboarding/-2f1":{"__comp":"17896441","content":"665f164c"},"/docs/Open-source/-81b":{"__comp":"17896441","content":"ecfddbd4"},"/docs/Open-source/code-of-conduct/-ff8":{"__comp":"17896441","content":"514cab6e"},"/docs/Open-source/contributing/-27e":{"__comp":"17896441","content":"f50a4147"},"/docs/Open-source/repositories/-93e":{"__comp":"17896441","content":"dc2776f2"},"/docs/roadmap/-532":{"__comp":"17896441","content":"0dffb83e"},"/docs/whitepaper/-d8d":{"__comp":"17896441","content":"c222de09"},"/guides/-221":{"__comp":"5e95c892","__context":{"plugin":"02f62b30"}},"/guides/-fe0":{"__comp":"a7bd4aaa","version":"fa69a7f4"},"/guides/tags/-dae":{"__comp":"3720c009","tags":"84cbd6c9"},"/guides/tags/configuration/-fea":{"__comp":"df203c0f","tag":"2baa5a9a"},"/guides/tags/container/-6ef":{"__comp":"df203c0f","tag":"ad04e600"},"/guides/tags/docker/-06e":{"__comp":"df203c0f","tag":"f41bce02"},"/guides/tags/edge-computing/-1db":{"__comp":"df203c0f","tag":"3b168dbd"},"/guides/tags/fleek-network/-f99":{"__comp":"df203c0f","tag":"6f8964f3"},"/guides/tags/getting-started/-21e":{"__comp":"df203c0f","tag":"4c027320"},"/guides/tags/guide/-218":{"__comp":"df203c0f","tag":"5d08f08d"},"/guides/tags/guides/-a6e":{"__comp":"df203c0f","tag":"b02525a9"},"/guides/tags/help/-d58":{"__comp":"df203c0f","tag":"3f0cec70"},"/guides/tags/keys/-61c":{"__comp":"df203c0f","tag":"7b788087"},"/guides/tags/keystore/-873":{"__comp":"df203c0f","tag":"5a9491fe"},"/guides/tags/logs/-9fa":{"__comp":"df203c0f","tag":"ae70e824"},"/guides/tags/ownership/-99f":{"__comp":"df203c0f","tag":"0fbdd4ac"},"/guides/tags/private-keys/-a77":{"__comp":"df203c0f","tag":"90decb6d"},"/guides/tags/public-keys/-29f":{"__comp":"df203c0f","tag":"564044f9"},"/guides/tags/rebuild/-ef7":{"__comp":"df203c0f","tag":"965d240c"},"/guides/tags/setup/-e31":{"__comp":"df203c0f","tag":"b8466c91"},"/guides/tags/transfer/-874":{"__comp":"df203c0f","tag":"5ec90731"},"/guides/tags/update/-30a":{"__comp":"df203c0f","tag":"ceabd901"},"/guides/-6c0":{"__comp":"a94703ab"},"/guides/-ef7":{"__comp":"17896441","content":"29b62a39"},"/guides/Node Operators/getting-started/-a1f":{"__comp":"17896441","content":"1c14429f"},"/guides/Node Operators/how-to-manage-log-files/-951":{"__comp":"17896441","content":"19f79f7b"},"/guides/Node Operators/managing-the-keystore/-176":{"__comp":"17896441","content":"5437f376"},"/guides/Node Operators/running-a-node-in-docker/-afa":{"__comp":"17896441","content":"4c9535f7"},"/guides/Node Operators/transfering-setup-ownership/-2d8":{"__comp":"17896441","content":"1d8a5d15"},"/guides/Node Operators/updating-lightning/-a3e":{"__comp":"17896441","content":"5bc389a1"},"/references/-d36":{"__comp":"5e95c892","__context":{"plugin":"b4f44b9b"}},"/references/-d0d":{"__comp":"a7bd4aaa","version":"f3d7f34e"},"/references/tags/-68a":{"__comp":"3720c009","tags":"f9537533"},"/references/tags/backup/-d58":{"__comp":"df203c0f","tag":"21f2cabf"},"/references/tags/build/-97c":{"__comp":"df203c0f","tag":"2ddc9f52"},"/references/tags/clean/-810":{"__comp":"df203c0f","tag":"c3f5dd14"},"/references/tags/clear/-e8b":{"__comp":"df203c0f","tag":"d16f6fc6"},"/references/tags/cli/-16b":{"__comp":"df203c0f","tag":"13986d62"},"/references/tags/commands/-637":{"__comp":"df203c0f","tag":"2a6b0b88"},"/references/tags/container/-8e1":{"__comp":"df203c0f","tag":"e6a08407"},"/references/tags/delete/-a94":{"__comp":"df203c0f","tag":"09ac38f0"},"/references/tags/docker/-042":{"__comp":"df203c0f","tag":"b9b7817e"},"/references/tags/file-permissions/-148":{"__comp":"df203c0f","tag":"84e08f43"},"/references/tags/fix/-bd5":{"__comp":"df203c0f","tag":"bea6e15b"},"/references/tags/frozen/-07d":{"__comp":"df203c0f","tag":"45e1a117"},"/references/tags/help/-74d":{"__comp":"df203c0f","tag":"af6a11bf"},"/references/tags/idle/-109":{"__comp":"df203c0f","tag":"43ee1886"},"/references/tags/image/-500":{"__comp":"df203c0f","tag":"ae013ba6"},"/references/tags/keystore/-7e3":{"__comp":"df203c0f","tag":"6ccb158e"},"/references/tags/lightning/-4db":{"__comp":"df203c0f","tag":"08ded6db"},"/references/tags/lost-keys/-dde":{"__comp":"df203c0f","tag":"ce4635d7"},"/references/tags/ownership/-b97":{"__comp":"df203c0f","tag":"749619b5"},"/references/tags/permissions/-5ee":{"__comp":"df203c0f","tag":"719c0fd7"},"/references/tags/pkill/-c53":{"__comp":"df203c0f","tag":"166b5465"},"/references/tags/process/-108":{"__comp":"df203c0f","tag":"e91f52c1"},"/references/tags/reference/-235":{"__comp":"df203c0f","tag":"155c1e74"},"/references/tags/references/-440":{"__comp":"df203c0f","tag":"6e965365"},"/references/tags/remove/-57a":{"__comp":"df203c0f","tag":"616ee580"},"/references/tags/restore/-4c9":{"__comp":"df203c0f","tag":"0ea1f268"},"/references/tags/root/-923":{"__comp":"df203c0f","tag":"07f20919"},"/references/tags/service-error/-07d":{"__comp":"df203c0f","tag":"d1d29319"},"/references/tags/shutdown/-821":{"__comp":"df203c0f","tag":"fa7546af"},"/references/tags/sudoer/-302":{"__comp":"df203c0f","tag":"0359c679"},"/references/tags/systemctl/-56f":{"__comp":"df203c0f","tag":"2e0a4d25"},"/references/tags/systemd/-298":{"__comp":"df203c0f","tag":"50f02954"},"/references/tags/uninstall/-dd6":{"__comp":"df203c0f","tag":"27528755"},"/references/tags/unit/-882":{"__comp":"df203c0f","tag":"caaedc90"},"/references/tags/update/-e1c":{"__comp":"df203c0f","tag":"779cc1e8"},"/references/tags/upgrade/-ace":{"__comp":"df203c0f","tag":"9bca08cf"},"/references/tags/user-service/-f65":{"__comp":"df203c0f","tag":"86c3bd1d"},"/references/-7ec":{"__comp":"a94703ab"},"/references/-418":{"__comp":"17896441","content":"4d7007b2"},"/references/Docker/build-and-run-in-docker/-8c9":{"__comp":"17896441","content":"d23df0ea"},"/references/Docker/frequently-used-commands-for-docker-setup/-070":{"__comp":"17896441","content":"9722e053"},"/references/Docker/uninstall-docker-setup/-ab1":{"__comp":"17896441","content":"b249ed45"},"/references/Lightning CLI/backing-up-the-keystore/-4c3":{"__comp":"17896441","content":"29b83576"},"/references/Lightning CLI/error-building-on-arm64/-cb1":{"__comp":"17896441","content":"d7d81bf6"},"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/-bb4":{"__comp":"17896441","content":"d8be0e5a"},"/references/Lightning CLI/file-permissions-and-ownership/-974":{"__comp":"17896441","content":"5b6134d1"},"/references/Lightning CLI/frequently-used-commands-for-native-setup/-a39":{"__comp":"17896441","content":"866d553a"},"/references/Lightning CLI/keys-not-found/-45f":{"__comp":"17896441","content":"fd2b74dc"},"/references/Lightning CLI/node-secret-key-does-not-exist/-c72":{"__comp":"17896441","content":"445e9e2a"},"/references/Lightning CLI/permission-denied-os-error-13/-eed":{"__comp":"17896441","content":"2730e145"},"/references/Lightning CLI/restore-the-keystore/-d91":{"__comp":"17896441","content":"26b85cb6"},"/references/Lightning CLI/uninstall-lightning-node/-a83":{"__comp":"17896441","content":"7aefc753"},"/references/Lightning CLI/update-cli-from-source-code/-6a3":{"__comp":"17896441","content":"40aeb86f"},"/references/Systemd/service-keeps-running-after-shutdown/-176":{"__comp":"17896441","content":"98f9308d"},"/references/Systemd/shutting-down-persistance/-27f":{"__comp":"17896441","content":"8a92e787"},"/references/Systemd/user-service/-9d7":{"__comp":"17896441","content":"b35f1b7f"},"/-a33":{"__comp":"1df93b7f","__context":{"plugin":"85d6e74d"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[532],(()=>{return t=7221,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.f9c5ede1.js.LICENSE.txt b/assets/js/main.63e95a14.js.LICENSE.txt similarity index 76% rename from assets/js/main.f9c5ede1.js.LICENSE.txt rename to assets/js/main.63e95a14.js.LICENSE.txt index eb75d6910..91dc89499 100644 --- a/assets/js/main.f9c5ede1.js.LICENSE.txt +++ b/assets/js/main.63e95a14.js.LICENSE.txt @@ -1,15 +1,22 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - /* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT */ +/*! Bundled license information: + +prismjs/prism.js: + (** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT <https://opensource.org/licenses/MIT> + * @author Lea Verou <https://lea.verou.me> + * @namespace + * @public + *) +*/ + /** * @license React - * use-sync-external-store-shim.production.min.js + * react-dom.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -18,16 +25,8 @@ object-assign */ /** - * Prism: Lightweight, robust, elegant syntax highlighting - * - * @license MIT <https://opensource.org/licenses/MIT> - * @author Lea Verou <https://lea.verou.me> - * @namespace - * @public - */ - -/** @license React v0.20.2 - * scheduler.production.min.js + * @license React + * react-jsx-runtime.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -35,8 +34,9 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/** @license React v16.13.1 - * react-is.production.min.js +/** + * @license React + * react.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -44,8 +44,9 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/** @license React v17.0.2 - * react-dom.production.min.js +/** + * @license React + * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * @@ -53,8 +54,8 @@ object-assign * LICENSE file in the root directory of this source tree. */ -/** @license React v17.0.2 - * react.production.min.js +/** @license React v16.13.1 + * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * diff --git a/assets/js/main.f9c5ede1.js b/assets/js/main.f9c5ede1.js deleted file mode 100644 index a74b559d5..000000000 --- a/assets/js/main.f9c5ede1.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.f9c5ede1.js.LICENSE.txt */ -(self.webpackChunkdocta=self.webpackChunkdocta||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),s=n(6887);const l={"00309d1b":[()=>n.e(9335).then(n.t.bind(n,5219,19)),"~docs/default/tag-docs-tags-fleek-network-206.json",5219],"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,4524)),"@theme/BlogTagsListPage",4524],"02f62b30":[()=>n.e(2170).then(n.t.bind(n,6037,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-docs/guides/plugin-route-context-module-100.json",6037],"0359c679":[()=>n.e(7649).then(n.t.bind(n,8511,19)),"~docs/references/tag-references-tags-sudoer-94d.json",8511],"07f20919":[()=>n.e(4327).then(n.t.bind(n,6444,19)),"~docs/references/tag-references-tags-root-1d1.json",6444],"08dd5264":[()=>n.e(9267).then(n.t.bind(n,9692,19)),"~docs/default/tag-docs-tags-snarks-8e6.json",9692],"08ded6db":[()=>n.e(7216).then(n.t.bind(n,1426,19)),"~docs/references/tag-references-tags-lightning-d47.json",1426],"09ac38f0":[()=>n.e(3343).then(n.t.bind(n,4764,19)),"~docs/references/tag-references-tags-delete-f8c.json",4764],"0dffb83e":[()=>n.e(5075).then(n.bind(n,3208)),"@site/docs/roadmap.md",3208],"0ea1f268":[()=>n.e(663).then(n.t.bind(n,454,19)),"~docs/references/tag-references-tags-restore-2d4.json",454],"0fbdd4ac":[()=>n.e(8934).then(n.t.bind(n,8944,19)),"~docs/guides/tag-guides-tags-ownership-c29.json",8944],"1366d7ae":[()=>n.e(2564).then(n.bind(n,9963)),"@site/docs/node/lightning-cli.md",9963],"13986d62":[()=>n.e(9822).then(n.t.bind(n,8973,19)),"~docs/references/tag-references-tags-cli-35e.json",8973],"143de299":[()=>n.e(8427).then(n.t.bind(n,9162,19)),"~docs/default/tag-docs-tags-algorithms-8a4.json",9162],"153c226b":[()=>n.e(7249).then(n.t.bind(n,9141,19)),"~docs/default/tag-docs-tags-compile-66b.json",9141],"155c1e74":[()=>n.e(747).then(n.t.bind(n,8095,19)),"~docs/references/tag-references-tags-reference-379.json",8095],"166b5465":[()=>n.e(1517).then(n.t.bind(n,9151,19)),"~docs/references/tag-references-tags-pkill-ae0.json",9151],17896441:[()=>Promise.all([n.e(532),n.e(8105),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"179183ba":[()=>n.e(6601).then(n.t.bind(n,655,19)),"~docs/default/tag-docs-tags-protocol-8a8.json",655],"180ee354":[()=>n.e(9316).then(n.t.bind(n,5601,19)),"~docs/default/tag-docs-tags-manage-3d5.json",5601],"187c6361":[()=>n.e(6788).then(n.t.bind(n,1461,19)),"~docs/default/tag-docs-tags-edge-network-189.json",1461],"19f79f7b":[()=>n.e(8489).then(n.bind(n,3675)),"@site/guides/Node Operators/how-to-manage-logfiles.md",3675],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,9172)),"@theme/SearchPage",9172],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,3803)),"@theme/DocPage",3803],"1c14429f":[()=>n.e(2702).then(n.bind(n,9587)),"@site/guides/Node Operators/getting-started-guide.md",9587],"1d8a5d15":[()=>n.e(9854).then(n.bind(n,469)),"@site/guides/Node Operators/transfering-setup-ownership.md",469],"1df93b7f":[()=>n.e(3237).then(n.bind(n,9754)),"@site/src/pages/index.tsx",9754],"21f2cabf":[()=>n.e(4537).then(n.t.bind(n,724,19)),"~docs/references/tag-references-tags-backup-7d5.json",724],"2218035b":[()=>n.e(4530).then(n.t.bind(n,3769,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"26b85cb6":[()=>n.e(7055).then(n.bind(n,8850)),"@site/references/Lightning CLI/restore-keystore.md",8850],"2730e145":[()=>n.e(7147).then(n.bind(n,9184)),"@site/references/Lightning CLI/permission-denied-os-error-13.md",9184],27528755:[()=>n.e(6926).then(n.t.bind(n,2578,19)),"~docs/references/tag-references-tags-uninstall-aa8.json",2578],"29b62a39":[()=>n.e(1498).then(n.bind(n,3129)),"@site/guides/index.md",3129],"29b83576":[()=>n.e(1510).then(n.bind(n,1409)),"@site/references/Lightning CLI/keystore-backup.md",1409],"2a6b0b88":[()=>n.e(6446).then(n.t.bind(n,8424,19)),"~docs/references/tag-references-tags-commands-89d.json",8424],"2adfdcac":[()=>n.e(3189).then(n.t.bind(n,4723,19)),"~docs/default/tag-docs-tags-token-d9b.json",4723],"2baa5a9a":[()=>n.e(9021).then(n.t.bind(n,8704,19)),"~docs/guides/tag-guides-tags-configuration-48b.json",8704],"2ddc9f52":[()=>n.e(7400).then(n.t.bind(n,5048,19)),"~docs/references/tag-references-tags-build-211.json",5048],"2e0a4d25":[()=>n.e(8132).then(n.t.bind(n,9073,19)),"~docs/references/tag-references-tags-systemctl-aa5.json",9073],"3290fbc2":[()=>n.e(2235).then(n.bind(n,1379)),"@site/docs/develop/client.md",1379],35230925:[()=>n.e(5602).then(n.bind(n,904)),"@site/docs/learn/developers.md",904],"35a7e2bf":[()=>n.e(4508).then(n.t.bind(n,8581,19)),"~docs/default/tag-docs-tags-contribute-7e0.json",8581],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,727)),"@theme/DocTagsListPage",727],"39574d2e":[()=>n.e(8747).then(n.t.bind(n,8270,19)),"~docs/default/tag-docs-tags-decentralization-674.json",8270],"399f21a8":[()=>n.e(2214).then(n.t.bind(n,2281,19)),"~docs/default/tag-docs-tags-rpc-9da.json",2281],"39e94577":[()=>n.e(1563).then(n.t.bind(n,3199,19)),"~docs/default/tag-docs-tags-build-2a2.json",3199],"3a6297ac":[()=>n.e(11).then(n.t.bind(n,2511,19)),"~docs/default/tag-docs-tags-sdk-70c.json",2511],"3b168dbd":[()=>n.e(469).then(n.t.bind(n,2832,19)),"~docs/guides/tag-guides-tags-edge-computing-c27.json",2832],"3f0cec70":[()=>n.e(9336).then(n.t.bind(n,4776,19)),"~docs/guides/tag-guides-tags-help-63e.json",4776],"3f3a03c1":[()=>n.e(4451).then(n.t.bind(n,1721,19)),"~blog/default/blog-tags-blog-476-list.json",1721],"3f90f51b":[()=>n.e(6669).then(n.bind(n,3726)),"@site/docs/learn/services.md",3726],"4035650f":[()=>n.e(2260).then(n.t.bind(n,9438,19)),"~blog/default/blog-tags-engineering-6ae.json",9438],"4061bfd3":[()=>n.e(3116).then(n.t.bind(n,7085,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"40aeb86f":[()=>n.e(4402).then(n.bind(n,1054)),"@site/references/Lightning CLI/update-cli-from-source-code.md",1054],"4247aede":[()=>n.e(2800).then(n.t.bind(n,4948,19)),"~docs/default/tag-docs-tags-consensus-a3b.json",4948],"433ff3d6":[()=>n.e(555).then(n.t.bind(n,2787,19)),"~docs/default/tag-docs-tags-rewards-1bb.json",2787],"43ee1886":[()=>n.e(5466).then(n.t.bind(n,653,19)),"~docs/references/tag-references-tags-idle-b08.json",653],"445e9e2a":[()=>n.e(8578).then(n.bind(n,9877)),"@site/references/Lightning CLI/node-secret-key-does-not-exist.md",9877],"44969bae":[()=>n.e(4063).then(n.bind(n,7159)),"@site/docs/node/requirements.md",7159],"45ac3af8":[()=>n.e(5204).then(n.t.bind(n,5796,19)),"~docs/default/tag-docs-tags-systemctl-2a0.json",5796],"45c86e35":[()=>n.e(9847).then(n.t.bind(n,2316,19)),"~docs/default/tag-docs-tags-about-3bc.json",2316],"45e1a117":[()=>n.e(6696).then(n.t.bind(n,5382,19)),"~docs/references/tag-references-tags-frozen-e7d.json",5382],"469c924f":[()=>n.e(2240).then(n.t.bind(n,342,19)),"~docs/default/tag-docs-tags-roadmap-bd4.json",342],"48857ff6":[()=>n.e(2908).then(n.t.bind(n,1014,19)),"~docs/default/tag-docs-tags-open-source-3c0.json",1014],"48e81e49":[()=>n.e(173).then(n.t.bind(n,5121,19)),"~docs/default/tag-docs-tags-incentives-3eb.json",5121],"49b5e83d":[()=>n.e(402).then(n.t.bind(n,3969,19)),"~docs/default/tag-docs-tags-manual-b97.json",3969],"4a821728":[()=>n.e(9513).then(n.t.bind(n,9748,19)),"~docs/default/tag-docs-tags-whitepaper-2ec.json",9748],"4beaa780":[()=>n.e(5081).then(n.t.bind(n,380,19)),"~docs/default/tag-docs-tags-reputation-c14.json",380],"4c027320":[()=>n.e(9511).then(n.t.bind(n,2564,19)),"~docs/guides/tag-guides-tags-getting-started-812.json",2564],"4c9535f7":[()=>n.e(6296).then(n.bind(n,3054)),"@site/guides/Node Operators/running-a-node-in-docker.md",3054],"4d7007b2":[()=>n.e(6272).then(n.bind(n,5926)),"@site/references/index.md",5926],"50f02954":[()=>n.e(4826).then(n.t.bind(n,3900,19)),"~docs/references/tag-references-tags-systemd-aff.json",3900],"514cab6e":[()=>n.e(6410).then(n.bind(n,3474)),"@site/docs/Open-source/code-of-conduct.md",3474],"51d5b592":[()=>n.e(1984).then(n.bind(n,7183)),"@site/docs/node/install.md",7183],"51f2bfad":[()=>n.e(71).then(n.t.bind(n,3386,19)),"~docs/default/tag-docs-tags-server-240.json",3386],"53ca291c":[()=>n.e(3863).then(n.t.bind(n,4586,19)),"~docs/default/tag-docs-tags-economics-342.json",4586],"5437f376":[()=>n.e(909).then(n.bind(n,3529)),"@site/guides/Node Operators/managing-the-keystore.md",3529],"54436d06":[()=>n.e(4872).then(n.t.bind(n,4094,19)),"~docs/default/tag-docs-tags-cli-dbf.json",4094],"5559e604":[()=>n.e(2501).then(n.t.bind(n,811,19)),"~docs/default/tag-docs-tags-systemd-9d0.json",811],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,8070,19)),"~docs/default/tags-list-current-prop-15a.json",8070],"564044f9":[()=>n.e(1771).then(n.t.bind(n,4283,19)),"~docs/guides/tag-guides-tags-public-keys-1f7.json",4283],"581d5240":[()=>n.e(5318).then(n.bind(n,3941)),"@site/docs/node/health-check.md",3941],"5a9491fe":[()=>n.e(6476).then(n.t.bind(n,5751,19)),"~docs/guides/tag-guides-tags-keystore-6f8.json",5751],"5b6134d1":[()=>n.e(9752).then(n.bind(n,5852)),"@site/references/Lightning CLI/file-permissions-and-ownership.md",5852],"5bc389a1":[()=>n.e(9829).then(n.bind(n,7962)),"@site/guides/Node Operators/updating-lightning.md",7962],"5d08f08d":[()=>n.e(659).then(n.t.bind(n,340,19)),"~docs/guides/tag-guides-tags-guide-f01.json",340],"5d38c936":[()=>n.e(9804).then(n.t.bind(n,9797,19)),"~docs/default/tag-docs-tags-rust-dependencies-0a8.json",9797],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5ec90731":[()=>n.e(8942).then(n.t.bind(n,5440,19)),"~docs/guides/tag-guides-tags-transfer-246.json",5440],"5ef0bdde":[()=>n.e(8567).then(n.t.bind(n,7778,19)),"~blog/default/blog-tags-content-routing-b90.json",7778],"616ee580":[()=>n.e(4749).then(n.t.bind(n,5736,19)),"~docs/references/tag-references-tags-remove-c35.json",5736],"631037e5":[()=>n.e(801).then(n.t.bind(n,7064,19)),"~blog/default/blog-tags-blog-476.json",7064],"64d03520":[()=>n.e(1138).then(n.t.bind(n,2217,19)),"~docs/default/tag-docs-tags-requirements-a99.json",2217],"665f164c":[()=>n.e(9320).then(n.bind(n,2760)),"@site/docs/node/testnet-onboarding.md",2760],"6875c492":[()=>Promise.all([n.e(532),n.e(8105),n.e(6048),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"68b99ecd":[()=>n.e(4556).then(n.t.bind(n,1407,19)),"~docs/default/tag-docs-tags-standards-f96.json",1407],"6be32138":[()=>n.e(3396).then(n.bind(n,8198)),"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md",8198],"6cbb3cde":[()=>n.e(5136).then(n.t.bind(n,3860,19)),"~blog/default/blog-tags-engineering-6ae-list.json",3860],"6ccb158e":[()=>n.e(3218).then(n.t.bind(n,4391,19)),"~docs/references/tag-references-tags-keystore-d50.json",4391],"6e965365":[()=>n.e(4679).then(n.t.bind(n,8472,19)),"~docs/references/tag-references-tags-references-2ec.json",8472],"6f8964f3":[()=>n.e(7536).then(n.t.bind(n,9430,19)),"~docs/guides/tag-guides-tags-fleek-network-dce.json",9430],"719c0fd7":[()=>n.e(706).then(n.t.bind(n,6419,19)),"~docs/references/tag-references-tags-permissions-2fe.json",6419],"749619b5":[()=>n.e(6362).then(n.t.bind(n,5294,19)),"~docs/references/tag-references-tags-ownership-96b.json",5294],"74ec46b4":[()=>n.e(1263).then(n.t.bind(n,1337,19)),"~docs/default/tag-docs-tags-wizard-38b.json",1337],"75d8af72":[()=>n.e(1474).then(n.t.bind(n,1187,19)),"~docs/default/tag-docs-tags-diagnostic-a48.json",1187],"763344b9":[()=>n.e(5094).then(n.t.bind(n,5772,19)),"~docs/default/tag-docs-tags-toolkit-735.json",5772],"779cc1e8":[()=>n.e(4).then(n.t.bind(n,761,19)),"~docs/references/tag-references-tags-update-c18.json",761],"79055aff":[()=>n.e(8256).then(n.t.bind(n,92,19)),"~docs/default/tag-docs-tags-logs-8e1.json",92],"7aba1839":[()=>n.e(554).then(n.t.bind(n,7177,19)),"~docs/default/tag-docs-tags-ports-99f.json",7177],"7aefc753":[()=>n.e(1251).then(n.bind(n,7707)),"@site/references/Lightning CLI/uninstall-lightning-node.md",7707],"7b667a7f":[()=>n.e(5649).then(n.t.bind(n,5274,19)),"~docs/default/tag-docs-tags-git-514.json",5274],"7b788087":[()=>n.e(9062).then(n.t.bind(n,6149,19)),"~docs/guides/tag-guides-tags-keys-31a.json",6149],"7b9de75f":[()=>n.e(6353).then(n.t.bind(n,6378,19)),"~docs/default/tag-docs-tags-healthcheck-28a.json",6378],"7ceaa645":[()=>n.e(387).then(n.bind(n,9562)),"@site/docs/learn/the-network.md",9562],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],82893666:[()=>n.e(8005).then(n.t.bind(n,2220,19)),"~docs/default/tag-docs-tags-develop-1cf.json",2220],"8428fe34":[()=>n.e(5522).then(n.bind(n,6729)),"@site/docs/node/diagnostics.md",6729],"84cbd6c9":[()=>n.e(3336).then(n.t.bind(n,4793,19)),"~docs/guides/tags-list-current-prop-15a.json",4793],"84e08f43":[()=>n.e(8059).then(n.t.bind(n,3290,19)),"~docs/references/tag-references-tags-file-permissions-d5d.json",3290],"85d6e74d":[()=>n.e(4819).then(n.t.bind(n,5745,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"866d553a":[()=>n.e(8668).then(n.bind(n,5346)),"@site/references/Lightning CLI/frequently-used-commands-for-native-setup.md",5346],"86c3bd1d":[()=>n.e(2421).then(n.t.bind(n,813,19)),"~docs/references/tag-references-tags-user-service-d6a.json",813],"8a92e787":[()=>n.e(2517).then(n.bind(n,2087)),"@site/references/Systemd/shutting-down-persistance.md",2087],"8cf21e85":[()=>n.e(6854).then(n.t.bind(n,90,19)),"~docs/default/tag-docs-tags-client-ceb.json",90],"8def2dd5":[()=>n.e(382).then(n.bind(n,8242)),"@site/docs/learn/index.md",8242],"90decb6d":[()=>n.e(9649).then(n.t.bind(n,2570,19)),"~docs/guides/tag-guides-tags-private-keys-b97.json",2570],"933a69d3":[()=>n.e(7813).then(n.t.bind(n,1853,19)),"~docs/default/tag-docs-tags-getting-started-980.json",1853],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93df2695":[()=>n.e(2386).then(n.bind(n,1569)),"@site/docs/learn/delivery-acknowledgements.md",1569],"95f4d37c":[()=>n.e(814).then(n.bind(n,9553)),"@site/docs/develop/index.md",9553],"965d240c":[()=>n.e(6577).then(n.t.bind(n,7668,19)),"~docs/guides/tag-guides-tags-rebuild-cdb.json",7668],"9722e053":[()=>n.e(1955).then(n.bind(n,3783)),"@site/references/Docker/frequently-used-commands-for-docker-setup.md",3783],"98f9308d":[()=>n.e(1025).then(n.bind(n,4976)),"@site/references/Systemd/service-keeps-running-after-shutdown.md",4976],"9bca08cf":[()=>n.e(8318).then(n.t.bind(n,7618,19)),"~docs/references/tag-references-tags-upgrade-b60.json",7618],"9bd69ffc":[()=>n.e(6699).then(n.t.bind(n,9790,19)),"~docs/default/tag-docs-tags-node-status-a43.json",9790],"9cc140f3":[()=>n.e(5049).then(n.t.bind(n,429,19)),"~docs/default/tag-docs-tags-repository-b8c.json",429],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9f1c3232":[()=>n.e(373).then(n.bind(n,3477)),"@site/docs/node/index.md",3477],"9f7d0305":[()=>n.e(4713).then(n.bind(n,4826)),"@site/docs/node/analyzing-logs.md",4826],a13e0645:[()=>n.e(7136).then(n.t.bind(n,3120,19)),"~docs/default/tag-docs-tags-codebase-878.json",3120],a50e2e4f:[()=>n.e(7796).then(n.t.bind(n,2752,19)),"~docs/default/tag-docs-tags-awards-c13.json",2752],a626c4f3:[()=>n.e(581).then(n.t.bind(n,4218,19)),"~docs/default/tag-docs-tags-lightning-f7e.json",4218],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(8105),n.e(6048),n.e(3089)]).then(n.bind(n,3402)),"@theme/BlogListPage",3402],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a771de40:[()=>n.e(6074).then(n.t.bind(n,8606,19)),"~docs/default/tag-docs-tags-control-341.json",8606],a9a76bf7:[()=>n.e(4356).then(n.t.bind(n,8826,19)),"~docs/default/tag-docs-tags-onboarding-2eb.json",8826],aa81941d:[()=>n.e(3012).then(n.t.bind(n,5689,19)),"~docs/default/tag-docs-tags-edge-platform-754.json",5689],ad04e600:[()=>n.e(5844).then(n.t.bind(n,3998,19)),"~docs/guides/tag-guides-tags-container-e63.json",3998],ae013ba6:[()=>n.e(9981).then(n.t.bind(n,2879,19)),"~docs/references/tag-references-tags-image-9d7.json",2879],ae70e824:[()=>n.e(1433).then(n.t.bind(n,360,19)),"~docs/guides/tag-guides-tags-logs-5d1.json",360],af6a11bf:[()=>n.e(3503).then(n.t.bind(n,5296,19)),"~docs/references/tag-references-tags-help-9a8.json",5296],b02525a9:[()=>n.e(6980).then(n.t.bind(n,3993,19)),"~docs/guides/tag-guides-tags-guides-141.json",3993],b03a0ac1:[()=>n.e(4785).then(n.t.bind(n,2312,19)),"~docs/default/tag-docs-tags-cdn-fa9.json",2312],b249ed45:[()=>n.e(5767).then(n.bind(n,6655)),"@site/references/Docker/uninstall-docker-setup.md",6655],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b35f1b7f:[()=>n.e(7706).then(n.bind(n,5733)),"@site/references/Systemd/user-service.md",5733],b40daf0f:[()=>n.e(2126).then(n.bind(n,6332)),"@site/docs/node/configuration.md",6332],b4f44b9b:[()=>n.e(551).then(n.t.bind(n,2960,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-docs/references/plugin-route-context-module-100.json",2960],b5954e33:[()=>n.e(2114).then(n.bind(n,4692)),"@site/docs/learn/token-and-economics.md",4692],b696d13b:[()=>n.e(327).then(n.t.bind(n,5212,19)),"~docs/default/tag-docs-tags-verification-caa.json",5212],b8466c91:[()=>n.e(4939).then(n.t.bind(n,942,19)),"~docs/guides/tag-guides-tags-setup-8ad.json",942],b8c37621:[()=>n.e(920).then(n.t.bind(n,3908,19)),"~docs/default/tag-docs-tags-guide-a32.json",3908],b9b7817e:[()=>n.e(1476).then(n.t.bind(n,7913,19)),"~docs/references/tag-references-tags-docker-edf.json",7913],bd59af11:[()=>n.e(9188).then(n.t.bind(n,7522,19)),"~docs/default/tag-docs-tags-diagnostics-265.json",7522],bea6e15b:[()=>n.e(8754).then(n.t.bind(n,815,19)),"~docs/references/tag-references-tags-fix-c13.json",815],c222de09:[()=>n.e(7563).then(n.bind(n,5534)),"@site/docs/whitepaper.md",5534],c377a04b:[()=>n.e(6971).then(n.bind(n,6453)),"@site/docs/index.md",6453],c3f5dd14:[()=>n.e(1345).then(n.t.bind(n,9826,19)),"~docs/references/tag-references-tags-clean-55b.json",9826],caaedc90:[()=>n.e(572).then(n.t.bind(n,8988,19)),"~docs/references/tag-references-tags-unit-0cd.json",8988],cc8e0b88:[()=>n.e(6310).then(n.t.bind(n,2560,19)),"~docs/default/tag-docs-tags-pledge-e5c.json",2560],cc9d5bf1:[()=>n.e(3236).then(n.t.bind(n,300,19)),"~blog/default/blog-tags-fleek-network-995-list.json",300],ccc49370:[()=>Promise.all([n.e(532),n.e(8105),n.e(6048),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],ce321ae3:[()=>n.e(1837).then(n.t.bind(n,2141,19)),"~docs/default/tag-docs-tags-configuration-143.json",2141],ce4635d7:[()=>n.e(9395).then(n.t.bind(n,6062,19)),"~docs/references/tag-references-tags-lost-keys-940.json",6062],ceabd901:[()=>n.e(1354).then(n.t.bind(n,5e3,19)),"~docs/guides/tag-guides-tags-update-e5f.json",5e3],d16f6fc6:[()=>n.e(5530).then(n.t.bind(n,8316,19)),"~docs/references/tag-references-tags-clear-34f.json",8316],d1b78a4d:[()=>n.e(3023).then(n.bind(n,1850)),"@site/blog/bloom-and-cuckoo-filters-for-cache-summarization.md?truncated=true",1850],d1d29319:[()=>n.e(2027).then(n.t.bind(n,9887,19)),"~docs/references/tag-references-tags-service-error-f6a.json",9887],d23df0ea:[()=>n.e(5548).then(n.bind(n,2321)),"@site/references/Docker/build-and-run-in-docker.md",2321],d464210a:[()=>n.e(2023).then(n.t.bind(n,4075,19)),"~docs/default/tag-docs-tags-code-of-conduct-379.json",4075],d7d81bf6:[()=>n.e(2918).then(n.bind(n,9760)),"@site/references/Lightning CLI/error-building-on-arm64.md",9760],d8be0e5a:[()=>n.e(1706).then(n.bind(n,4458)),"@site/references/Lightning CLI/error-linking-with-cc-failed.md",4458],da002ab0:[()=>n.e(5888).then(n.t.bind(n,831,19)),"~blog/default/blog-tags-fleek-network-995.json",831],da8f35c6:[()=>n.e(4541).then(n.t.bind(n,4257,19)),"~blog/default/blog-tags-content-routing-b90-list.json",4257],dc2776f2:[()=>n.e(8644).then(n.bind(n,93)),"@site/docs/Open-source/repositories.md",93],dd97a9bc:[()=>n.e(9707).then(n.bind(n,3634)),"@site/docs/node/systemd-service.md",3634],de225737:[()=>n.e(6726).then(n.t.bind(n,4536,19)),"~docs/default/tag-docs-tags-lgtn-e06.json",4536],df203c0f:[()=>n.e(9924).then(n.bind(n,491)),"@theme/DocTagDocListPage",491],e10957d6:[()=>n.e(4708).then(n.t.bind(n,4469,19)),"/home/runner/work/fleek-network-docs/fleek-network-docs/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],e331fbd7:[()=>n.e(9995).then(n.t.bind(n,7568,19)),"~docs/default/tag-docs-tags-permissionless-576.json",7568],e6a08407:[()=>n.e(2450).then(n.t.bind(n,607,19)),"~docs/references/tag-references-tags-container-a9e.json",607],e91f52c1:[()=>n.e(7091).then(n.t.bind(n,5393,19)),"~docs/references/tag-references-tags-process-5fa.json",5393],ec98ad91:[()=>n.e(4034).then(n.t.bind(n,1323,19)),"~docs/default/tag-docs-tags-testnet-9cf.json",1323],ecfddbd4:[()=>n.e(7804).then(n.bind(n,3317)),"@site/docs/Open-source.md",3317],f02c0d6e:[()=>n.e(3707).then(n.t.bind(n,3422,19)),"~docs/default/tag-docs-tags-tokenomics-43c.json",3422],f3d7f34e:[()=>n.e(982).then(n.t.bind(n,9299,19)),"~docs/references/version-current-metadata-prop-751.json",9299],f3f8ecb0:[()=>n.e(6939).then(n.bind(n,2854)),"@site/docs/develop/service-development.md",2854],f41bce02:[()=>n.e(3719).then(n.t.bind(n,4729,19)),"~docs/guides/tag-guides-tags-docker-ee0.json",4729],f4fd4511:[()=>n.e(6461).then(n.t.bind(n,6514,19)),"~docs/default/tag-docs-tags-phases-f9f.json",6514],f50a4147:[()=>n.e(4888).then(n.bind(n,260)),"@site/docs/Open-source/contributing.md",260],f6807fb4:[()=>n.e(4788).then(n.t.bind(n,9836,19)),"~docs/default/tag-docs-tags-architecture-68d.json",9836],f893ec16:[()=>n.e(3131).then(n.t.bind(n,2661,19)),"~docs/default/tag-docs-tags-command-line-interface-bff.json",2661],f9537533:[()=>n.e(5347).then(n.t.bind(n,881,19)),"~docs/references/tags-list-current-prop-15a.json",881],fa69a7f4:[()=>n.e(6798).then(n.t.bind(n,2469,19)),"~docs/guides/version-current-metadata-prop-751.json",2469],fa7546af:[()=>n.e(1611).then(n.t.bind(n,7327,19)),"~docs/references/tag-references-tags-shutdown-0e6.json",7327],fcc63351:[()=>n.e(9743).then(n.t.bind(n,7495,19)),"~docs/default/tag-docs-tags-services-754.json",7495],fd2b74dc:[()=>n.e(4846).then(n.bind(n,6578)),"@site/references/Lightning CLI/keys-not-found.md",6578],ffc337e7:[()=>n.e(7310).then(n.t.bind(n,2110,19)),"~docs/default/tag-docs-tags-learn-579.json",2110],ffcb1b32:[()=>n.e(5120).then(n.bind(n,8730)),"@site/docs/develop/json-rpc.md",8730]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=s[`${e}-${t}`],f={},p=[],g=[],m=(0,u.Z)(o);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=l[n];r&&(f[t]=r[0],p.push(r[1]),g.push(r[2]))})),i().Map({loading:c,loader:f,modules:p,webpack:()=>g,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const s=n.split(".");s.slice(0,-1).forEach((e=>{o=o[e]})),o[s[s.length-1]]=a}));const s=i.__comp;delete i.__comp;const l=i.__context;return delete i.__context,r.createElement(d.z,{value:l},r.createElement(s,(0,a.Z)({},i,n)))}})}const p=[{path:"/blog/",component:f("/blog/","951"),exact:!0},{path:"/blog/archive/",component:f("/blog/archive/","d54"),exact:!0},{path:"/blog/bloom-and-cuckoo-filters-for-cache-summarization/",component:f("/blog/bloom-and-cuckoo-filters-for-cache-summarization/","5a5"),exact:!0},{path:"/blog/tags/",component:f("/blog/tags/","f8d"),exact:!0},{path:"/blog/tags/blog/",component:f("/blog/tags/blog/","dc0"),exact:!0},{path:"/blog/tags/content-routing/",component:f("/blog/tags/content-routing/","f84"),exact:!0},{path:"/blog/tags/engineering/",component:f("/blog/tags/engineering/","6c6"),exact:!0},{path:"/blog/tags/fleek-network/",component:f("/blog/tags/fleek-network/","490"),exact:!0},{path:"/docs/tags/",component:f("/docs/tags/","070"),exact:!0},{path:"/docs/tags/about/",component:f("/docs/tags/about/","dcd"),exact:!0},{path:"/docs/tags/algorithms/",component:f("/docs/tags/algorithms/","cf8"),exact:!0},{path:"/docs/tags/architecture/",component:f("/docs/tags/architecture/","4de"),exact:!0},{path:"/docs/tags/awards/",component:f("/docs/tags/awards/","ef9"),exact:!0},{path:"/docs/tags/build/",component:f("/docs/tags/build/","cb8"),exact:!0},{path:"/docs/tags/cdn/",component:f("/docs/tags/cdn/","f22"),exact:!0},{path:"/docs/tags/cli/",component:f("/docs/tags/cli/","ce9"),exact:!0},{path:"/docs/tags/client/",component:f("/docs/tags/client/","e82"),exact:!0},{path:"/docs/tags/code-of-conduct/",component:f("/docs/tags/code-of-conduct/","574"),exact:!0},{path:"/docs/tags/codebase/",component:f("/docs/tags/codebase/","73d"),exact:!0},{path:"/docs/tags/command-line-interface/",component:f("/docs/tags/command-line-interface/","d62"),exact:!0},{path:"/docs/tags/compile/",component:f("/docs/tags/compile/","610"),exact:!0},{path:"/docs/tags/configuration/",component:f("/docs/tags/configuration/","2ee"),exact:!0},{path:"/docs/tags/consensus/",component:f("/docs/tags/consensus/","f81"),exact:!0},{path:"/docs/tags/contribute/",component:f("/docs/tags/contribute/","daa"),exact:!0},{path:"/docs/tags/control/",component:f("/docs/tags/control/","f13"),exact:!0},{path:"/docs/tags/decentralization/",component:f("/docs/tags/decentralization/","d8a"),exact:!0},{path:"/docs/tags/develop/",component:f("/docs/tags/develop/","df2"),exact:!0},{path:"/docs/tags/diagnostic/",component:f("/docs/tags/diagnostic/","6bb"),exact:!0},{path:"/docs/tags/diagnostics/",component:f("/docs/tags/diagnostics/","354"),exact:!0},{path:"/docs/tags/economics/",component:f("/docs/tags/economics/","35c"),exact:!0},{path:"/docs/tags/edge-network/",component:f("/docs/tags/edge-network/","9a2"),exact:!0},{path:"/docs/tags/edge-platform/",component:f("/docs/tags/edge-platform/","3ff"),exact:!0},{path:"/docs/tags/fleek-network/",component:f("/docs/tags/fleek-network/","ed7"),exact:!0},{path:"/docs/tags/getting-started/",component:f("/docs/tags/getting-started/","5c5"),exact:!0},{path:"/docs/tags/git/",component:f("/docs/tags/git/","36d"),exact:!0},{path:"/docs/tags/guide/",component:f("/docs/tags/guide/","cdc"),exact:!0},{path:"/docs/tags/healthcheck/",component:f("/docs/tags/healthcheck/","b81"),exact:!0},{path:"/docs/tags/incentives/",component:f("/docs/tags/incentives/","8ff"),exact:!0},{path:"/docs/tags/learn/",component:f("/docs/tags/learn/","e71"),exact:!0},{path:"/docs/tags/lgtn/",component:f("/docs/tags/lgtn/","5d0"),exact:!0},{path:"/docs/tags/lightning/",component:f("/docs/tags/lightning/","52b"),exact:!0},{path:"/docs/tags/logs/",component:f("/docs/tags/logs/","738"),exact:!0},{path:"/docs/tags/manage/",component:f("/docs/tags/manage/","ef5"),exact:!0},{path:"/docs/tags/manual/",component:f("/docs/tags/manual/","02d"),exact:!0},{path:"/docs/tags/node-status/",component:f("/docs/tags/node-status/","5b1"),exact:!0},{path:"/docs/tags/onboarding/",component:f("/docs/tags/onboarding/","140"),exact:!0},{path:"/docs/tags/open-source/",component:f("/docs/tags/open-source/","864"),exact:!0},{path:"/docs/tags/permissionless/",component:f("/docs/tags/permissionless/","86e"),exact:!0},{path:"/docs/tags/phases/",component:f("/docs/tags/phases/","743"),exact:!0},{path:"/docs/tags/pledge/",component:f("/docs/tags/pledge/","ec7"),exact:!0},{path:"/docs/tags/ports/",component:f("/docs/tags/ports/","fad"),exact:!0},{path:"/docs/tags/protocol/",component:f("/docs/tags/protocol/","5c7"),exact:!0},{path:"/docs/tags/repository/",component:f("/docs/tags/repository/","835"),exact:!0},{path:"/docs/tags/reputation/",component:f("/docs/tags/reputation/","013"),exact:!0},{path:"/docs/tags/requirements/",component:f("/docs/tags/requirements/","7cb"),exact:!0},{path:"/docs/tags/rewards/",component:f("/docs/tags/rewards/","80e"),exact:!0},{path:"/docs/tags/roadmap/",component:f("/docs/tags/roadmap/","d25"),exact:!0},{path:"/docs/tags/rpc/",component:f("/docs/tags/rpc/","f75"),exact:!0},{path:"/docs/tags/rust-dependencies/",component:f("/docs/tags/rust-dependencies/","a0f"),exact:!0},{path:"/docs/tags/sdk/",component:f("/docs/tags/sdk/","b2b"),exact:!0},{path:"/docs/tags/server/",component:f("/docs/tags/server/","534"),exact:!0},{path:"/docs/tags/services/",component:f("/docs/tags/services/","f12"),exact:!0},{path:"/docs/tags/snarks/",component:f("/docs/tags/snarks/","933"),exact:!0},{path:"/docs/tags/standards/",component:f("/docs/tags/standards/","440"),exact:!0},{path:"/docs/tags/systemctl/",component:f("/docs/tags/systemctl/","e24"),exact:!0},{path:"/docs/tags/systemd/",component:f("/docs/tags/systemd/","57d"),exact:!0},{path:"/docs/tags/testnet/",component:f("/docs/tags/testnet/","bc6"),exact:!0},{path:"/docs/tags/token/",component:f("/docs/tags/token/","e7b"),exact:!0},{path:"/docs/tags/tokenomics/",component:f("/docs/tags/tokenomics/","2b9"),exact:!0},{path:"/docs/tags/toolkit/",component:f("/docs/tags/toolkit/","e12"),exact:!0},{path:"/docs/tags/verification/",component:f("/docs/tags/verification/","c34"),exact:!0},{path:"/docs/tags/whitepaper/",component:f("/docs/tags/whitepaper/","798"),exact:!0},{path:"/docs/tags/wizard/",component:f("/docs/tags/wizard/","2b1"),exact:!0},{path:"/guides/tags/",component:f("/guides/tags/","f51"),exact:!0},{path:"/guides/tags/configuration/",component:f("/guides/tags/configuration/","84f"),exact:!0},{path:"/guides/tags/container/",component:f("/guides/tags/container/","31e"),exact:!0},{path:"/guides/tags/docker/",component:f("/guides/tags/docker/","316"),exact:!0},{path:"/guides/tags/edge-computing/",component:f("/guides/tags/edge-computing/","cc1"),exact:!0},{path:"/guides/tags/fleek-network/",component:f("/guides/tags/fleek-network/","c44"),exact:!0},{path:"/guides/tags/getting-started/",component:f("/guides/tags/getting-started/","d87"),exact:!0},{path:"/guides/tags/guide/",component:f("/guides/tags/guide/","3ed"),exact:!0},{path:"/guides/tags/guides/",component:f("/guides/tags/guides/","597"),exact:!0},{path:"/guides/tags/help/",component:f("/guides/tags/help/","903"),exact:!0},{path:"/guides/tags/keys/",component:f("/guides/tags/keys/","035"),exact:!0},{path:"/guides/tags/keystore/",component:f("/guides/tags/keystore/","b73"),exact:!0},{path:"/guides/tags/logs/",component:f("/guides/tags/logs/","91c"),exact:!0},{path:"/guides/tags/ownership/",component:f("/guides/tags/ownership/","599"),exact:!0},{path:"/guides/tags/private-keys/",component:f("/guides/tags/private-keys/","91d"),exact:!0},{path:"/guides/tags/public-keys/",component:f("/guides/tags/public-keys/","e31"),exact:!0},{path:"/guides/tags/rebuild/",component:f("/guides/tags/rebuild/","da1"),exact:!0},{path:"/guides/tags/setup/",component:f("/guides/tags/setup/","cc1"),exact:!0},{path:"/guides/tags/transfer/",component:f("/guides/tags/transfer/","e54"),exact:!0},{path:"/guides/tags/update/",component:f("/guides/tags/update/","eb0"),exact:!0},{path:"/references/tags/",component:f("/references/tags/","bb6"),exact:!0},{path:"/references/tags/backup/",component:f("/references/tags/backup/","738"),exact:!0},{path:"/references/tags/build/",component:f("/references/tags/build/","591"),exact:!0},{path:"/references/tags/clean/",component:f("/references/tags/clean/","84f"),exact:!0},{path:"/references/tags/clear/",component:f("/references/tags/clear/","2a0"),exact:!0},{path:"/references/tags/cli/",component:f("/references/tags/cli/","59b"),exact:!0},{path:"/references/tags/commands/",component:f("/references/tags/commands/","b96"),exact:!0},{path:"/references/tags/container/",component:f("/references/tags/container/","2ea"),exact:!0},{path:"/references/tags/delete/",component:f("/references/tags/delete/","0a8"),exact:!0},{path:"/references/tags/docker/",component:f("/references/tags/docker/","21c"),exact:!0},{path:"/references/tags/file-permissions/",component:f("/references/tags/file-permissions/","f21"),exact:!0},{path:"/references/tags/fix/",component:f("/references/tags/fix/","ae4"),exact:!0},{path:"/references/tags/frozen/",component:f("/references/tags/frozen/","b33"),exact:!0},{path:"/references/tags/help/",component:f("/references/tags/help/","46c"),exact:!0},{path:"/references/tags/idle/",component:f("/references/tags/idle/","d4a"),exact:!0},{path:"/references/tags/image/",component:f("/references/tags/image/","6b8"),exact:!0},{path:"/references/tags/keystore/",component:f("/references/tags/keystore/","160"),exact:!0},{path:"/references/tags/lightning/",component:f("/references/tags/lightning/","ba1"),exact:!0},{path:"/references/tags/lost-keys/",component:f("/references/tags/lost-keys/","60c"),exact:!0},{path:"/references/tags/ownership/",component:f("/references/tags/ownership/","58e"),exact:!0},{path:"/references/tags/permissions/",component:f("/references/tags/permissions/","34d"),exact:!0},{path:"/references/tags/pkill/",component:f("/references/tags/pkill/","d9f"),exact:!0},{path:"/references/tags/process/",component:f("/references/tags/process/","5e4"),exact:!0},{path:"/references/tags/reference/",component:f("/references/tags/reference/","b27"),exact:!0},{path:"/references/tags/references/",component:f("/references/tags/references/","91e"),exact:!0},{path:"/references/tags/remove/",component:f("/references/tags/remove/","b0b"),exact:!0},{path:"/references/tags/restore/",component:f("/references/tags/restore/","80d"),exact:!0},{path:"/references/tags/root/",component:f("/references/tags/root/","9c4"),exact:!0},{path:"/references/tags/service-error/",component:f("/references/tags/service-error/","8d0"),exact:!0},{path:"/references/tags/shutdown/",component:f("/references/tags/shutdown/","193"),exact:!0},{path:"/references/tags/sudoer/",component:f("/references/tags/sudoer/","09d"),exact:!0},{path:"/references/tags/systemctl/",component:f("/references/tags/systemctl/","cdc"),exact:!0},{path:"/references/tags/systemd/",component:f("/references/tags/systemd/","0be"),exact:!0},{path:"/references/tags/uninstall/",component:f("/references/tags/uninstall/","019"),exact:!0},{path:"/references/tags/unit/",component:f("/references/tags/unit/","20e"),exact:!0},{path:"/references/tags/update/",component:f("/references/tags/update/","192"),exact:!0},{path:"/references/tags/upgrade/",component:f("/references/tags/upgrade/","ee8"),exact:!0},{path:"/references/tags/user-service/",component:f("/references/tags/user-service/","170"),exact:!0},{path:"/search/",component:f("/search/","2a3"),exact:!0},{path:"/docs/",component:f("/docs/","1de"),routes:[{path:"/docs/",component:f("/docs/","e7a"),exact:!0,sidebar:"docs"},{path:"/docs/develop/client/",component:f("/docs/develop/client/","720"),exact:!0},{path:"/docs/develop/json-rpc/",component:f("/docs/develop/json-rpc/","3b0"),exact:!0},{path:"/docs/develop/overview/",component:f("/docs/develop/overview/","4ab"),exact:!0},{path:"/docs/develop/service-development/",component:f("/docs/develop/service-development/","a0d"),exact:!0},{path:"/docs/learn/delivery-acknowledgements/",component:f("/docs/learn/delivery-acknowledgements/","76f"),exact:!0,sidebar:"docs"},{path:"/docs/learn/developers/",component:f("/docs/learn/developers/","a5d"),exact:!0,sidebar:"docs"},{path:"/docs/learn/introduction/",component:f("/docs/learn/introduction/","0c9"),exact:!0,sidebar:"docs"},{path:"/docs/learn/services/",component:f("/docs/learn/services/","095"),exact:!0,sidebar:"docs"},{path:"/docs/learn/the-network/",component:f("/docs/learn/the-network/","8fa"),exact:!0,sidebar:"docs"},{path:"/docs/learn/token-and-economics/",component:f("/docs/learn/token-and-economics/","ede"),exact:!0,sidebar:"docs"},{path:"/docs/node/analyzing-logs/",component:f("/docs/node/analyzing-logs/","98d"),exact:!0,sidebar:"docs"},{path:"/docs/node/configuration/",component:f("/docs/node/configuration/","191"),exact:!0},{path:"/docs/node/diagnostics/",component:f("/docs/node/diagnostics/","83b"),exact:!0},{path:"/docs/node/health-check/",component:f("/docs/node/health-check/","59e"),exact:!0,sidebar:"docs"},{path:"/docs/node/install/",component:f("/docs/node/install/","0d6"),exact:!0,sidebar:"docs"},{path:"/docs/node/lightning-cli/",component:f("/docs/node/lightning-cli/","88d"),exact:!0,sidebar:"docs"},{path:"/docs/node/overview/",component:f("/docs/node/overview/","603"),exact:!0,sidebar:"docs"},{path:"/docs/node/requirements/",component:f("/docs/node/requirements/","8ae"),exact:!0,sidebar:"docs"},{path:"/docs/node/systemd-service/",component:f("/docs/node/systemd-service/","a24"),exact:!0,sidebar:"docs"},{path:"/docs/node/testnet-onboarding/",component:f("/docs/node/testnet-onboarding/","2f1"),exact:!0,sidebar:"docs"},{path:"/docs/Open-source/",component:f("/docs/Open-source/","81b"),exact:!0},{path:"/docs/Open-source/code-of-conduct/",component:f("/docs/Open-source/code-of-conduct/","ff8"),exact:!0,sidebar:"docs"},{path:"/docs/Open-source/contributing/",component:f("/docs/Open-source/contributing/","27e"),exact:!0,sidebar:"docs"},{path:"/docs/Open-source/repositories/",component:f("/docs/Open-source/repositories/","93e"),exact:!0,sidebar:"docs"},{path:"/docs/roadmap/",component:f("/docs/roadmap/","532"),exact:!0,sidebar:"docs"},{path:"/docs/whitepaper/",component:f("/docs/whitepaper/","d8d"),exact:!0,sidebar:"docs"}]},{path:"/guides/",component:f("/guides/","3c1"),routes:[{path:"/guides/",component:f("/guides/","ef7"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/getting-started/",component:f("/guides/Node Operators/getting-started/","a1f"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/how-to-manage-log-files/",component:f("/guides/Node Operators/how-to-manage-log-files/","951"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/managing-the-keystore/",component:f("/guides/Node Operators/managing-the-keystore/","176"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/running-a-node-in-docker/",component:f("/guides/Node Operators/running-a-node-in-docker/","afa"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/transfering-setup-ownership/",component:f("/guides/Node Operators/transfering-setup-ownership/","2d8"),exact:!0,sidebar:"defaultSidebar"},{path:"/guides/Node Operators/updating-lightning/",component:f("/guides/Node Operators/updating-lightning/","a3e"),exact:!0,sidebar:"defaultSidebar"}]},{path:"/references/",component:f("/references/","463"),routes:[{path:"/references/",component:f("/references/","418"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Docker/build-and-run-in-docker/",component:f("/references/Docker/build-and-run-in-docker/","8c9"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Docker/frequently-used-commands-for-docker-setup/",component:f("/references/Docker/frequently-used-commands-for-docker-setup/","070"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Docker/uninstall-docker-setup/",component:f("/references/Docker/uninstall-docker-setup/","ab1"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/backing-up-the-keystore/",component:f("/references/Lightning CLI/backing-up-the-keystore/","4c3"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/error-building-on-arm64/",component:f("/references/Lightning CLI/error-building-on-arm64/","cb1"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/",component:f("/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/","bb4"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/file-permissions-and-ownership/",component:f("/references/Lightning CLI/file-permissions-and-ownership/","974"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/frequently-used-commands-for-native-setup/",component:f("/references/Lightning CLI/frequently-used-commands-for-native-setup/","a39"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/keys-not-found/",component:f("/references/Lightning CLI/keys-not-found/","45f"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/node-secret-key-does-not-exist/",component:f("/references/Lightning CLI/node-secret-key-does-not-exist/","c72"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/permission-denied-os-error-13/",component:f("/references/Lightning CLI/permission-denied-os-error-13/","eed"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/restore-the-keystore/",component:f("/references/Lightning CLI/restore-the-keystore/","d91"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/uninstall-lightning-node/",component:f("/references/Lightning CLI/uninstall-lightning-node/","a83"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Lightning CLI/update-cli-from-source-code/",component:f("/references/Lightning CLI/update-cli-from-source-code/","6a3"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Systemd/service-keeps-running-after-shutdown/",component:f("/references/Systemd/service-keeps-running-after-shutdown/","176"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Systemd/shutting-down-persistance/",component:f("/references/Systemd/shutting-down-persistance/","27f"),exact:!0,sidebar:"defaultSidebar"},{path:"/references/Systemd/user-service/",component:f("/references/Systemd/user-service/","9d7"),exact:!0,sidebar:"defaultSidebar"}]},{path:"/",component:f("/","a33"),exact:!0},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),s=n(412);const l=[n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),g=n(5742),m=n(2263),h=n(4996),b=n(6668),v=n(833),y=n(4711),w=n(9727),k=n(3320),_=n(197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,m.Z)(),n=(0,y.l)();return r.createElement(g.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function S(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.Z)(),a=function(){const{siteConfig:{url:e}}=(0,m.Z)(),{pathname:t}=(0,u.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(g.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function x(){const{i18n:{currentLocale:e}}=(0,m.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(g.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(S,null),r.createElement(E,null),r.createElement(_.Z,{tag:k.HX,locale:e}),r.createElement(g.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),A=n(8940);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const a=l.map((t=>{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),O("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class P extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const I=P,D="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",j="__docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${F}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${F}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="${M}" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${j}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n var suggestionContainer = document.getElementById('${j}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function z(){const{siteConfig:{baseUrl:e}}=(0,m.Z)();return(0,r.useLayoutEffect)((()=>{window[F]=!1}),[]),r.createElement(r.Fragment,null,!s.Z.canUseDOM&&r.createElement(g.Z,null,r.createElement("script",null,B(e))),r.createElement("div",{id:D}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,m.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(z,null):null}function $(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,m.Z)(),i=(0,h.Z)(e),{htmlLang:s,direction:l}=o[a];return r.createElement(g.Z,null,r.createElement("html",{lang:s,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var q=n(4763);function H(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(q.Z,null,r.createElement(A.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement($,null),r.createElement(x,null),r.createElement(U,null),r.createElement(I,{location:T(t)},e)))))}var G=n(6887);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var V=n(9670);const W=new Set,K=new Set,Y=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Q={prefetch(e){if(!(e=>!Y()&&!K.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,V.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!K.has(e))(e)&&(K.add(e),R(e))},X=Object.freeze(Q);if(s.Z.canUseDOM){window.docusaurus=X;const e=a.hydrate;R(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-PC422SF","id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"index","docs":[{"id":"develop/client","path":"/docs/develop/client"},{"id":"develop/index","path":"/docs/develop/overview"},{"id":"develop/json-rpc","path":"/docs/develop/json-rpc"},{"id":"develop/service-development","path":"/docs/develop/service-development"},{"id":"index","path":"/docs/","sidebar":"docs"},{"id":"learn/delivery-acknowledgements","path":"/docs/learn/delivery-acknowledgements","sidebar":"docs"},{"id":"learn/developers","path":"/docs/learn/developers","sidebar":"docs"},{"id":"learn/index","path":"/docs/learn/introduction","sidebar":"docs"},{"id":"learn/services","path":"/docs/learn/services","sidebar":"docs"},{"id":"learn/the-network","path":"/docs/learn/the-network","sidebar":"docs"},{"id":"learn/token-and-economics","path":"/docs/learn/token-and-economics","sidebar":"docs"},{"id":"node/analyzing-logs","path":"/docs/node/analyzing-logs","sidebar":"docs"},{"id":"node/configuration","path":"/docs/node/configuration"},{"id":"node/diagnostics","path":"/docs/node/diagnostics"},{"id":"node/health-check","path":"/docs/node/health-check","sidebar":"docs"},{"id":"node/index","path":"/docs/node/overview","sidebar":"docs"},{"id":"node/install","path":"/docs/node/install","sidebar":"docs"},{"id":"node/lightning-cli","path":"/docs/node/lightning-cli","sidebar":"docs"},{"id":"node/requirements","path":"/docs/node/requirements","sidebar":"docs"},{"id":"node/systemd-service","path":"/docs/node/systemd-service","sidebar":"docs"},{"id":"node/testnet-onboarding","path":"/docs/node/testnet-onboarding","sidebar":"docs"},{"id":"Open-source","path":"/docs/Open-source"},{"id":"Open-source/code-of-conduct","path":"/docs/Open-source/code-of-conduct","sidebar":"docs"},{"id":"Open-source/contributing","path":"/docs/Open-source/contributing","sidebar":"docs"},{"id":"Open-source/repositories","path":"/docs/Open-source/repositories","sidebar":"docs"},{"id":"roadmap","path":"/docs/roadmap","sidebar":"docs"},{"id":"whitepaper","path":"/docs/whitepaper","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/docs/","label":"index"}}}}],"breadcrumbs":true},"guides":{"path":"/guides","versions":[{"name":"current","label":"Next","isLast":true,"path":"/guides","mainDocId":"index","docs":[{"id":"index","path":"/guides/","sidebar":"defaultSidebar"},{"id":"Node Operators/getting-started-guide","path":"/guides/Node Operators/getting-started","sidebar":"defaultSidebar"},{"id":"Node Operators/how-to-manage-logfiles","path":"/guides/Node Operators/how-to-manage-log-files","sidebar":"defaultSidebar"},{"id":"Node Operators/managing-the-keystore","path":"/guides/Node Operators/managing-the-keystore","sidebar":"defaultSidebar"},{"id":"Node Operators/running-a-node-in-docker","path":"/guides/Node Operators/running-a-node-in-docker","sidebar":"defaultSidebar"},{"id":"Node Operators/transfering-setup-ownership","path":"/guides/Node Operators/transfering-setup-ownership","sidebar":"defaultSidebar"},{"id":"Node Operators/updating-lightning","path":"/guides/Node Operators/updating-lightning","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/guides/","label":"index"}}}}],"breadcrumbs":false},"references":{"path":"/references","versions":[{"name":"current","label":"Next","isLast":true,"path":"/references","mainDocId":"index","docs":[{"id":"Docker/build-and-run-in-docker","path":"/references/Docker/build-and-run-in-docker","sidebar":"defaultSidebar"},{"id":"Docker/frequently-used-commands-for-docker-setup","path":"/references/Docker/frequently-used-commands-for-docker-setup","sidebar":"defaultSidebar"},{"id":"Docker/uninstall-docker-setup","path":"/references/Docker/uninstall-docker-setup","sidebar":"defaultSidebar"},{"id":"index","path":"/references/","sidebar":"defaultSidebar"},{"id":"Lightning CLI/error-building-on-arm64","path":"/references/Lightning CLI/error-building-on-arm64","sidebar":"defaultSidebar"},{"id":"Lightning CLI/error-linking-with-cc-failed","path":"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1","sidebar":"defaultSidebar"},{"id":"Lightning CLI/file-permissions-and-ownership","path":"/references/Lightning CLI/file-permissions-and-ownership","sidebar":"defaultSidebar"},{"id":"Lightning CLI/frequently-used-commands-for-native-setup","path":"/references/Lightning CLI/frequently-used-commands-for-native-setup","sidebar":"defaultSidebar"},{"id":"Lightning CLI/keys-not-found","path":"/references/Lightning CLI/keys-not-found","sidebar":"defaultSidebar"},{"id":"Lightning CLI/keystore-backup","path":"/references/Lightning CLI/backing-up-the-keystore","sidebar":"defaultSidebar"},{"id":"Lightning CLI/node-secret-key-does-not-exist","path":"/references/Lightning CLI/node-secret-key-does-not-exist","sidebar":"defaultSidebar"},{"id":"Lightning CLI/permission-denied-os-error-13","path":"/references/Lightning CLI/permission-denied-os-error-13","sidebar":"defaultSidebar"},{"id":"Lightning CLI/restore-keystore","path":"/references/Lightning CLI/restore-the-keystore","sidebar":"defaultSidebar"},{"id":"Lightning CLI/uninstall-lightning-node","path":"/references/Lightning CLI/uninstall-lightning-node","sidebar":"defaultSidebar"},{"id":"Lightning CLI/update-cli-from-source-code","path":"/references/Lightning CLI/update-cli-from-source-code","sidebar":"defaultSidebar"},{"id":"Systemd/service-keeps-running-after-shutdown","path":"/references/Systemd/service-keeps-running-after-shutdown","sidebar":"defaultSidebar"},{"id":"Systemd/shutting-down-persistance","path":"/references/Systemd/shutting-down-persistance","sidebar":"defaultSidebar"},{"id":"Systemd/user-service","path":"/references/Systemd/user-service","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/references/","label":"index"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(7529);const l=JSON.parse('{"docusaurusVersion":"2.4.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.1"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"2.4.1"}}}'),c={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),s=n(8888);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(c,{error:t}))}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(s.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const d=e=>r.createElement(u,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),s=n(2263),l=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,s.Z)(),{withBaseUrl:k}=(0,d.C)(),_=(0,a.useContext)(u),E=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>E.current));const S=f||p;const x=(0,l.Z)(S),C=S?.replace("pathname://","");let T=void 0!==C?(L=C,b&&(e=>e.startsWith("/"))(L)?k(L):L):void 0;var L;T&&x&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const A=(0,a.useRef)(!1),O=n?o.OL:o.rU,N=c.Z.canUseIntersectionObserver,R=(0,a.useRef)(),P=()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)};(0,a.useEffect)((()=>(!N&&x&&null!=T&&window.docusaurus.prefetch(T),()=>{N&&R.current&&R.current.disconnect()})),[R,T,N,x]);const I=T?.startsWith("#")??!1,D=!T||!x||I;return D||h||_.collectLink(T),D?a.createElement("a",(0,r.Z)({ref:E,href:T},S&&!x&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(O,(0,r.Z)({},v,{onMouseEnter:P,onTouchStart:P,innerRef:e=>{E.current=e,N&&e&&x&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),R.current.observe(e))},to:T},n&&{isActive:m,activeClassName:g}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>s});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function l(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal <Translate> children",t),new Error("The Docusaurus <Translate> component only accept simple string values");const s=i({message:t,id:n});return r.createElement(r.Fragment,null,a(s,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>g,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>h,gB:()=>m});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function g(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function m(e){return f(e).versions}function h(e){const t=f(e);return s(t)}function b(e){const t=f(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},8888:(e,t,n)=>{"use strict";n.d(t,{Z:()=>At});var r=n(7294),a=n(6010),o=n(4763),i=n(833),s=n(7462),l=n(6550),c=n(5999),u=n(5936);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const g=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":g},r.createElement("a",(0,s.Z)({},e,{href:`#${d}`,onClick:a}),t))}var h=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(m,{className:v.skipToContent})}var w=n(6668),k=n(9689);function _(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const E={closeButton:"closeButton_CVFx"};function S(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",E.closeButton,e.className)}),r.createElement(_,{width:14,height:14,strokeWidth:3.1}))}const x={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,s.Z)({},e,{className:(0,a.Z)(x.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(S,{onClick:n,className:T.announcementBarClose}))}var A=n(3163),O=n(2466);var N=n(902),R=n(3102);const P=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,R.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(P.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(P);if(!e)throw new N.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,R.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function j(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var F=n(2949),B=n(2389);function z(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function U(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const s=(0,B.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)($.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",$.toggleButton,!s&&$.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!s,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(U,{className:(0,a.Z)($.toggleIcon,$.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,F.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var V=n(1327);function W(){return r.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,A.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(_,{color:"var(--ifm-color-emphasis-600)"}))}function Y(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(Z,{className:"margin-right--md"}),r.createElement(K,null))}var Q=n(9960),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),g=(0,X.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,J.Z)(o),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(te.Z,c&&{width:12,height:12}))};return o?r.createElement(Q.Z,(0,s.Z)({href:u?g:o},d,h)):r.createElement(Q.Z,(0,s.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},d,h))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,s.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,s.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,s.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),se=n(8596),le=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(qe,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[u,d,g]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,s.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),p()}}),c.children??c.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(qe,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ue;return r.createElement(a,n)}var pe=n(4711);function ge(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const me="iconLanguage_nlXk";function he(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var be=n(830),ve=["translations"];function ye(){return ye=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},ye.apply(this,arguments)}function we(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,a,o=[],i=!0,s=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(o.push(r.value),!t||o.length!==t);i=!0);}catch(l){s=!0,a=l}finally{try{i||null==n.return||n.return()}finally{if(s)throw a}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return ke(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ke(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ke(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _e(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Ee="Ctrl";var Se=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=_e(e,ve),i=a.buttonText,s=void 0===i?"Search":i,l=a.buttonAriaLabel,c=void 0===l?"Search":l,u=we((0,r.useState)(null),2),d=u[0],f=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Ee))}),[]),r.createElement("button",ye({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(be.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Ee?r.createElement(he,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),xe=n(5742),Ce=n(6177),Te=n(239),Le=n(3320);var Ae=n(3935);const Oe={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ne=null;function Re(e){let{hit:t,children:n}=e;return r.createElement(Q.Z,{to:t.url},n)}function Pe(e){let{state:t,onClose:n}=e;const a=(0,Ce.M)();return r.createElement(Q.Z,{to:a(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Ie(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,le.Z)(),c=(0,Te.l)(),u=function(){const{locale:e,tags:t}=(0,Le._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],f=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,p={...o.searchParameters,facetFilters:f},g=(0,l.k6)(),m=(0,r.useRef)(null),h=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Ne?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,6672)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Ne=t}))),[]),_=(0,r.useCallback)((()=>{k().then((()=>{m.current=document.createElement("div"),document.body.insertBefore(m.current,document.body.firstChild),v(!0)}))}),[k,v]),E=(0,r.useCallback)((()=>{v(!1),m.current?.remove()}),[v]),S=(0,r.useCallback)((e=>{k().then((()=>{v(!0),w(e.key)}))}),[k,v,w]),x=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(a,t)?window.location.href=t:g.push(t)}}).current,C=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:c(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>r.createElement(Pe,(0,s.Z)({},e,{onClose:E}))),[E]),L=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:b,onOpen:_,onClose:E,onInput:S,searchButtonRef:h}),r.createElement(r.Fragment,null,r.createElement(xe.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(Se,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:_,ref:h,translations:Oe.button}),b&&Ne&&m.current&&(0,Ae.createPortal)(r.createElement(Ne,(0,s.Z)({onClose:E,initialScrollY:window.scrollY,initialQuery:y,navigator:x,transformItems:C,hitComponent:Re,transformSearchClient:L},o.searchPagePath&&{resultsFooterComponent:T},o,{searchParameters:p,placeholder:Oe.placeholder,translations:Oe.modal})),m.current))}function De(){const{siteConfig:e}=(0,le.Z)();return r.createElement(Ie,e.themeConfig.algolia)}const Me={searchBox:"searchBox_ZlJk"};function je(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Me.searchBox)},t)}var Fe=n(143),Be=n(2802);var ze=n(373);const Ue=e=>e.docs.find((t=>t.id===e.mainDocId));const $e={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,le.Z)(),f=(0,pe.l)(),{search:p,hash:g}=(0,l.TH)(),m=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${g}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],h=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,s.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(ge,{className:me}),h),items:m}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(je,{className:n},r.createElement(De,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return r.createElement(s,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Fe.Iw)(a),l=(0,Be.vY)(t,a);return null===l?null:r.createElement(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.path===l.path||!!i?.sidebar&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Fe.Iw)(a),l=(0,Be.oz)(t,a).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Be.lO)(a)[0],l=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,s.Z)({},o,{label:l,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:f}=(0,l.TH)(),p=(0,Fe.Iw)(n),g=(0,Fe.gB)(n),{savePreferredVersionName:m}=(0,ze.J)(n),h=[...o,...g.map((e=>{const t=p.alternateDocVersions[e.name]??Ue(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...i],b=(0,Be.lO)(n)[0],v=t&&h.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:Ue(b).path;return h.length<=1?r.createElement(oe,(0,s.Z)({},u,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,s.Z)({},u,{mobile:t,label:v,to:y,items:h,isActive:a?()=>!1:void 0}))}};function qe(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=$e[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function He(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(qe,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ge(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ze(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Ge,{onClick:()=>t.hide()}),t.content)}function Ve(){const e=(0,A.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(j,{header:r.createElement(Y,null),primaryMenu:r.createElement(He,null),secondaryMenu:r.createElement(Ze,null)}):null}const We={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ke(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ye(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:s,isNavbarVisible:l}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,O.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i<o.current)return void n(!0);if(a.current)return void(a.current=!1);const s=r?.scrollY,l=document.documentElement.scrollHeight-o.current,c=window.innerHeight;s&&i>=s?n(!1):i+c<l&&n(!0)})),(0,u.S)((t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:s,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[We.navbarHideable,!l&&We.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ke,{onClick:i.toggle}),r.createElement(Ve,null))}const Qe="right";function Xe(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,s.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Je(){const{toggle:e,shown:t}=(0,A.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(Xe,null))}const et={colorModeToggle:"colorModeToggle_x44X"};function tt(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(qe,(0,s.Z)({},e,{key:t})))))}function nt(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function rt(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Qe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(nt,{left:r.createElement(r.Fragment,null,r.createElement("div",null,!e.disabled&&r.createElement(Je,null),r.createElement(W,null),r.createElement(tt,{items:n})),r.createElement("div",null,!o&&r.createElement(je,null,r.createElement(De,null)))),right:r.createElement(r.Fragment,null,r.createElement(tt,{items:a}),r.createElement(Z,{className:et.colorModeToggle}))})}function at(){return r.createElement(Ye,null,r.createElement(rt,null))}function ot(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,c=(0,X.Z)(n),u=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Q.Z,(0,s.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:c},l),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function it(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(ot,{item:t}))}function st(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(it,{key:t,item:e})))))}function lt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(st,{key:t,column:e}))))}function ct(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function ut(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(ot,{item:t})}function dt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(ut,{item:e}),t.length!==n+1&&r.createElement(ct,null))))))}function ft(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(lt,{columns:t}):r.createElement(dt,{links:t})}var pt=n(941);const gt={footerLogoLink:"footerLogoLink_BH7S"};function mt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(pt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function ht(e){let{logo:t}=e;return t.href?r.createElement(Q.Z,{href:t.href,className:gt.footerLogoLink,target:t.target},r.createElement(mt,{logo:t})):r.createElement(mt,{logo:t})}function bt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function vt(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--left"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function yt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(vt,{style:o,links:n&&n.length>0&&r.createElement(ft,{links:n}),logo:a&&r.createElement(ht,{logo:a}),copyright:t&&r.createElement(bt,{copyright:t})})}const wt=r.memo(yt),kt=(0,N.Qc)([F.S,k.pl,O.OC,ze.L5,i.VC,function(e){let{children:t}=e;return r.createElement(R.n2,null,r.createElement(A.M,null,r.createElement(I,null,t)))}]);function _t(e){let{children:t}=e;return r.createElement(kt,null,t)}var Et=n(8780);const St={errorBoundaryError:"errorBoundaryError_a6uf"};function xt(e){return r.createElement("button",(0,s.Z)({type:"button"},e),r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function Ct(e){let{error:t}=e;const n=(0,Et.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:St.errorBoundaryError},n)}r.Component;function Tt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(xt,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Ct,{error:t})))))}const Lt={mainWrapper:"mainWrapper_z2l0"};function At(e){const{children:t,noFooter:n,wrapperClassName:s,title:l,description:c}=e;return(0,b.t)(),r.createElement(_t,null,r.createElement(i.d,{title:l,description:c}),r.createElement(y,null),r.createElement(L,null),r.createElement(at,null),r.createElement("div",{id:d,className:(0,a.Z)(h.k.wrapper.main,Lt.mainWrapper,s)},r.createElement(o.Z,{fallback:e=>r.createElement(Tt,e)},t)),!n&&r.createElement(wt,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),s=n(2263),l=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},s=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},s):s}function d(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:c}}=(0,l.L)(),{imageClassName:d,titleClassName:f,...p}=e,g=(0,i.Z)(c?.href||"/"),m=n?"":t,h=c?.alt??m;return a.createElement(o.Z,(0,r.Z)({to:g},p,c?.target&&{target:c.target}),c&&a.createElement(u,{logo:c,alt:h,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),s=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:c,className:u,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(l.themedImage,l[`themedImage--${e}`],u)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>h});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const s="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??s}`,height:`${t}px`}}function l(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?c:u}function g(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:l}=e;const c=(0,a.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:o}),a.createElement(t,{ref:c,style:l?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,n),i?.(n))},className:s},r)}function m(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[s,l]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&l(t)}),[o,t]),o?a.createElement(g,(0,r.Z)({},n,{collapsed:s})):null}function h(e){let{lazy:t,...n}=e;const r=t?m:g;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),s=n(6668);const l=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===l.get(),d=e=>l.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>m});var r=n(7294),a=n(412),o=n(902),i=n(12),s=n(6668);const l=r.createContext(void 0),c="theme",u=(0,i.WA)(c),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),g=e=>{u.set(f(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&g(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(l.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(l);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>h,Oh:()=>y});var r=n(7294),a=n(143),o=n(9935),i=n(6668),s=n(2802),l=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function g(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return r.createElement(p.Provider,{value:n},t)}function h(e){let{children:t}=e;return s.cE?r.createElement(m,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function y(){const e=(0,a._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>s});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function s(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function l(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),s=n(6668),l=n(902);const c=r.createContext(void 0);function u(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function d(e){let{children:t}=e;const n=u();return r.createElement(c.Provider,{value:n},t)}function f(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>l,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>s,M:()=>l});var r=n(7294),a=n(2263),o=n(1980);const i="q";function s(){return(0,o.Nc)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const l=!1;function c(){const[e,t]=(0,r.useState)((()=>l?"ssr":s()));return(0,r.useEffect)((()=>{function e(){t(s())}const n=l?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>m,cE:()=>d,hI:()=>k,lO:()=>v,vY:()=>w,oz:()=>y,s1:()=>b});var r=n(7294),a=n(6550),o=n(8790),i=n(143),s=n(373),l=n(1116);function c(e){return Array.from(new Set(e))}var u=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),g=(e,t)=>e.some((e=>m(e,t)));function m(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||g(e.items,t))}function h(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function b(){const e=(0,l.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?h({sidebarItems:e.items,pathname:t}):null}function v(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>c([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=v(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function k(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,s=i.find((e=>(0,a.LX)(r.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?n.docsSidebars[l]:void 0;return{docElement:(0,o.H)(i),sidebarName:l,sidebarItems:c}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>c,Rb:()=>s});var r=n(7294),a=n(6550),o=n(1688),i=n(902);function s(e){!function(e){const t=(0,a.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,a.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=l(e)??"",n=function(){const e=(0,a.k6)();return(0,r.useCallback)(((t,n,r)=>{const a=new URLSearchParams(e.location.search);n?a.set(t,n):a.delete(t),(r?.push?e.push:e.replace)({search:a.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),c=n(2128);function u(e){let{title:t,description:n,keywords:a,image:i,children:s}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,l.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),s)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:s},r.createElement(o.Z,null,r.createElement("html",{className:s})),n)}function p(e){let{children:t}=e;const n=s(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>l,i6:()=>s,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>l,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const s=r.createContext(void 0);function l(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(s.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&a<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(a-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>l,os:()=>s});var r=n(143),a=n(2263),o=n(373);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),l=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=l[e],o=t[e].versions.find((e=>e.isLast));return s(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{WA:()=>l});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),s=o===n?e:e.replace(`/${o}/`,"/"),l=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${s}`:`${s}${e}/`}(r)}${l}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(7294),a=n(8022),o=n(4996),i=n(6278);function s(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.F)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=r(e[t]))&&(a&&(a+=" "),a+=n);else for(t in e)e[t]&&(a&&(a+=" "),a+=t);return a}n.d(t,{Z:()=>a});const a=function(){for(var e,t,n=0,a="";n<arguments.length;)(e=arguments[n++])&&(t=r(e))&&(a&&(a+=" "),a+=t);return a}},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>L,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r<a;n+=1,r+=1)e[n]=e[r];e.pop()}const i=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],i=t&&t.split("/")||[],s=e&&a(e),l=t&&a(t),c=s||l;if(e&&a(e)?i=r:r.length&&(i.pop(),i=i.concat(r)),!i.length)return"/";if(i.length){var u=i[i.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,f=i.length;f>=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach((function(e){return e.apply(void 0,n)}))}}}var m=!("undefined"==typeof window||!window.document||!window.document.createElement);function h(e,t){t(window.confirm(e))}var b="popstate",v="hashchange";function y(){try{return window.history.state||{}}catch(e){return{}}}function w(e){void 0===e&&(e={}),m||(0,s.Z)(!1);var t,n=window.history,a=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,o=!(-1===window.navigator.userAgent.indexOf("Trident")),i=e,c=i.forceRefresh,w=void 0!==c&&c,k=i.getUserConfirmation,_=void 0===k?h:k,E=i.keyLength,S=void 0===E?6:E,x=e.basename?d(l(e.basename)):"";function C(e){var t=e||{},n=t.key,r=t.state,a=window.location,o=a.pathname+a.search+a.hash;return x&&(o=u(o,x)),p(o,r,n)}function T(){return Math.random().toString(36).substr(2,S)}var L=g();function A(e){(0,r.Z)(U,e),U.length=n.length,L.notifyListeners(U.location,U.action)}function O(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||P(C(e.state))}function N(){P(C(y()))}var R=!1;function P(e){if(R)R=!1,A();else{L.confirmTransitionTo(e,"POP",_,(function(t){t?A({action:"POP",location:e}):function(e){var t=U.location,n=D.indexOf(t.key);-1===n&&(n=0);var r=D.indexOf(e.key);-1===r&&(r=0);var a=n-r;a&&(R=!0,j(a))}(e)}))}}var I=C(y()),D=[I.key];function M(e){return x+f(e)}function j(e){n.go(e)}var F=0;function B(e){1===(F+=e)&&1===e?(window.addEventListener(b,O),o&&window.addEventListener(v,N)):0===F&&(window.removeEventListener(b,O),o&&window.removeEventListener(v,N))}var z=!1;var U={length:n.length,action:"POP",location:I,createHref:M,push:function(e,t){var r="PUSH",o=p(e,t,T(),U.location);L.confirmTransitionTo(o,r,_,(function(e){if(e){var t=M(o),i=o.key,s=o.state;if(a)if(n.pushState({key:i,state:s},null,t),w)window.location.href=t;else{var l=D.indexOf(U.location.key),c=D.slice(0,l+1);c.push(o.key),D=c,A({action:r,location:o})}else window.location.href=t}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,T(),U.location);L.confirmTransitionTo(o,r,_,(function(e){if(e){var t=M(o),i=o.key,s=o.state;if(a)if(n.replaceState({key:i,state:s},null,t),w)window.location.replace(t);else{var l=D.indexOf(U.location.key);-1!==l&&(D[l]=o.key),A({action:r,location:o})}else window.location.replace(t)}}))},go:j,goBack:function(){j(-1)},goForward:function(){j(1)},block:function(e){void 0===e&&(e=!1);var t=L.setPrompt(e);return z||(B(1),z=!0),function(){return z&&(z=!1,B(-1)),t()}},listen:function(e){var t=L.appendListener(e);return B(1),function(){B(-1),t()}}};return U}var k="hashchange",_={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+c(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:c,decodePath:l},slash:{encodePath:l,decodePath:l}};function E(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function S(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function x(e){window.location.replace(E(window.location.href)+"#"+e)}function C(e){void 0===e&&(e={}),m||(0,s.Z)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),a=n.getUserConfirmation,o=void 0===a?h:a,i=n.hashType,c=void 0===i?"slash":i,b=e.basename?d(l(e.basename)):"",v=_[c],y=v.encodePath,w=v.decodePath;function C(){var e=w(S());return b&&(e=u(e,b)),p(e)}var T=g();function L(e){(0,r.Z)(z,e),z.length=t.length,T.notifyListeners(z.location,z.action)}var A=!1,O=null;function N(){var e,t,n=S(),r=y(n);if(n!==r)x(r);else{var a=C(),i=z.location;if(!A&&(t=a,(e=i).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(O===f(a))return;O=null,function(e){if(A)A=!1,L();else{var t="POP";T.confirmTransitionTo(e,t,o,(function(n){n?L({action:t,location:e}):function(e){var t=z.location,n=D.lastIndexOf(f(t));-1===n&&(n=0);var r=D.lastIndexOf(f(e));-1===r&&(r=0);var a=n-r;a&&(A=!0,M(a))}(e)}))}}(a)}}var R=S(),P=y(R);R!==P&&x(P);var I=C(),D=[f(I)];function M(e){t.go(e)}var j=0;function F(e){1===(j+=e)&&1===e?window.addEventListener(k,N):0===j&&window.removeEventListener(k,N)}var B=!1;var z={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=E(window.location.href)),n+"#"+y(b+f(e))},push:function(e,t){var n="PUSH",r=p(e,void 0,void 0,z.location);T.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(b+t);if(S()!==a){O=t,function(e){window.location.hash=e}(a);var o=D.lastIndexOf(f(z.location)),i=D.slice(0,o+1);i.push(t),D=i,L({action:n,location:r})}else L()}}))},replace:function(e,t){var n="REPLACE",r=p(e,void 0,void 0,z.location);T.confirmTransitionTo(r,n,o,(function(e){if(e){var t=f(r),a=y(b+t);S()!==a&&(O=t,x(a));var o=D.indexOf(f(z.location));-1!==o&&(D[o]=t),L({action:n,location:r})}}))},go:M,goBack:function(){M(-1)},goForward:function(){M(1)},block:function(e){void 0===e&&(e=!1);var t=T.setPrompt(e);return B||(F(1),B=!0),function(){return B&&(B=!1,F(-1)),t()}},listen:function(e){var t=T.appendListener(e);return F(1),function(){F(-1),t()}}};return z}function T(e,t,n){return Math.min(Math.max(e,t),n)}function L(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,a=t.initialEntries,o=void 0===a?["/"]:a,i=t.initialIndex,s=void 0===i?0:i,l=t.keyLength,c=void 0===l?6:l,u=g();function d(e){(0,r.Z)(w,e),w.length=w.entries.length,u.notifyListeners(w.location,w.action)}function m(){return Math.random().toString(36).substr(2,c)}var h=T(s,0,o.length-1),b=o.map((function(e){return p(e,void 0,"string"==typeof e?m():e.key||m())})),v=f;function y(e){var t=T(w.index+e,0,w.entries.length-1),r=w.entries[t];u.confirmTransitionTo(r,"POP",n,(function(e){e?d({action:"POP",location:r,index:t}):d()}))}var w={length:b.length,action:"POP",location:b[h],index:h,entries:b,createHref:v,push:function(e,t){var r="PUSH",a=p(e,t,m(),w.location);u.confirmTransitionTo(a,r,n,(function(e){if(e){var t=w.index+1,n=w.entries.slice(0);n.length>t?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,m(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t<w.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return w}},8679:(e,t,n)=>{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var a=p(n);a&&a!==g&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),h=0;h<i.length;++h){var b=i[h];if(!(o[b]||r&&r[b]||m&&m[b]||s&&s[b])){var v=f(n,b);try{c(t,b,v)}catch(y){}}}}return t}},1143:e=>{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function a(e,t,n){return e<t?t:e>n?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l<arguments.length;l++){for(var c in o=Object(arguments[l]))n.call(o,c)&&(s[c]=o[c]);if(t){i=t(o);for(var u=0;u<i.length;u++)r.call(o,i[u])&&(s[i[u]]=o[i[u]])}}return s}},7410:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var a,o;switch(n=n||{},r.util.type(t)){case"Object":if(o=r.util.objId(t),n[o])return n[o];for(var i in a={},n[o]=a,t)t.hasOwnProperty(i)&&(a[i]=e(t[i],n));return a;case"Array":return o=r.util.objId(t),n[o]?n[o]:(a=[],n[o]=a,t.forEach((function(t,r){a[r]=e(t,n)})),a);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var a=e.classList;if(a.contains(t))return!0;if(a.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(e,t,n,a){var o=(a=a||r.languages)[e],i={};for(var s in o)if(o.hasOwnProperty(s)){if(s==t)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(s)||(i[s]=o[s])}var c=a[e];return a[e]=i,r.languages.DFS(r.languages,(function(t,n){n===c&&t!=e&&(this[t]=i)})),i},DFS:function e(t,n,a,o){o=o||{};var i=r.util.objId;for(var s in t)if(t.hasOwnProperty(s)){n.call(t,s,t[s],a||s);var l=t[s],c=r.util.type(l);"Object"!==c||o[i(l)]?"Array"!==c||o[i(l)]||(o[i(l)]=!0,e(l,n,s,o)):(o[i(l)]=!0,e(l,n,null,o))}}},plugins:{},highlight:function(e,t,n){var o={code:e,grammar:t,language:n};return r.hooks.run("before-tokenize",o),o.tokens=r.tokenize(o.code,o.grammar),r.hooks.run("after-tokenize",o),a.stringify(r.util.encode(o.tokens),o.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var a=new s;return l(a,a.head,e),i(e,a,t,a.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(a)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var a,o=0;a=n[o++];)a(t)}},Token:a};function a(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function o(e,t,n,r){e.lastIndex=t;var a=e.exec(n);if(a&&r&&a[1]){var o=a[1].length;a.index+=o,a[0]=a[0].slice(o)}return a}function i(e,t,n,s,u,d){for(var f in n)if(n.hasOwnProperty(f)&&n[f]){var p=n[f];p=Array.isArray(p)?p:[p];for(var g=0;g<p.length;++g){if(d&&d.cause==f+","+g)return;var m=p[g],h=m.inside,b=!!m.lookbehind,v=!!m.greedy,y=m.alias;if(v&&!m.pattern.global){var w=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,w+"g")}for(var k=m.pattern||m,_=s.next,E=u;_!==t.tail&&!(d&&E>=d.reach);E+=_.value.length,_=_.next){var S=_.value;if(t.length>e.length)return;if(!(S instanceof a)){var x,C=1;if(v){if(!(x=o(k,E,e,b))||x.index>=e.length)break;var T=x.index,L=x.index+x[0].length,A=E;for(A+=_.value.length;T>=A;)A+=(_=_.next).value.length;if(E=A-=_.value.length,_.value instanceof a)continue;for(var O=_;O!==t.tail&&(A<L||"string"==typeof O.value);O=O.next)C++,A+=O.value.length;C--,S=e.slice(E,A),x.index-=E}else if(!(x=o(k,0,S,b)))continue;T=x.index;var N=x[0],R=S.slice(0,T),P=S.slice(T+N.length),I=E+S.length;d&&I>d.reach&&(d.reach=I);var D=_.prev;if(R&&(D=l(t,D,R),E+=R.length),c(t,D,C),_=l(t,D,new a(f,h?r.tokenize(N,h):N,y,N)),P&&l(t,_,P),C>1){var M={cause:f+","+g,reach:I};i(e,t,n,_.prev,E,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a<n&&r!==e.tail;a++)r=r.next;t.next=r,r.prev=t,e.length-=a}return a.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var a="";return t.forEach((function(t){a+=e(t,n)})),a}var o={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},i=t.alias;i&&(Array.isArray(i)?Array.prototype.push.apply(o.classes,i):o.classes.push(i)),r.hooks.run("wrap",o);var s="";for(var l in o.attributes)s+=" "+l+'="'+(o.attributes[l]||"").replace(/"/g,""")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'"'+s+">"+o.content+"</"+o.tag+">"},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var r={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i<a.length;i++)o[a[i]]=e.languages.bash[a[i]];e.languages.shell=e.languages.bash}(a),a.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<value>>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,(function(){return r})).replace(/<<key>>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var a=t[n];if("code"===a.type){var o=a.content[1],i=a.content[3];if(o&&i&&"code-language"===o.type&&"code-block"===i.type&&"string"==typeof o.content){var s=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),l="language-"+(s=(/[a-z][\w-]*/i.exec(s)||[""])[0].toLowerCase());i.alias?"string"==typeof i.alias?i.alias=[i.alias,l]:i.alias.push(l):i.alias=[l]}}else e(a.content)}}(e.tokens)})),e.hooks.add("wrap",(function(t){if("code-block"===t.type){for(var n="",r=0,a=t.classes.length;r<a;r++){var o=t.classes[r],c=/language-(.+)/.exec(o);if(c){n=c[1];break}}var u,d=e.languages[n];if(d)t.content=e.highlight((u=t.content,u.replace(i,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,(function(e,t){var n;if("#"===(t=t.toLowerCase())[0])return n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),l(n);var r=s[t];return r||e}))),d,n);else if(n&&"none"!==n&&e.plugins.autoloader){var f="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random());t.attributes.id=f,e.plugins.autoloader.loadLanguages(n,(function(){var t=document.getElementById(f);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}}));var i=RegExp(e.languages.markup.tag.pattern.source,"gi"),s={amp:"&",lt:"<",gt:">",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var a=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var o=f(/^\($/,/^\)$/);if(-1===o)continue;for(;n<o;n++){var i=u(0);"variable"===i.type&&(p(i,"variable-input"),a.push(i.content))}n=o+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,p(u(0),"property-mutation"),a.length>0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var l=n;l<s;l++){var c=t[l];"variable"===c.type&&a.indexOf(c.content)>=0&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return!1}return!0}function f(e,r){for(var a=1,o=n;o<t.length;o++){var i=t[o],s=i.content;if("punctuation"===i.type&&"string"==typeof s)if(e.test(s))a++;else if(r.test(s)&&0===--a)return o}return-1}function p(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}})),a.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,l(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=l(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(i++,r)););return u[n]=a,n})).join(""),n,r),f=Object.keys(u);return i=0,function e(t){for(var n=0;n<t.length;n++){if(i>=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,s=o.indexOf(a);if(-1!==s){++i;var l=o.substring(0,s),d=c(u[a]),p=o.substring(s+a.length),g=[];if(l&&g.push(l),g.push(d),p){var m=[p];e(m),g.push.apply(g,m)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(g)),n+=g.length-1):r.content=g}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r<a;r++){var o=n[r];if("string"!=typeof o){var i=o.content;if(Array.isArray(i))if("template-string"===o.type){var s=i[1];if(3===i.length&&"string"!=typeof s&&"embedded-code"===s.type){var l=f(s),c=s.alias,d=Array.isArray(c)?c[0]:c,p=e.languages[d];if(!p)continue;i[1]=u(l,p,d)}}else t(i);else"string"!=typeof i&&t([i])}}}(t.tokens)}))}(a),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var a=n[r],o=e.languages.javascript[a];"RegExp"===e.util.type(o)&&(o=e.languages.javascript[a]={pattern:o});var i=o.inside||{};o.inside=i,i["maybe-class-name"]=/^[A-Z][\s\S]*/}}(a),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function o(e,t){return e=e.replace(/<S>/g,(function(){return n})).replace(/<BRACES>/g,(function(){return r})).replace(/<SPREAD>/g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},s=function(t){for(var n=[],r=0;r<t.length;r++){var a=t[r],o=!1;if("string"!=typeof a&&("tag"===a.type&&a.content[0]&&"tag"===a.content[0].type?"</"===a.content[0].content[0].content?n.length>0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var l=i(a);r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(l+=i(t[r+1]),t.splice(r+1,1)),r>0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=i(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}a.content&&"string"!=typeof a.content&&s(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l<s.length&&!(a>=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),g=f.indexOf(p);if(g>-1){++a;var m=f.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(g+p.length),v=[];m&&v.push.apply(v,i([m])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to <a href="https://webplatform.github.io/docs/">WebPlatform.org documentation</a>. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (<code>.comment</code> can become <code>.namespace--comment</code>) or replace them with your defined ones (like <code>.editor__comment</code>). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the <code>highlightAll</code> and <code>highlightAllUnder</code> methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n]]=!0;return t}function r(e){var n={},r=[];function a(r,o){if(!(r in n)){o.push(r);var i=o.indexOf(r);if(i<o.length-1)throw new Error("Circular dependency: "+o.slice(i).join(" -> "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in a(t,o),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var f,p=r(l),g=u;a(g);){for(var m in f={},g){var h=l[m];t(h&&h.modify,(function(e){e in d&&(f[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in p(b))if(v in u){f[b]=!0;break}for(var y in g=f)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var f=i(u.map((function(e){var t=c(e);return delete l[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return s[e]=a}for(var u in n)c(u);var d=[];for(var f in l)d.push(s[f]);return i(d)}(p,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(i(227));var s=new Set,l={};function c(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(l[e]=t,e=0;e<t.length;e++)s.add(t[e])}var d=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p=Object.prototype.hasOwnProperty,g={},m={};function h(e,t,n,r,a,o,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var b={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){b[e]=new h(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];b[t]=new h(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){b[e]=new h(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){b[e]=new h(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){b[e]=new h(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){b[e]=new h(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){b[e]=new h(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){b[e]=new h(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){b[e]=new h(e,5,!1,e.toLowerCase(),null,!1,!1)}));var v=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function w(e,t,n,r){var a=b.hasOwnProperty(t)?b[t]:null;(null!==a?0===a.type:!r&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,a,r)&&(n=null),r||null===a?function(e){return!!p.call(m,e)||!p.call(g,e)&&(f.test(e)?m[e]=!0:(g[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):a.mustUseProperty?e[a.propertyName]=null===n?3!==a.type&&"":n:(t=a.attributeName,r=a.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(a=a.type)||4===a&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(v,y);b[t]=new h(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!1,!1)})),b.xlinkHref=new h("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){b[e]=new h(e,1,!1,e.toLowerCase(),null,!0,!0)}));var k=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,_=60103,E=60106,S=60107,x=60108,C=60114,T=60109,L=60110,A=60112,O=60113,N=60120,R=60115,P=60116,I=60121,D=60128,M=60129,j=60130,F=60131;if("function"==typeof Symbol&&Symbol.for){var B=Symbol.for;_=B("react.element"),E=B("react.portal"),S=B("react.fragment"),x=B("react.strict_mode"),C=B("react.profiler"),T=B("react.provider"),L=B("react.context"),A=B("react.forward_ref"),O=B("react.suspense"),N=B("react.suspense_list"),R=B("react.memo"),P=B("react.lazy"),I=B("react.block"),B("react.scope"),D=B("react.opaque.id"),M=B("react.debug_trace_mode"),j=B("react.offscreen"),F=B("react.legacy_hidden")}var z,U="function"==typeof Symbol&&Symbol.iterator;function $(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=U&&e[U]||e["@@iterator"])?e:null}function q(e){if(void 0===z)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);z=t&&t[1]||""}return"\n"+z+e}var H=!1;function G(e,t){if(!e||H)return"";H=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(l){var r=l}Reflect.construct(e,[],t)}else{try{t.call()}catch(l){r=l}e.call(t.prototype)}else{try{throw Error()}catch(l){r=l}e()}}catch(l){if(l&&r&&"string"==typeof l.stack){for(var a=l.stack.split("\n"),o=r.stack.split("\n"),i=a.length-1,s=o.length-1;1<=i&&0<=s&&a[i]!==o[s];)s--;for(;1<=i&&0<=s;i--,s--)if(a[i]!==o[s]){if(1!==i||1!==s)do{if(i--,0>--s||a[i]!==o[s])return"\n"+a[i].replace(" at new "," at ")}while(1<=i&&0<=s);break}}}finally{H=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?q(e):""}function Z(e){switch(e.tag){case 5:return q(e.type);case 16:return q("Lazy");case 13:return q("Suspense");case 19:return q("SuspenseList");case 0:case 2:case 15:return e=G(e.type,!1);case 11:return e=G(e.type.render,!1);case 22:return e=G(e.type._render,!1);case 1:return e=G(e.type,!0);default:return""}}function V(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case S:return"Fragment";case E:return"Portal";case C:return"Profiler";case x:return"StrictMode";case O:return"Suspense";case N:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case L:return(e.displayName||"Context")+".Consumer";case T:return(e._context.displayName||"Context")+".Provider";case A:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case R:return V(e.type);case I:return V(e._render);case P:t=e._payload,e=e._init;try{return V(e(t))}catch(n){}}return null}function W(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function K(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var t=K(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var a=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=K(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function X(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function J(e,t){var n=t.checked;return a({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function ee(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=W(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function te(e,t){null!=(t=t.checked)&&w(e,"checked",t,!1)}function ne(e,t){te(e,t);var n=W(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ae(e,t.type,n):t.hasOwnProperty("defaultValue")&&ae(e,t.type,W(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function re(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ae(e,t,n){"number"===t&&X(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function oe(e,t){return e=a({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function ie(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a<n.length;a++)t["$"+n[a]]=!0;for(n=0;n<e.length;n++)a=t.hasOwnProperty("$"+e[n].value),e[n].selected!==a&&(e[n].selected=a),a&&r&&(e[n].defaultSelected=!0)}else{for(n=""+W(n),t=null,a=0;a<e.length;a++){if(e[a].value===n)return e[a].selected=!0,void(r&&(e[a].defaultSelected=!0));null!==t||e[a].disabled||(t=e[a])}null!==t&&(t.selected=!0)}}function se(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return a({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function le(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:W(n)}}function ce(e,t){var n=W(t.value),r=W(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ue(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var de={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function fe(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function pe(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?fe(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ge,me,he=(me=function(e,t){if(e.namespaceURI!==de.svg||"innerHTML"in e)e.innerHTML=t;else{for((ge=ge||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ge.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return me(e,t)}))}:me);function be(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ve={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ye=["Webkit","ms","Moz","O"];function we(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ve.hasOwnProperty(e)&&ve[e]?(""+t).trim():t+"px"}function ke(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),a=we(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}Object.keys(ve).forEach((function(e){ye.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ve[t]=ve[e]}))}));var _e=a({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ee(e,t){if(t){if(_e[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(i(62))}}function Se(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function xe(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ce=null,Te=null,Le=null;function Ae(e){if(e=na(e)){if("function"!=typeof Ce)throw Error(i(280));var t=e.stateNode;t&&(t=aa(t),Ce(e.stateNode,e.type,t))}}function Oe(e){Te?Le?Le.push(e):Le=[e]:Te=e}function Ne(){if(Te){var e=Te,t=Le;if(Le=Te=null,Ae(e),t)for(e=0;e<t.length;e++)Ae(t[e])}}function Re(e,t){return e(t)}function Pe(e,t,n,r,a){return e(t,n,r,a)}function Ie(){}var De=Re,Me=!1,je=!1;function Fe(){null===Te&&null===Le||(Ie(),Ne())}function Be(e,t){var n=e.stateNode;if(null===n)return null;var r=aa(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(i(231,t,typeof n));return n}var ze=!1;if(d)try{var Ue={};Object.defineProperty(Ue,"passive",{get:function(){ze=!0}}),window.addEventListener("test",Ue,Ue),window.removeEventListener("test",Ue,Ue)}catch(me){ze=!1}function $e(e,t,n,r,a,o,i,s,l){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(u){this.onError(u)}}var qe=!1,He=null,Ge=!1,Ze=null,Ve={onError:function(e){qe=!0,He=e}};function We(e,t,n,r,a,o,i,s,l){qe=!1,He=null,$e.apply(Ve,arguments)}function Ke(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function Ye(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function Qe(e){if(Ke(e)!==e)throw Error(i(188))}function Xe(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ke(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var a=n.return;if(null===a)break;var o=a.alternate;if(null===o){if(null!==(r=a.return)){n=r;continue}break}if(a.child===o.child){for(o=a.child;o;){if(o===n)return Qe(a),e;if(o===r)return Qe(a),t;o=o.sibling}throw Error(i(188))}if(n.return!==r.return)n=a,r=o;else{for(var s=!1,l=a.child;l;){if(l===n){s=!0,n=a,r=o;break}if(l===r){s=!0,r=a,n=o;break}l=l.sibling}if(!s){for(l=o.child;l;){if(l===n){s=!0,n=o,r=a;break}if(l===r){s=!0,r=o,n=a;break}l=l.sibling}if(!s)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e),!e)return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function Je(e,t){for(var n=e.alternate;null!==t;){if(t===e||t===n)return!0;t=t.return}return!1}var et,tt,nt,rt,at=!1,ot=[],it=null,st=null,lt=null,ct=new Map,ut=new Map,dt=[],ft="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function pt(e,t,n,r,a){return{blockedOn:e,domEventName:t,eventSystemFlags:16|n,nativeEvent:a,targetContainers:[r]}}function gt(e,t){switch(e){case"focusin":case"focusout":it=null;break;case"dragenter":case"dragleave":st=null;break;case"mouseover":case"mouseout":lt=null;break;case"pointerover":case"pointerout":ct.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ut.delete(t.pointerId)}}function mt(e,t,n,r,a,o){return null===e||e.nativeEvent!==o?(e=pt(t,n,r,a,o),null!==t&&(null!==(t=na(t))&&tt(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==a&&-1===t.indexOf(a)&&t.push(a),e)}function ht(e){var t=ta(e.target);if(null!==t){var n=Ke(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=Ye(n)))return e.blockedOn=t,void rt(e.lanePriority,(function(){o.unstable_runWithPriority(e.priority,(function(){nt(n)}))}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function bt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=Xt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=na(n))&&tt(t),e.blockedOn=n,!1;t.shift()}return!0}function vt(e,t,n){bt(e)&&n.delete(t)}function yt(){for(at=!1;0<ot.length;){var e=ot[0];if(null!==e.blockedOn){null!==(e=na(e.blockedOn))&&et(e);break}for(var t=e.targetContainers;0<t.length;){var n=Xt(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n){e.blockedOn=n;break}t.shift()}null===e.blockedOn&&ot.shift()}null!==it&&bt(it)&&(it=null),null!==st&&bt(st)&&(st=null),null!==lt&&bt(lt)&&(lt=null),ct.forEach(vt),ut.forEach(vt)}function wt(e,t){e.blockedOn===t&&(e.blockedOn=null,at||(at=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,yt)))}function kt(e){function t(t){return wt(t,e)}if(0<ot.length){wt(ot[0],e);for(var n=1;n<ot.length;n++){var r=ot[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==it&&wt(it,e),null!==st&&wt(st,e),null!==lt&&wt(lt,e),ct.forEach(t),ut.forEach(t),n=0;n<dt.length;n++)(r=dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<dt.length&&null===(n=dt[0]).blockedOn;)ht(n),null===n.blockedOn&&dt.shift()}function _t(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Et={animationend:_t("Animation","AnimationEnd"),animationiteration:_t("Animation","AnimationIteration"),animationstart:_t("Animation","AnimationStart"),transitionend:_t("Transition","TransitionEnd")},St={},xt={};function Ct(e){if(St[e])return St[e];if(!Et[e])return e;var t,n=Et[e];for(t in n)if(n.hasOwnProperty(t)&&t in xt)return St[e]=n[t];return e}d&&(xt=document.createElement("div").style,"AnimationEvent"in window||(delete Et.animationend.animation,delete Et.animationiteration.animation,delete Et.animationstart.animation),"TransitionEvent"in window||delete Et.transitionend.transition);var Tt=Ct("animationend"),Lt=Ct("animationiteration"),At=Ct("animationstart"),Ot=Ct("transitionend"),Nt=new Map,Rt=new Map,Pt=["abort","abort",Tt,"animationEnd",Lt,"animationIteration",At,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Ot,"transitionEnd","waiting","waiting"];function It(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],a=e[n+1];a="on"+(a[0].toUpperCase()+a.slice(1)),Rt.set(r,t),Nt.set(r,a),c(a,[r])}}(0,o.unstable_now)();var Dt=8;function Mt(e){if(0!=(1&e))return Dt=15,1;if(0!=(2&e))return Dt=14,2;if(0!=(4&e))return Dt=13,4;var t=24&e;return 0!==t?(Dt=12,t):0!=(32&e)?(Dt=11,32):0!==(t=192&e)?(Dt=10,t):0!=(256&e)?(Dt=9,256):0!==(t=3584&e)?(Dt=8,t):0!=(4096&e)?(Dt=7,4096):0!==(t=4186112&e)?(Dt=6,t):0!==(t=62914560&e)?(Dt=5,t):67108864&e?(Dt=4,67108864):0!=(134217728&e)?(Dt=3,134217728):0!==(t=805306368&e)?(Dt=2,t):0!=(1073741824&e)?(Dt=1,1073741824):(Dt=8,e)}function jt(e,t){var n=e.pendingLanes;if(0===n)return Dt=0;var r=0,a=0,o=e.expiredLanes,i=e.suspendedLanes,s=e.pingedLanes;if(0!==o)r=o,a=Dt=15;else if(0!==(o=134217727&n)){var l=o&~i;0!==l?(r=Mt(l),a=Dt):0!==(s&=o)&&(r=Mt(s),a=Dt)}else 0!==(o=n&~i)?(r=Mt(o),a=Dt):0!==s&&(r=Mt(s),a=Dt);if(0===r)return 0;if(r=n&((0>(r=31-qt(r))?0:1<<r)<<1)-1,0!==t&&t!==r&&0==(t&i)){if(Mt(t),a<=Dt)return t;Dt=a}if(0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)a=1<<(n=31-qt(t)),r|=e[n],t&=~a;return r}function Ft(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function Bt(e,t){switch(e){case 15:return 1;case 14:return 2;case 12:return 0===(e=zt(24&~t))?Bt(10,t):e;case 10:return 0===(e=zt(192&~t))?Bt(8,t):e;case 8:return 0===(e=zt(3584&~t))&&(0===(e=zt(4186112&~t))&&(e=512)),e;case 2:return 0===(t=zt(805306368&~t))&&(t=268435456),t}throw Error(i(358,e))}function zt(e){return e&-e}function Ut(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $t(e,t,n){e.pendingLanes|=t;var r=t-1;e.suspendedLanes&=r,e.pingedLanes&=r,(e=e.eventTimes)[t=31-qt(t)]=n}var qt=Math.clz32?Math.clz32:function(e){return 0===e?32:31-(Ht(e)/Gt|0)|0},Ht=Math.log,Gt=Math.LN2;var Zt=o.unstable_UserBlockingPriority,Vt=o.unstable_runWithPriority,Wt=!0;function Kt(e,t,n,r){Me||Ie();var a=Qt,o=Me;Me=!0;try{Pe(a,e,t,n,r)}finally{(Me=o)||Fe()}}function Yt(e,t,n,r){Vt(Zt,Qt.bind(null,e,t,n,r))}function Qt(e,t,n,r){var a;if(Wt)if((a=0==(4&t))&&0<ot.length&&-1<ft.indexOf(e))e=pt(null,e,t,n,r),ot.push(e);else{var o=Xt(e,t,n,r);if(null===o)a&>(e,r);else{if(a){if(-1<ft.indexOf(e))return e=pt(o,e,t,n,r),void ot.push(e);if(function(e,t,n,r,a){switch(t){case"focusin":return it=mt(it,e,t,n,r,a),!0;case"dragenter":return st=mt(st,e,t,n,r,a),!0;case"mouseover":return lt=mt(lt,e,t,n,r,a),!0;case"pointerover":var o=a.pointerId;return ct.set(o,mt(ct.get(o)||null,e,t,n,r,a)),!0;case"gotpointercapture":return o=a.pointerId,ut.set(o,mt(ut.get(o)||null,e,t,n,r,a)),!0}return!1}(o,e,t,n,r))return;gt(e,r)}Ir(e,t,r,null,n)}}}function Xt(e,t,n,r){var a=xe(r);if(null!==(a=ta(a))){var o=Ke(a);if(null===o)a=null;else{var i=o.tag;if(13===i){if(null!==(a=Ye(o)))return a;a=null}else if(3===i){if(o.stateNode.hydrate)return 3===o.tag?o.stateNode.containerInfo:null;a=null}else o!==a&&(a=null)}}return Ir(e,t,r,a,n),null}var Jt=null,en=null,tn=null;function nn(){if(tn)return tn;var e,t,n=en,r=n.length,a="value"in Jt?Jt.value:Jt.textContent,o=a.length;for(e=0;e<r&&n[e]===a[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===a[o-t];t++);return tn=a.slice(e,1<t?1-t:void 0)}function rn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function an(){return!0}function on(){return!1}function sn(e){function t(t,n,r,a,o){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=a,this.target=o,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(a):a[i]);return this.isDefaultPrevented=(null!=a.defaultPrevented?a.defaultPrevented:!1===a.returnValue)?an:on,this.isPropagationStopped=on,this}return a(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=an)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=an)},persist:function(){},isPersistent:an}),t}var ln,cn,un,dn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},fn=sn(dn),pn=a({},dn,{view:0,detail:0}),gn=sn(pn),mn=a({},pn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Tn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==un&&(un&&"mousemove"===e.type?(ln=e.screenX-un.screenX,cn=e.screenY-un.screenY):cn=ln=0,un=e),ln)},movementY:function(e){return"movementY"in e?e.movementY:cn}}),hn=sn(mn),bn=sn(a({},mn,{dataTransfer:0})),vn=sn(a({},pn,{relatedTarget:0})),yn=sn(a({},dn,{animationName:0,elapsedTime:0,pseudoElement:0})),wn=a({},dn,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),kn=sn(wn),_n=sn(a({},dn,{data:0})),En={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Sn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},xn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Cn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=xn[e])&&!!t[e]}function Tn(){return Cn}var Ln=a({},pn,{key:function(e){if(e.key){var t=En[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=rn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Sn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Tn,charCode:function(e){return"keypress"===e.type?rn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?rn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),An=sn(Ln),On=sn(a({},mn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Nn=sn(a({},pn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Tn})),Rn=sn(a({},dn,{propertyName:0,elapsedTime:0,pseudoElement:0})),Pn=a({},mn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),In=sn(Pn),Dn=[9,13,27,32],Mn=d&&"CompositionEvent"in window,jn=null;d&&"documentMode"in document&&(jn=document.documentMode);var Fn=d&&"TextEvent"in window&&!jn,Bn=d&&(!Mn||jn&&8<jn&&11>=jn),zn=String.fromCharCode(32),Un=!1;function $n(e,t){switch(e){case"keyup":return-1!==Dn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function qn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Hn=!1;var Gn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Zn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Gn[e.type]:"textarea"===t}function Vn(e,t,n,r){Oe(r),0<(t=Mr(t,"onChange")).length&&(n=new fn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Wn=null,Kn=null;function Yn(e){Lr(e,0)}function Qn(e){if(Q(ra(e)))return e}function Xn(e,t){if("change"===e)return t}var Jn=!1;if(d){var er;if(d){var tr="oninput"in document;if(!tr){var nr=document.createElement("div");nr.setAttribute("oninput","return;"),tr="function"==typeof nr.oninput}er=tr}else er=!1;Jn=er&&(!document.documentMode||9<document.documentMode)}function rr(){Wn&&(Wn.detachEvent("onpropertychange",ar),Kn=Wn=null)}function ar(e){if("value"===e.propertyName&&Qn(Kn)){var t=[];if(Vn(t,Kn,e,xe(e)),e=Yn,Me)e(t);else{Me=!0;try{Re(e,t)}finally{Me=!1,Fe()}}}}function or(e,t,n){"focusin"===e?(rr(),Kn=n,(Wn=t).attachEvent("onpropertychange",ar)):"focusout"===e&&rr()}function ir(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Qn(Kn)}function sr(e,t){if("click"===e)return Qn(t)}function lr(e,t){if("input"===e||"change"===e)return Qn(t)}var cr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},ur=Object.prototype.hasOwnProperty;function dr(e,t){if(cr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!ur.call(t,n[r])||!cr(e[n[r]],t[n[r]]))return!1;return!0}function fr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function pr(e,t){var n,r=fr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=fr(r)}}function gr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?gr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function mr(){for(var e=window,t=X();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=X((e=t.contentWindow).document)}return t}function hr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var br=d&&"documentMode"in document&&11>=document.documentMode,vr=null,yr=null,wr=null,kr=!1;function _r(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;kr||null==vr||vr!==X(r)||("selectionStart"in(r=vr)&&hr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},wr&&dr(wr,r)||(wr=r,0<(r=Mr(yr,"onSelect")).length&&(t=new fn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}It("cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focusin focus focusout blur input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),It("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),It(Pt,2);for(var Er="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),Sr=0;Sr<Er.length;Sr++)Rt.set(Er[Sr],0);u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),c("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),c("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),c("onBeforeInput",["compositionend","keypress","textInput","paste"]),c("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),c("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var xr="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Cr=new Set("cancel close invalid load scroll toggle".split(" ").concat(xr));function Tr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,a,o,s,l,c){if(We.apply(this,arguments),qe){if(!qe)throw Error(i(198));var u=He;qe=!1,He=null,Ge||(Ge=!0,Ze=u)}}(r,t,void 0,e),e.currentTarget=null}function Lr(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],a=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==o&&a.isPropagationStopped())break e;Tr(a,s,c),o=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==o&&a.isPropagationStopped())break e;Tr(a,s,c),o=l}}}if(Ge)throw e=Ze,Ge=!1,Ze=null,e}function Ar(e,t){var n=oa(t),r=e+"__bubble";n.has(r)||(Pr(t,e,2,!1),n.add(r))}var Or="_reactListening"+Math.random().toString(36).slice(2);function Nr(e){e[Or]||(e[Or]=!0,s.forEach((function(t){Cr.has(t)||Rr(t,!1,e,null),Rr(t,!0,e,null)})))}function Rr(e,t,n,r){var a=4<arguments.length&&void 0!==arguments[4]?arguments[4]:0,o=n;if("selectionchange"===e&&9!==n.nodeType&&(o=n.ownerDocument),null!==r&&!t&&Cr.has(e)){if("scroll"!==e)return;a|=2,o=r}var i=oa(o),s=e+"__"+(t?"capture":"bubble");i.has(s)||(t&&(a|=4),Pr(o,e,a,t),i.add(s))}function Pr(e,t,n,r){var a=Rt.get(t);switch(void 0===a?2:a){case 0:a=Kt;break;case 1:a=Yt;break;default:a=Qt}n=a.bind(null,t,n,e),a=void 0,!ze||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(a=!0),r?void 0!==a?e.addEventListener(t,n,{capture:!0,passive:a}):e.addEventListener(t,n,!0):void 0!==a?e.addEventListener(t,n,{passive:a}):e.addEventListener(t,n,!1)}function Ir(e,t,n,r,a){var o=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===a||8===s.nodeType&&s.parentNode===a)break;if(4===i)for(i=r.return;null!==i;){var l=i.tag;if((3===l||4===l)&&((l=i.stateNode.containerInfo)===a||8===l.nodeType&&l.parentNode===a))return;i=i.return}for(;null!==s;){if(null===(i=ta(s)))return;if(5===(l=i.tag)||6===l){r=o=i;continue e}s=s.parentNode}}r=r.return}!function(e,t,n){if(je)return e(t,n);je=!0;try{return De(e,t,n)}finally{je=!1,Fe()}}((function(){var r=o,a=xe(n),i=[];e:{var s=Nt.get(e);if(void 0!==s){var l=fn,c=e;switch(e){case"keypress":if(0===rn(n))break e;case"keydown":case"keyup":l=An;break;case"focusin":c="focus",l=vn;break;case"focusout":c="blur",l=vn;break;case"beforeblur":case"afterblur":l=vn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=bn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=Nn;break;case Tt:case Lt:case At:l=yn;break;case Ot:l=Rn;break;case"scroll":l=gn;break;case"wheel":l=In;break;case"copy":case"cut":case"paste":l=kn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=On}var u=0!=(4&t),d=!u&&"scroll"===e,f=u?null!==s?s+"Capture":null:s;u=[];for(var p,g=r;null!==g;){var m=(p=g).stateNode;if(5===p.tag&&null!==m&&(p=m,null!==f&&(null!=(m=Be(g,f))&&u.push(Dr(g,m,p)))),d)break;g=g.return}0<u.length&&(s=new l(s,c,null,n,a),i.push({event:s,listeners:u}))}}if(0==(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||0!=(16&t)||!(c=n.relatedTarget||n.fromElement)||!ta(c)&&!c[Jr])&&(l||s)&&(s=a.window===a?a:(s=a.ownerDocument)?s.defaultView||s.parentWindow:window,l?(l=r,null!==(c=(c=n.relatedTarget||n.toElement)?ta(c):null)&&(c!==(d=Ke(c))||5!==c.tag&&6!==c.tag)&&(c=null)):(l=null,c=r),l!==c)){if(u=hn,m="onMouseLeave",f="onMouseEnter",g="mouse","pointerout"!==e&&"pointerover"!==e||(u=On,m="onPointerLeave",f="onPointerEnter",g="pointer"),d=null==l?s:ra(l),p=null==c?s:ra(c),(s=new u(m,g+"leave",l,n,a)).target=d,s.relatedTarget=p,m=null,ta(a)===r&&((u=new u(f,g+"enter",c,n,a)).target=p,u.relatedTarget=d,m=u),d=m,l&&c)e:{for(f=c,g=0,p=u=l;p;p=jr(p))g++;for(p=0,m=f;m;m=jr(m))p++;for(;0<g-p;)u=jr(u),g--;for(;0<p-g;)f=jr(f),p--;for(;g--;){if(u===f||null!==f&&u===f.alternate)break e;u=jr(u),f=jr(f)}u=null}else u=null;null!==l&&Fr(i,s,l,u,!1),null!==c&&null!==d&&Fr(i,d,c,u,!0)}if("select"===(l=(s=r?ra(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===l&&"file"===s.type)var h=Xn;else if(Zn(s))if(Jn)h=lr;else{h=ir;var b=or}else(l=s.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===s.type||"radio"===s.type)&&(h=sr);switch(h&&(h=h(e,r))?Vn(i,h,n,a):(b&&b(e,s,r),"focusout"===e&&(b=s._wrapperState)&&b.controlled&&"number"===s.type&&ae(s,"number",s.value)),b=r?ra(r):window,e){case"focusin":(Zn(b)||"true"===b.contentEditable)&&(vr=b,yr=r,wr=null);break;case"focusout":wr=yr=vr=null;break;case"mousedown":kr=!0;break;case"contextmenu":case"mouseup":case"dragend":kr=!1,_r(i,n,a);break;case"selectionchange":if(br)break;case"keydown":case"keyup":_r(i,n,a)}var v;if(Mn)e:{switch(e){case"compositionstart":var y="onCompositionStart";break e;case"compositionend":y="onCompositionEnd";break e;case"compositionupdate":y="onCompositionUpdate";break e}y=void 0}else Hn?$n(e,n)&&(y="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(y="onCompositionStart");y&&(Bn&&"ko"!==n.locale&&(Hn||"onCompositionStart"!==y?"onCompositionEnd"===y&&Hn&&(v=nn()):(en="value"in(Jt=a)?Jt.value:Jt.textContent,Hn=!0)),0<(b=Mr(r,y)).length&&(y=new _n(y,e,null,n,a),i.push({event:y,listeners:b}),v?y.data=v:null!==(v=qn(n))&&(y.data=v))),(v=Fn?function(e,t){switch(e){case"compositionend":return qn(t);case"keypress":return 32!==t.which?null:(Un=!0,zn);case"textInput":return(e=t.data)===zn&&Un?null:e;default:return null}}(e,n):function(e,t){if(Hn)return"compositionend"===e||!Mn&&$n(e,t)?(e=nn(),tn=en=Jt=null,Hn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Bn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Mr(r,"onBeforeInput")).length&&(a=new _n("onBeforeInput","beforeinput",null,n,a),i.push({event:a,listeners:r}),a.data=v))}Lr(i,t)}))}function Dr(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Mr(e,t){for(var n=t+"Capture",r=[];null!==e;){var a=e,o=a.stateNode;5===a.tag&&null!==o&&(a=o,null!=(o=Be(e,n))&&r.unshift(Dr(e,o,a)),null!=(o=Be(e,t))&&r.push(Dr(e,o,a))),e=e.return}return r}function jr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Fr(e,t,n,r,a){for(var o=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(null!==l&&l===r)break;5===s.tag&&null!==c&&(s=c,a?null!=(l=Be(n,o))&&i.unshift(Dr(n,l,s)):a||null!=(l=Be(n,o))&&i.push(Dr(n,l,s))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}function Br(){}var zr=null,Ur=null;function $r(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function qr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var Hr="function"==typeof setTimeout?setTimeout:void 0,Gr="function"==typeof clearTimeout?clearTimeout:void 0;function Zr(e){1===e.nodeType?e.textContent="":9===e.nodeType&&(null!=(e=e.body)&&(e.textContent=""))}function Vr(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function Wr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Kr=0;var Yr=Math.random().toString(36).slice(2),Qr="__reactFiber$"+Yr,Xr="__reactProps$"+Yr,Jr="__reactContainer$"+Yr,ea="__reactEvents$"+Yr;function ta(e){var t=e[Qr];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Jr]||n[Qr]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=Wr(e);null!==e;){if(n=e[Qr])return n;e=Wr(e)}return t}n=(e=n).parentNode}return null}function na(e){return!(e=e[Qr]||e[Jr])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function ra(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function aa(e){return e[Xr]||null}function oa(e){var t=e[ea];return void 0===t&&(t=e[ea]=new Set),t}var ia=[],sa=-1;function la(e){return{current:e}}function ca(e){0>sa||(e.current=ia[sa],ia[sa]=null,sa--)}function ua(e,t){sa++,ia[sa]=e.current,e.current=t}var da={},fa=la(da),pa=la(!1),ga=da;function ma(e,t){var n=e.type.contextTypes;if(!n)return da;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a,o={};for(a in n)o[a]=t[a];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function ha(e){return null!=(e=e.childContextTypes)}function ba(){ca(pa),ca(fa)}function va(e,t,n){if(fa.current!==da)throw Error(i(168));ua(fa,t),ua(pa,n)}function ya(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in e))throw Error(i(108,V(t)||"Unknown",o));return a({},n,r)}function wa(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||da,ga=fa.current,ua(fa,e),ua(pa,pa.current),!0}function ka(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=ya(e,t,ga),r.__reactInternalMemoizedMergedChildContext=e,ca(pa),ca(fa),ua(fa,e)):ca(pa),ua(pa,n)}var _a=null,Ea=null,Sa=o.unstable_runWithPriority,xa=o.unstable_scheduleCallback,Ca=o.unstable_cancelCallback,Ta=o.unstable_shouldYield,La=o.unstable_requestPaint,Aa=o.unstable_now,Oa=o.unstable_getCurrentPriorityLevel,Na=o.unstable_ImmediatePriority,Ra=o.unstable_UserBlockingPriority,Pa=o.unstable_NormalPriority,Ia=o.unstable_LowPriority,Da=o.unstable_IdlePriority,Ma={},ja=void 0!==La?La:function(){},Fa=null,Ba=null,za=!1,Ua=Aa(),$a=1e4>Ua?Aa:function(){return Aa()-Ua};function qa(){switch(Oa()){case Na:return 99;case Ra:return 98;case Pa:return 97;case Ia:return 96;case Da:return 95;default:throw Error(i(332))}}function Ha(e){switch(e){case 99:return Na;case 98:return Ra;case 97:return Pa;case 96:return Ia;case 95:return Da;default:throw Error(i(332))}}function Ga(e,t){return e=Ha(e),Sa(e,t)}function Za(e,t,n){return e=Ha(e),xa(e,t,n)}function Va(){if(null!==Ba){var e=Ba;Ba=null,Ca(e)}Wa()}function Wa(){if(!za&&null!==Fa){za=!0;var e=0;try{var t=Fa;Ga(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fa=null}catch(n){throw null!==Fa&&(Fa=Fa.slice(e+1)),xa(Na,Va),n}finally{za=!1}}}var Ka=k.ReactCurrentBatchConfig;function Ya(e,t){if(e&&e.defaultProps){for(var n in t=a({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var Qa=la(null),Xa=null,Ja=null,eo=null;function to(){eo=Ja=Xa=null}function no(e){var t=Qa.current;ca(Qa),e.type._context._currentValue=t}function ro(e,t){for(;null!==e;){var n=e.alternate;if((e.childLanes&t)===t){if(null===n||(n.childLanes&t)===t)break;n.childLanes|=t}else e.childLanes|=t,null!==n&&(n.childLanes|=t);e=e.return}}function ao(e,t){Xa=e,eo=Ja=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!=(e.lanes&t)&&(Mi=!0),e.firstContext=null)}function oo(e,t){if(eo!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(eo=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Ja){if(null===Xa)throw Error(i(308));Ja=t,Xa.dependencies={lanes:0,firstContext:t,responders:null}}else Ja=Ja.next=t;return e._currentValue}var io=!1;function so(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null},effects:null}}function lo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function co(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function uo(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function fo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var a=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?a=o=i:o=o.next=i,n=n.next}while(null!==n);null===o?a=o=t:o=o.next=t}else a=o=t;return n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function po(e,t,n,r){var o=e.updateQueue;io=!1;var i=o.firstBaseUpdate,s=o.lastBaseUpdate,l=o.shared.pending;if(null!==l){o.shared.pending=null;var c=l,u=c.next;c.next=null,null===s?i=u:s.next=u,s=c;var d=e.alternate;if(null!==d){var f=(d=d.updateQueue).lastBaseUpdate;f!==s&&(null===f?d.firstBaseUpdate=u:f.next=u,d.lastBaseUpdate=c)}}if(null!==i){for(f=o.baseState,s=0,d=u=c=null;;){l=i.lane;var p=i.eventTime;if((r&l)===l){null!==d&&(d=d.next={eventTime:p,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var g=e,m=i;switch(l=t,p=n,m.tag){case 1:if("function"==typeof(g=m.payload)){f=g.call(p,f,l);break e}f=g;break e;case 3:g.flags=-4097&g.flags|64;case 0:if(null==(l="function"==typeof(g=m.payload)?g.call(p,f,l):g))break e;f=a({},f,l);break e;case 2:io=!0}}null!==i.callback&&(e.flags|=32,null===(l=o.effects)?o.effects=[i]:l.push(i))}else p={eventTime:p,lane:l,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===d?(u=d=p,c=f):d=d.next=p,s|=l;if(null===(i=i.next)){if(null===(l=o.shared.pending))break;i=l.next,l.next=null,o.lastBaseUpdate=l,o.shared.pending=null}}null===d&&(c=f),o.baseState=c,o.firstBaseUpdate=u,o.lastBaseUpdate=d,Us|=s,e.lanes=s,e.memoizedState=f}}function go(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],a=r.callback;if(null!==a){if(r.callback=null,r=n,"function"!=typeof a)throw Error(i(191,a));a.call(r)}}}var mo=(new r.Component).refs;function ho(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:a({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var bo={isMounted:function(e){return!!(e=e._reactInternals)&&Ke(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=fl(),a=pl(e),o=co(r,a);o.payload=t,null!=n&&(o.callback=n),uo(e,o),gl(e,a,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=fl(),a=pl(e),o=co(r,a);o.tag=1,o.payload=t,null!=n&&(o.callback=n),uo(e,o),gl(e,a,r)},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=fl(),r=pl(e),a=co(n,r);a.tag=2,null!=t&&(a.callback=t),uo(e,a),gl(e,r,n)}};function vo(e,t,n,r,a,o,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,i):!t.prototype||!t.prototype.isPureReactComponent||(!dr(n,r)||!dr(a,o))}function yo(e,t,n){var r=!1,a=da,o=t.contextType;return"object"==typeof o&&null!==o?o=oo(o):(a=ha(t)?ga:fa.current,o=(r=null!=(r=t.contextTypes))?ma(e,a):da),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=bo,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=a,e.__reactInternalMemoizedMaskedChildContext=o),t}function wo(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&bo.enqueueReplaceState(t,t.state,null)}function ko(e,t,n,r){var a=e.stateNode;a.props=n,a.state=e.memoizedState,a.refs=mo,so(e);var o=t.contextType;"object"==typeof o&&null!==o?a.context=oo(o):(o=ha(t)?ga:fa.current,a.context=ma(e,o)),po(e,n,a,r),a.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(ho(e,t,o,n),a.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(t=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),t!==a.state&&bo.enqueueReplaceState(a,a.state,null),po(e,n,a,r),a.state=e.memoizedState),"function"==typeof a.componentDidMount&&(e.flags|=4)}var _o=Array.isArray;function Eo(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var a=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=r.refs;t===mo&&(t=r.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!=typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function So(e,t){if("textarea"!==e.type)throw Error(i(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t))}function xo(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.flags=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function a(e,t){return(e=Zl(e,t)).index=0,e.sibling=null,e}function o(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags=2,n):r:(t.flags=2,n):n}function s(t){return e&&null===t.alternate&&(t.flags=2),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Yl(n,e.mode,r)).return=e,t):((t=a(t,n)).return=e,t)}function c(e,t,n,r){return null!==t&&t.elementType===n.type?((r=a(t,n.props)).ref=Eo(e,t,n),r.return=e,r):((r=Vl(n.type,n.key,n.props,null,e.mode,r)).ref=Eo(e,t,n),r.return=e,r)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Ql(n,e.mode,r)).return=e,t):((t=a(t,n.children||[])).return=e,t)}function d(e,t,n,r,o){return null===t||7!==t.tag?((t=Wl(n,e.mode,r,o)).return=e,t):((t=a(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Yl(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case _:return(n=Vl(t.type,t.key,t.props,null,e.mode,n)).ref=Eo(e,null,t),n.return=e,n;case E:return(t=Ql(t,e.mode,n)).return=e,t}if(_o(t)||$(t))return(t=Wl(t,e.mode,n,null)).return=e,t;So(e,t)}return null}function p(e,t,n,r){var a=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==a?null:l(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case _:return n.key===a?n.type===S?d(e,t,n.props.children,r,a):c(e,t,n,r):null;case E:return n.key===a?u(e,t,n,r):null}if(_o(n)||$(n))return null!==a?null:d(e,t,n,r,null);So(e,n)}return null}function g(e,t,n,r,a){if("string"==typeof r||"number"==typeof r)return l(t,e=e.get(n)||null,""+r,a);if("object"==typeof r&&null!==r){switch(r.$$typeof){case _:return e=e.get(null===r.key?n:r.key)||null,r.type===S?d(t,e,r.props.children,a,r.key):c(t,e,r,a);case E:return u(t,e=e.get(null===r.key?n:r.key)||null,r,a)}if(_o(r)||$(r))return d(t,e=e.get(n)||null,r,a,null);So(t,r)}return null}function m(a,i,s,l){for(var c=null,u=null,d=i,m=i=0,h=null;null!==d&&m<s.length;m++){d.index>m?(h=d,d=null):h=d.sibling;var b=p(a,d,s[m],l);if(null===b){null===d&&(d=h);break}e&&d&&null===b.alternate&&t(a,d),i=o(b,i,m),null===u?c=b:u.sibling=b,u=b,d=h}if(m===s.length)return n(a,d),c;if(null===d){for(;m<s.length;m++)null!==(d=f(a,s[m],l))&&(i=o(d,i,m),null===u?c=d:u.sibling=d,u=d);return c}for(d=r(a,d);m<s.length;m++)null!==(h=g(d,a,m,s[m],l))&&(e&&null!==h.alternate&&d.delete(null===h.key?m:h.key),i=o(h,i,m),null===u?c=h:u.sibling=h,u=h);return e&&d.forEach((function(e){return t(a,e)})),c}function h(a,s,l,c){var u=$(l);if("function"!=typeof u)throw Error(i(150));if(null==(l=u.call(l)))throw Error(i(151));for(var d=u=null,m=s,h=s=0,b=null,v=l.next();null!==m&&!v.done;h++,v=l.next()){m.index>h?(b=m,m=null):b=m.sibling;var y=p(a,m,v.value,c);if(null===y){null===m&&(m=b);break}e&&m&&null===y.alternate&&t(a,m),s=o(y,s,h),null===d?u=y:d.sibling=y,d=y,m=b}if(v.done)return n(a,m),u;if(null===m){for(;!v.done;h++,v=l.next())null!==(v=f(a,v.value,c))&&(s=o(v,s,h),null===d?u=v:d.sibling=v,d=v);return u}for(m=r(a,m);!v.done;h++,v=l.next())null!==(v=g(m,a,h,v.value,c))&&(e&&null!==v.alternate&&m.delete(null===v.key?h:v.key),s=o(v,s,h),null===d?u=v:d.sibling=v,d=v);return e&&m.forEach((function(e){return t(a,e)})),u}return function(e,r,o,l){var c="object"==typeof o&&null!==o&&o.type===S&&null===o.key;c&&(o=o.props.children);var u="object"==typeof o&&null!==o;if(u)switch(o.$$typeof){case _:e:{for(u=o.key,c=r;null!==c;){if(c.key===u){if(7===c.tag){if(o.type===S){n(e,c.sibling),(r=a(c,o.props.children)).return=e,e=r;break e}}else if(c.elementType===o.type){n(e,c.sibling),(r=a(c,o.props)).ref=Eo(e,c,o),r.return=e,e=r;break e}n(e,c);break}t(e,c),c=c.sibling}o.type===S?((r=Wl(o.props.children,e.mode,l,o.key)).return=e,e=r):((l=Vl(o.type,o.key,o.props,null,e.mode,l)).ref=Eo(e,r,o),l.return=e,e=l)}return s(e);case E:e:{for(c=o.key;null!==r;){if(r.key===c){if(4===r.tag&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),(r=a(r,o.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Ql(o,e.mode,l)).return=e,e=r}return s(e)}if("string"==typeof o||"number"==typeof o)return o=""+o,null!==r&&6===r.tag?(n(e,r.sibling),(r=a(r,o)).return=e,e=r):(n(e,r),(r=Yl(o,e.mode,l)).return=e,e=r),s(e);if(_o(o))return m(e,r,o,l);if($(o))return h(e,r,o,l);if(u&&So(e,o),void 0===o&&!c)switch(e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(i(152,V(e.type)||"Component"))}return n(e,r)}}var Co=xo(!0),To=xo(!1),Lo={},Ao=la(Lo),Oo=la(Lo),No=la(Lo);function Ro(e){if(e===Lo)throw Error(i(174));return e}function Po(e,t){switch(ua(No,t),ua(Oo,e),ua(Ao,Lo),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:pe(null,"");break;default:t=pe(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ca(Ao),ua(Ao,t)}function Io(){ca(Ao),ca(Oo),ca(No)}function Do(e){Ro(No.current);var t=Ro(Ao.current),n=pe(t,e.type);t!==n&&(ua(Oo,e),ua(Ao,n))}function Mo(e){Oo.current===e&&(ca(Ao),ca(Oo))}var jo=la(0);function Fo(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Bo=null,zo=null,Uo=!1;function $o(e,t){var n=Hl(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.flags=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function qo(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function Ho(e){if(Uo){var t=zo;if(t){var n=t;if(!qo(e,t)){if(!(t=Vr(n.nextSibling))||!qo(e,t))return e.flags=-1025&e.flags|2,Uo=!1,void(Bo=e);$o(Bo,n)}Bo=e,zo=Vr(t.firstChild)}else e.flags=-1025&e.flags|2,Uo=!1,Bo=e}}function Go(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;Bo=e}function Zo(e){if(e!==Bo)return!1;if(!Uo)return Go(e),Uo=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!qr(t,e.memoizedProps))for(t=zo;t;)$o(e,t),t=Vr(t.nextSibling);if(Go(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){zo=Vr(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}zo=null}}else zo=Bo?Vr(e.stateNode.nextSibling):null;return!0}function Vo(){zo=Bo=null,Uo=!1}var Wo=[];function Ko(){for(var e=0;e<Wo.length;e++)Wo[e]._workInProgressVersionPrimary=null;Wo.length=0}var Yo=k.ReactCurrentDispatcher,Qo=k.ReactCurrentBatchConfig,Xo=0,Jo=null,ei=null,ti=null,ni=!1,ri=!1;function ai(){throw Error(i(321))}function oi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!cr(e[n],t[n]))return!1;return!0}function ii(e,t,n,r,a,o){if(Xo=o,Jo=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Yo.current=null===e||null===e.memoizedState?Ri:Pi,e=n(r,a),ri){o=0;do{if(ri=!1,!(25>o))throw Error(i(301));o+=1,ti=ei=null,t.updateQueue=null,Yo.current=Ii,e=n(r,a)}while(ri)}if(Yo.current=Ni,t=null!==ei&&null!==ei.next,Xo=0,ti=ei=Jo=null,ni=!1,t)throw Error(i(300));return e}function si(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ti?Jo.memoizedState=ti=e:ti=ti.next=e,ti}function li(){if(null===ei){var e=Jo.alternate;e=null!==e?e.memoizedState:null}else e=ei.next;var t=null===ti?Jo.memoizedState:ti.next;if(null!==t)ti=t,ei=e;else{if(null===e)throw Error(i(310));e={memoizedState:(ei=e).memoizedState,baseState:ei.baseState,baseQueue:ei.baseQueue,queue:ei.queue,next:null},null===ti?Jo.memoizedState=ti=e:ti=ti.next=e}return ti}function ci(e,t){return"function"==typeof t?t(e):t}function ui(e){var t=li(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=ei,a=r.baseQueue,o=n.pending;if(null!==o){if(null!==a){var s=a.next;a.next=o.next,o.next=s}r.baseQueue=a=o,n.pending=null}if(null!==a){a=a.next,r=r.baseState;var l=s=o=null,c=a;do{var u=c.lane;if((Xo&u)===u)null!==l&&(l=l.next={lane:0,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null}),r=c.eagerReducer===e?c.eagerState:e(r,c.action);else{var d={lane:u,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null};null===l?(s=l=d,o=r):l=l.next=d,Jo.lanes|=u,Us|=u}c=c.next}while(null!==c&&c!==a);null===l?o=r:l.next=s,cr(r,t.memoizedState)||(Mi=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=l,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function di(e){var t=li(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,a=n.pending,o=t.memoizedState;if(null!==a){n.pending=null;var s=a=a.next;do{o=e(o,s.action),s=s.next}while(s!==a);cr(o,t.memoizedState)||(Mi=!0),t.memoizedState=o,null===t.baseQueue&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function fi(e,t,n){var r=t._getVersion;r=r(t._source);var a=t._workInProgressVersionPrimary;if(null!==a?e=a===r:(e=e.mutableReadLanes,(e=(Xo&e)===e)&&(t._workInProgressVersionPrimary=r,Wo.push(t))),e)return n(t._source);throw Wo.push(t),Error(i(350))}function pi(e,t,n,r){var a=Ps;if(null===a)throw Error(i(349));var o=t._getVersion,s=o(t._source),l=Yo.current,c=l.useState((function(){return fi(a,t,n)})),u=c[1],d=c[0];c=ti;var f=e.memoizedState,p=f.refs,g=p.getSnapshot,m=f.source;f=f.subscribe;var h=Jo;return e.memoizedState={refs:p,source:t,subscribe:r},l.useEffect((function(){p.getSnapshot=n,p.setSnapshot=u;var e=o(t._source);if(!cr(s,e)){e=n(t._source),cr(d,e)||(u(e),e=pl(h),a.mutableReadLanes|=e&a.pendingLanes),e=a.mutableReadLanes,a.entangledLanes|=e;for(var r=a.entanglements,i=e;0<i;){var l=31-qt(i),c=1<<l;r[l]|=e,i&=~c}}}),[n,t,r]),l.useEffect((function(){return r(t._source,(function(){var e=p.getSnapshot,n=p.setSnapshot;try{n(e(t._source));var r=pl(h);a.mutableReadLanes|=r&a.pendingLanes}catch(o){n((function(){throw o}))}}))}),[t,r]),cr(g,n)&&cr(m,t)&&cr(f,r)||((e={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:d}).dispatch=u=Oi.bind(null,Jo,e),c.queue=e,c.baseQueue=null,d=fi(a,t,n),c.memoizedState=c.baseState=d),d}function gi(e,t,n){return pi(li(),e,t,n)}function mi(e){var t=si();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:ci,lastRenderedState:e}).dispatch=Oi.bind(null,Jo,e),[t.memoizedState,e]}function hi(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=Jo.updateQueue)?(t={lastEffect:null},Jo.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function bi(e){return e={current:e},si().memoizedState=e}function vi(){return li().memoizedState}function yi(e,t,n,r){var a=si();Jo.flags|=e,a.memoizedState=hi(1|t,n,void 0,void 0===r?null:r)}function wi(e,t,n,r){var a=li();r=void 0===r?null:r;var o=void 0;if(null!==ei){var i=ei.memoizedState;if(o=i.destroy,null!==r&&oi(r,i.deps))return void hi(t,n,o,r)}Jo.flags|=e,a.memoizedState=hi(1|t,n,o,r)}function ki(e,t){return yi(516,4,e,t)}function _i(e,t){return wi(516,4,e,t)}function Ei(e,t){return wi(4,2,e,t)}function Si(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function xi(e,t,n){return n=null!=n?n.concat([e]):null,wi(4,2,Si.bind(null,t,e),n)}function Ci(){}function Ti(e,t){var n=li();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Li(e,t){var n=li();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&oi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ai(e,t){var n=qa();Ga(98>n?98:n,(function(){e(!0)})),Ga(97<n?97:n,(function(){var n=Qo.transition;Qo.transition=1;try{e(!1),t()}finally{Qo.transition=n}}))}function Oi(e,t,n){var r=fl(),a=pl(e),o={lane:a,action:n,eagerReducer:null,eagerState:null,next:null},i=t.pending;if(null===i?o.next=o:(o.next=i.next,i.next=o),t.pending=o,i=e.alternate,e===Jo||null!==i&&i===Jo)ri=ni=!0;else{if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var s=t.lastRenderedState,l=i(s,n);if(o.eagerReducer=i,o.eagerState=l,cr(l,s))return}catch(c){}gl(e,a,r)}}var Ni={readContext:oo,useCallback:ai,useContext:ai,useEffect:ai,useImperativeHandle:ai,useLayoutEffect:ai,useMemo:ai,useReducer:ai,useRef:ai,useState:ai,useDebugValue:ai,useDeferredValue:ai,useTransition:ai,useMutableSource:ai,useOpaqueIdentifier:ai,unstable_isNewReconciler:!1},Ri={readContext:oo,useCallback:function(e,t){return si().memoizedState=[e,void 0===t?null:t],e},useContext:oo,useEffect:ki,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,yi(4,2,Si.bind(null,t,e),n)},useLayoutEffect:function(e,t){return yi(4,2,e,t)},useMemo:function(e,t){var n=si();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=si();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=Oi.bind(null,Jo,e),[r.memoizedState,e]},useRef:bi,useState:mi,useDebugValue:Ci,useDeferredValue:function(e){var t=mi(e),n=t[0],r=t[1];return ki((function(){var t=Qo.transition;Qo.transition=1;try{r(e)}finally{Qo.transition=t}}),[e]),n},useTransition:function(){var e=mi(!1),t=e[0];return bi(e=Ai.bind(null,e[1])),[e,t]},useMutableSource:function(e,t,n){var r=si();return r.memoizedState={refs:{getSnapshot:t,setSnapshot:null},source:e,subscribe:n},pi(r,e,t,n)},useOpaqueIdentifier:function(){if(Uo){var e=!1,t=function(e){return{$$typeof:D,toString:e,valueOf:e}}((function(){throw e||(e=!0,n("r:"+(Kr++).toString(36))),Error(i(355))})),n=mi(t)[1];return 0==(2&Jo.mode)&&(Jo.flags|=516,hi(5,(function(){n("r:"+(Kr++).toString(36))}),void 0,null)),t}return mi(t="r:"+(Kr++).toString(36)),t},unstable_isNewReconciler:!1},Pi={readContext:oo,useCallback:Ti,useContext:oo,useEffect:_i,useImperativeHandle:xi,useLayoutEffect:Ei,useMemo:Li,useReducer:ui,useRef:vi,useState:function(){return ui(ci)},useDebugValue:Ci,useDeferredValue:function(e){var t=ui(ci),n=t[0],r=t[1];return _i((function(){var t=Qo.transition;Qo.transition=1;try{r(e)}finally{Qo.transition=t}}),[e]),n},useTransition:function(){var e=ui(ci)[0];return[vi().current,e]},useMutableSource:gi,useOpaqueIdentifier:function(){return ui(ci)[0]},unstable_isNewReconciler:!1},Ii={readContext:oo,useCallback:Ti,useContext:oo,useEffect:_i,useImperativeHandle:xi,useLayoutEffect:Ei,useMemo:Li,useReducer:di,useRef:vi,useState:function(){return di(ci)},useDebugValue:Ci,useDeferredValue:function(e){var t=di(ci),n=t[0],r=t[1];return _i((function(){var t=Qo.transition;Qo.transition=1;try{r(e)}finally{Qo.transition=t}}),[e]),n},useTransition:function(){var e=di(ci)[0];return[vi().current,e]},useMutableSource:gi,useOpaqueIdentifier:function(){return di(ci)[0]},unstable_isNewReconciler:!1},Di=k.ReactCurrentOwner,Mi=!1;function ji(e,t,n,r){t.child=null===e?To(t,null,n,r):Co(t,e.child,n,r)}function Fi(e,t,n,r,a){n=n.render;var o=t.ref;return ao(t,a),r=ii(e,t,n,r,o,a),null===e||Mi?(t.flags|=1,ji(e,t,r,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,os(e,t,a))}function Bi(e,t,n,r,a,o){if(null===e){var i=n.type;return"function"!=typeof i||Gl(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Vl(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,zi(e,t,i,r,a,o))}return i=e.child,0==(a&o)&&(a=i.memoizedProps,(n=null!==(n=n.compare)?n:dr)(a,r)&&e.ref===t.ref)?os(e,t,o):(t.flags|=1,(e=Zl(i,r)).ref=t.ref,e.return=t,t.child=e)}function zi(e,t,n,r,a,o){if(null!==e&&dr(e.memoizedProps,r)&&e.ref===t.ref){if(Mi=!1,0==(o&a))return t.lanes=e.lanes,os(e,t,o);0!=(16384&e.flags)&&(Mi=!0)}return qi(e,t,n,r,o)}function Ui(e,t,n){var r=t.pendingProps,a=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode||"unstable-defer-without-hiding"===r.mode)if(0==(4&t.mode))t.memoizedState={baseLanes:0},_l(t,n);else{if(0==(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e},_l(t,e),null;t.memoizedState={baseLanes:0},_l(t,null!==o?o.baseLanes:n)}else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,_l(t,r);return ji(e,t,a,n),t.child}function $i(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=128)}function qi(e,t,n,r,a){var o=ha(n)?ga:fa.current;return o=ma(t,o),ao(t,a),n=ii(e,t,n,r,o,a),null===e||Mi?(t.flags|=1,ji(e,t,n,a),t.child):(t.updateQueue=e.updateQueue,t.flags&=-517,e.lanes&=~a,os(e,t,a))}function Hi(e,t,n,r,a){if(ha(n)){var o=!0;wa(t)}else o=!1;if(ao(t,a),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),yo(t,n,r),ko(t,n,r,a),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=oo(c):c=ma(t,c=ha(n)?ga:fa.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&wo(t,i,r,c),io=!1;var f=t.memoizedState;i.state=f,po(t,r,i,a),l=t.memoizedState,s!==r||f!==l||pa.current||io?("function"==typeof u&&(ho(t,n,u,r),l=t.memoizedState),(s=io||vo(t,n,s,r,f,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4)):("function"==typeof i.componentDidMount&&(t.flags|=4),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4),r=!1)}else{i=t.stateNode,lo(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:Ya(t.type,s),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=oo(l):l=ma(t,l=ha(n)?ga:fa.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||f!==l)&&wo(t,i,r,l),io=!1,f=t.memoizedState,i.state=f,po(t,r,i,a);var g=t.memoizedState;s!==d||f!==g||pa.current||io?("function"==typeof p&&(ho(t,n,p,r),g=t.memoizedState),(c=io||vo(t,n,c,r,f,g,l))?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,g,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,g,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=256)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),t.memoizedProps=r,t.memoizedState=g),i.props=r,i.state=g,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=256),r=!1)}return Gi(e,t,n,r,o,a)}function Gi(e,t,n,r,a,o){$i(e,t);var i=0!=(64&t.flags);if(!r&&!i)return a&&ka(t,n,!1),os(e,t,o);r=t.stateNode,Di.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=Co(t,e.child,null,o),t.child=Co(t,null,s,o)):ji(e,t,s,o),t.memoizedState=r.state,a&&ka(t,n,!0),t.child}function Zi(e){var t=e.stateNode;t.pendingContext?va(0,t.pendingContext,t.pendingContext!==t.context):t.context&&va(0,t.context,!1),Po(e,t.containerInfo)}var Vi,Wi,Ki,Yi,Qi={dehydrated:null,retryLane:0};function Xi(e,t,n){var r,a=t.pendingProps,o=jo.current,i=!1;return(r=0!=(64&t.flags))||(r=(null===e||null!==e.memoizedState)&&0!=(2&o)),r?(i=!0,t.flags&=-65):null!==e&&null===e.memoizedState||void 0===a.fallback||!0===a.unstable_avoidThisFallback||(o|=1),ua(jo,1&o),null===e?(void 0!==a.fallback&&Ho(t),e=a.children,o=a.fallback,i?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,e):"number"==typeof a.unstable_expectedLoadTime?(e=Ji(t,e,o,n),t.child.memoizedState={baseLanes:n},t.memoizedState=Qi,t.lanes=33554432,e):((n=Kl({mode:"visible",children:e},t.mode,n,null)).return=t,t.child=n)):(e.memoizedState,i?(a=ts(e,t,a.children,a.fallback,n),i=t.child,o=e.child.memoizedState,i.memoizedState=null===o?{baseLanes:n}:{baseLanes:o.baseLanes|n},i.childLanes=e.childLanes&~n,t.memoizedState=Qi,a):(n=es(e,t,a.children,n),t.memoizedState=null,n))}function Ji(e,t,n,r){var a=e.mode,o=e.child;return t={mode:"hidden",children:t},0==(2&a)&&null!==o?(o.childLanes=0,o.pendingProps=t):o=Kl(t,a,0,null),n=Wl(n,a,r,null),o.return=e,n.return=e,o.sibling=n,e.child=o,n}function es(e,t,n,r){var a=e.child;return e=a.sibling,n=Zl(a,{mode:"visible",children:n}),0==(2&t.mode)&&(n.lanes=r),n.return=t,n.sibling=null,null!==e&&(e.nextEffect=null,e.flags=8,t.firstEffect=t.lastEffect=e),t.child=n}function ts(e,t,n,r,a){var o=t.mode,i=e.child;e=i.sibling;var s={mode:"hidden",children:n};return 0==(2&o)&&t.child!==i?((n=t.child).childLanes=0,n.pendingProps=s,null!==(i=n.lastEffect)?(t.firstEffect=n.firstEffect,t.lastEffect=i,i.nextEffect=null):t.firstEffect=t.lastEffect=null):n=Zl(i,s),null!==e?r=Zl(e,r):(r=Wl(r,o,a,null)).flags|=2,r.return=t,n.return=t,n.sibling=r,t.child=n,r}function ns(e,t){e.lanes|=t;var n=e.alternate;null!==n&&(n.lanes|=t),ro(e.return,t)}function rs(e,t,n,r,a,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:a,lastEffect:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=a,i.lastEffect=o)}function as(e,t,n){var r=t.pendingProps,a=r.revealOrder,o=r.tail;if(ji(e,t,r.children,n),0!=(2&(r=jo.current)))r=1&r|2,t.flags|=64;else{if(null!==e&&0!=(64&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&ns(e,n);else if(19===e.tag)ns(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(ua(jo,r),0==(2&t.mode))t.memoizedState=null;else switch(a){case"forwards":for(n=t.child,a=null;null!==n;)null!==(e=n.alternate)&&null===Fo(e)&&(a=n),n=n.sibling;null===(n=a)?(a=t.child,t.child=null):(a=n.sibling,n.sibling=null),rs(t,!1,a,n,o,t.lastEffect);break;case"backwards":for(n=null,a=t.child,t.child=null;null!==a;){if(null!==(e=a.alternate)&&null===Fo(e)){t.child=a;break}e=a.sibling,a.sibling=n,n=a,a=e}rs(t,!0,n,null,o,t.lastEffect);break;case"together":rs(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function os(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Us|=t.lanes,0!=(n&t.childLanes)){if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Zl(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Zl(e,e.pendingProps)).return=t;n.sibling=null}return t.child}return null}function is(e,t){if(!Uo)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ss(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:case 17:return ha(t.type)&&ba(),null;case 3:return Io(),ca(pa),ca(fa),Ko(),(r=t.stateNode).pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(Zo(t)?t.flags|=4:r.hydrate||(t.flags|=256)),Wi(t),null;case 5:Mo(t);var o=Ro(No.current);if(n=t.type,null!==e&&null!=t.stateNode)Ki(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=128);else{if(!r){if(null===t.stateNode)throw Error(i(166));return null}if(e=Ro(Ao.current),Zo(t)){r=t.stateNode,n=t.type;var s=t.memoizedProps;switch(r[Qr]=t,r[Xr]=s,n){case"dialog":Ar("cancel",r),Ar("close",r);break;case"iframe":case"object":case"embed":Ar("load",r);break;case"video":case"audio":for(e=0;e<xr.length;e++)Ar(xr[e],r);break;case"source":Ar("error",r);break;case"img":case"image":case"link":Ar("error",r),Ar("load",r);break;case"details":Ar("toggle",r);break;case"input":ee(r,s),Ar("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!s.multiple},Ar("invalid",r);break;case"textarea":le(r,s),Ar("invalid",r)}for(var c in Ee(n,s),e=null,s)s.hasOwnProperty(c)&&(o=s[c],"children"===c?"string"==typeof o?r.textContent!==o&&(e=["children",o]):"number"==typeof o&&r.textContent!==""+o&&(e=["children",""+o]):l.hasOwnProperty(c)&&null!=o&&"onScroll"===c&&Ar("scroll",r));switch(n){case"input":Y(r),re(r,s,!0);break;case"textarea":Y(r),ue(r);break;case"select":case"option":break;default:"function"==typeof s.onClick&&(r.onclick=Br)}r=e,t.updateQueue=r,null!==r&&(t.flags|=4)}else{switch(c=9===o.nodeType?o:o.ownerDocument,e===de.html&&(e=fe(n)),e===de.html?"script"===n?((e=c.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=c.createElement(n,{is:r.is}):(e=c.createElement(n),"select"===n&&(c=e,r.multiple?c.multiple=!0:r.size&&(c.size=r.size))):e=c.createElementNS(e,n),e[Qr]=t,e[Xr]=r,Vi(e,t,!1,!1),t.stateNode=e,c=Se(n,r),n){case"dialog":Ar("cancel",e),Ar("close",e),o=r;break;case"iframe":case"object":case"embed":Ar("load",e),o=r;break;case"video":case"audio":for(o=0;o<xr.length;o++)Ar(xr[o],e);o=r;break;case"source":Ar("error",e),o=r;break;case"img":case"image":case"link":Ar("error",e),Ar("load",e),o=r;break;case"details":Ar("toggle",e),o=r;break;case"input":ee(e,r),o=J(e,r),Ar("invalid",e);break;case"option":o=oe(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=a({},r,{value:void 0}),Ar("invalid",e);break;case"textarea":le(e,r),o=se(e,r),Ar("invalid",e);break;default:o=r}Ee(n,o);var u=o;for(s in u)if(u.hasOwnProperty(s)){var d=u[s];"style"===s?ke(e,d):"dangerouslySetInnerHTML"===s?null!=(d=d?d.__html:void 0)&&he(e,d):"children"===s?"string"==typeof d?("textarea"!==n||""!==d)&&be(e,d):"number"==typeof d&&be(e,""+d):"suppressContentEditableWarning"!==s&&"suppressHydrationWarning"!==s&&"autoFocus"!==s&&(l.hasOwnProperty(s)?null!=d&&"onScroll"===s&&Ar("scroll",e):null!=d&&w(e,s,d,c))}switch(n){case"input":Y(e),re(e,r,!1);break;case"textarea":Y(e),ue(e);break;case"option":null!=r.value&&e.setAttribute("value",""+W(r.value));break;case"select":e.multiple=!!r.multiple,null!=(s=r.value)?ie(e,!!r.multiple,s,!1):null!=r.defaultValue&&ie(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof o.onClick&&(e.onclick=Br)}$r(n,r)&&(t.flags|=4)}null!==t.ref&&(t.flags|=128)}return null;case 6:if(e&&null!=t.stateNode)Yi(e,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(i(166));n=Ro(No.current),Ro(Ao.current),Zo(t)?(r=t.stateNode,n=t.memoizedProps,r[Qr]=t,r.nodeValue!==n&&(t.flags|=4)):((r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[Qr]=t,t.stateNode=r)}return null;case 13:return ca(jo),r=t.memoizedState,0!=(64&t.flags)?(t.lanes=n,t):(r=null!==r,n=!1,null===e?void 0!==t.memoizedProps.fallback&&Zo(t):n=null!==e.memoizedState,r&&!n&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&jo.current)?0===Fs&&(Fs=3):(0!==Fs&&3!==Fs||(Fs=4),null===Ps||0==(134217727&Us)&&0==(134217727&$s)||vl(Ps,Ds))),(r||n)&&(t.flags|=4),null);case 4:return Io(),Wi(t),null===e&&Nr(t.stateNode.containerInfo),null;case 10:return no(t),null;case 19:if(ca(jo),null===(r=t.memoizedState))return null;if(s=0!=(64&t.flags),null===(c=r.rendering))if(s)is(r,!1);else{if(0!==Fs||null!==e&&0!=(64&e.flags))for(e=t.child;null!==e;){if(null!==(c=Fo(e))){for(t.flags|=64,is(r,!1),null!==(s=c.updateQueue)&&(t.updateQueue=s,t.flags|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=n,n=t.child;null!==n;)e=r,(s=n).flags&=2,s.nextEffect=null,s.firstEffect=null,s.lastEffect=null,null===(c=s.alternate)?(s.childLanes=0,s.lanes=e,s.child=null,s.memoizedProps=null,s.memoizedState=null,s.updateQueue=null,s.dependencies=null,s.stateNode=null):(s.childLanes=c.childLanes,s.lanes=c.lanes,s.child=c.child,s.memoizedProps=c.memoizedProps,s.memoizedState=c.memoizedState,s.updateQueue=c.updateQueue,s.type=c.type,e=c.dependencies,s.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return ua(jo,1&jo.current|2),t.child}e=e.sibling}null!==r.tail&&$a()>Zs&&(t.flags|=64,s=!0,is(r,!1),t.lanes=33554432)}else{if(!s)if(null!==(e=Fo(c))){if(t.flags|=64,s=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),is(r,!0),null===r.tail&&"hidden"===r.tailMode&&!c.alternate&&!Uo)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*$a()-r.renderingStartTime>Zs&&1073741824!==n&&(t.flags|=64,s=!0,is(r,!1),t.lanes=33554432);r.isBackwards?(c.sibling=t.child,t.child=c):(null!==(n=r.last)?n.sibling=c:t.child=c,r.last=c)}return null!==r.tail?(n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=$a(),n.sibling=null,t=jo.current,ua(jo,s?1&t|2:1&t),n):null;case 23:case 24:return El(),null!==e&&null!==e.memoizedState!=(null!==t.memoizedState)&&"unstable-defer-without-hiding"!==r.mode&&(t.flags|=4),null}throw Error(i(156,t.tag))}function ls(e){switch(e.tag){case 1:ha(e.type)&&ba();var t=e.flags;return 4096&t?(e.flags=-4097&t|64,e):null;case 3:if(Io(),ca(pa),ca(fa),Ko(),0!=(64&(t=e.flags)))throw Error(i(285));return e.flags=-4097&t|64,e;case 5:return Mo(e),null;case 13:return ca(jo),4096&(t=e.flags)?(e.flags=-4097&t|64,e):null;case 19:return ca(jo),null;case 4:return Io(),null;case 10:return no(e),null;case 23:case 24:return El(),null;default:return null}}function cs(e,t){try{var n="",r=t;do{n+=Z(r),r=r.return}while(r);var a=n}catch(o){a="\nError generating stack: "+o.message+"\n"+o.stack}return{value:e,source:t,stack:a}}function us(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}Vi=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Wi=function(){},Ki=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Ro(Ao.current);var i,s=null;switch(n){case"input":o=J(e,o),r=J(e,r),s=[];break;case"option":o=oe(e,o),r=oe(e,r),s=[];break;case"select":o=a({},o,{value:void 0}),r=a({},r,{value:void 0}),s=[];break;case"textarea":o=se(e,o),r=se(e,r),s=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Br)}for(d in Ee(n,r),n=null,o)if(!r.hasOwnProperty(d)&&o.hasOwnProperty(d)&&null!=o[d])if("style"===d){var c=o[d];for(i in c)c.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==d&&"children"!==d&&"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&"autoFocus"!==d&&(l.hasOwnProperty(d)?s||(s=[]):(s=s||[]).push(d,null));for(d in r){var u=r[d];if(c=null!=o?o[d]:void 0,r.hasOwnProperty(d)&&u!==c&&(null!=u||null!=c))if("style"===d)if(c){for(i in c)!c.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&c[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(s||(s=[]),s.push(d,n)),n=u;else"dangerouslySetInnerHTML"===d?(u=u?u.__html:void 0,c=c?c.__html:void 0,null!=u&&c!==u&&(s=s||[]).push(d,u)):"children"===d?"string"!=typeof u&&"number"!=typeof u||(s=s||[]).push(d,""+u):"suppressContentEditableWarning"!==d&&"suppressHydrationWarning"!==d&&(l.hasOwnProperty(d)?(null!=u&&"onScroll"===d&&Ar("scroll",e),s||c===u||(s=[])):"object"==typeof u&&null!==u&&u.$$typeof===D?u.toString():(s=s||[]).push(d,u))}n&&(s=s||[]).push("style",n);var d=s;(t.updateQueue=d)&&(t.flags|=4)}},Yi=function(e,t,n,r){n!==r&&(t.flags|=4)};var ds="function"==typeof WeakMap?WeakMap:Map;function fs(e,t,n){(n=co(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Ys||(Ys=!0,Qs=r),us(0,t)},n}function ps(e,t,n){(n=co(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var a=t.value;n.payload=function(){return us(0,t),r(a)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Xs?Xs=new Set([this]):Xs.add(this),us(0,t));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}var gs="function"==typeof WeakSet?WeakSet:Set;function ms(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){zl(e,n)}else t.current=null}function hs(e,t){switch(t.tag){case 0:case 11:case 15:case 22:case 5:case 6:case 4:case 17:return;case 1:if(256&t.flags&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Ya(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:return void(256&t.flags&&Zr(t.stateNode.containerInfo))}throw Error(i(163))}function bs(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{if(3==(3&e.tag)){var r=e.create;e.destroy=r()}e=e.next}while(e!==t)}if(null!==(t=null!==(t=n.updateQueue)?t.lastEffect:null)){e=t=t.next;do{var a=e;r=a.next,0!=(4&(a=a.tag))&&0!=(1&a)&&(jl(n,e),Ml(n,e)),e=r}while(e!==t)}return;case 1:return e=n.stateNode,4&n.flags&&(null===t?e.componentDidMount():(r=n.elementType===n.type?t.memoizedProps:Ya(n.type,t.memoizedProps),e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate))),void(null!==(t=n.updateQueue)&&go(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:case 1:e=n.child.stateNode}go(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.flags&&$r(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:case 19:case 17:case 20:case 21:case 23:case 24:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&kt(n)))))}throw Error(i(163))}function vs(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)"function"==typeof(r=r.style).setProperty?r.setProperty("display","none","important"):r.display="none";else{r=n.stateNode;var a=n.memoizedProps.style;a=null!=a&&a.hasOwnProperty("display")?a.display:null,r.style.display=we("display",a)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else if((23!==n.tag&&24!==n.tag||null===n.memoizedState||n===e)&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}function ys(e,t){if(Ea&&"function"==typeof Ea.onCommitFiberUnmount)try{Ea.onCommitFiberUnmount(_a,t)}catch(o){}switch(t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var n=e=e.next;do{var r=n,a=r.destroy;if(r=r.tag,void 0!==a)if(0!=(4&r))jl(t,n);else{r=t;try{a()}catch(o){zl(r,o)}}n=n.next}while(n!==e)}break;case 1:if(ms(t),"function"==typeof(e=t.stateNode).componentWillUnmount)try{e.props=t.memoizedProps,e.state=t.memoizedState,e.componentWillUnmount()}catch(o){zl(t,o)}break;case 5:ms(t);break;case 4:xs(e,t)}}function ws(e){e.alternate=null,e.child=null,e.dependencies=null,e.firstEffect=null,e.lastEffect=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.return=null,e.updateQueue=null}function ks(e){return 5===e.tag||3===e.tag||4===e.tag}function _s(e){e:{for(var t=e.return;null!==t;){if(ks(t))break e;t=t.return}throw Error(i(160))}var n=t;switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(i(161))}16&n.flags&&(be(t,""),n.flags&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||ks(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.flags)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.flags)){n=n.stateNode;break e}}r?Es(e,n,t):Ss(e,n,t)}function Es(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Br));else if(4!==r&&null!==(e=e.child))for(Es(e,t,n),e=e.sibling;null!==e;)Es(e,t,n),e=e.sibling}function Ss(e,t,n){var r=e.tag,a=5===r||6===r;if(a)e=a?e.stateNode:e.stateNode.instance,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(Ss(e,t,n),e=e.sibling;null!==e;)Ss(e,t,n),e=e.sibling}function xs(e,t){for(var n,r,a=t,o=!1;;){if(!o){o=a.return;e:for(;;){if(null===o)throw Error(i(160));switch(n=o.stateNode,o.tag){case 5:r=!1;break e;case 3:case 4:n=n.containerInfo,r=!0;break e}o=o.return}o=!0}if(5===a.tag||6===a.tag){e:for(var s=e,l=a,c=l;;)if(ys(s,c),null!==c.child&&4!==c.tag)c.child.return=c,c=c.child;else{if(c===l)break e;for(;null===c.sibling;){if(null===c.return||c.return===l)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}r?(s=n,l=a.stateNode,8===s.nodeType?s.parentNode.removeChild(l):s.removeChild(l)):n.removeChild(a.stateNode)}else if(4===a.tag){if(null!==a.child){n=a.stateNode.containerInfo,r=!0,a.child.return=a,a=a.child;continue}}else if(ys(e,a),null!==a.child){a.child.return=a,a=a.child;continue}if(a===t)break;for(;null===a.sibling;){if(null===a.return||a.return===t)return;4===(a=a.return).tag&&(o=!1)}a.sibling.return=a.return,a=a.sibling}}function Cs(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:var n=t.updateQueue;if(null!==(n=null!==n?n.lastEffect:null)){var r=n=n.next;do{3==(3&r.tag)&&(e=r.destroy,r.destroy=void 0,void 0!==e&&e()),r=r.next}while(r!==n)}return;case 1:case 12:case 17:return;case 5:if(null!=(n=t.stateNode)){r=t.memoizedProps;var a=null!==e?e.memoizedProps:r;e=t.type;var o=t.updateQueue;if(t.updateQueue=null,null!==o){for(n[Xr]=r,"input"===e&&"radio"===r.type&&null!=r.name&&te(n,r),Se(e,a),t=Se(e,r),a=0;a<o.length;a+=2){var s=o[a],l=o[a+1];"style"===s?ke(n,l):"dangerouslySetInnerHTML"===s?he(n,l):"children"===s?be(n,l):w(n,s,l,t)}switch(e){case"input":ne(n,r);break;case"textarea":ce(n,r);break;case"select":e=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(o=r.value)?ie(n,!!r.multiple,o,!1):e!==!!r.multiple&&(null!=r.defaultValue?ie(n,!!r.multiple,r.defaultValue,!0):ie(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(i(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((n=t.stateNode).hydrate&&(n.hydrate=!1,kt(n.containerInfo)));case 13:return null!==t.memoizedState&&(Gs=$a(),vs(t.child,!0)),void Ts(t);case 19:return void Ts(t);case 23:case 24:return void vs(t,null!==t.memoizedState)}throw Error(i(163))}function Ts(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new gs),t.forEach((function(t){var r=$l.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function Ls(e,t){return null!==e&&(null===(e=e.memoizedState)||null!==e.dehydrated)&&(null!==(t=t.memoizedState)&&null===t.dehydrated)}var As=Math.ceil,Os=k.ReactCurrentDispatcher,Ns=k.ReactCurrentOwner,Rs=0,Ps=null,Is=null,Ds=0,Ms=0,js=la(0),Fs=0,Bs=null,zs=0,Us=0,$s=0,qs=0,Hs=null,Gs=0,Zs=1/0;function Vs(){Zs=$a()+500}var Ws,Ks=null,Ys=!1,Qs=null,Xs=null,Js=!1,el=null,tl=90,nl=[],rl=[],al=null,ol=0,il=null,sl=-1,ll=0,cl=0,ul=null,dl=!1;function fl(){return 0!=(48&Rs)?$a():-1!==sl?sl:sl=$a()}function pl(e){if(0==(2&(e=e.mode)))return 1;if(0==(4&e))return 99===qa()?1:2;if(0===ll&&(ll=zs),0!==Ka.transition){0!==cl&&(cl=null!==Hs?Hs.pendingLanes:0),e=ll;var t=4186112&~cl;return 0===(t&=-t)&&(0===(t=(e=4186112&~e)&-e)&&(t=8192)),t}return e=qa(),0!=(4&Rs)&&98===e?e=Bt(12,ll):e=Bt(e=function(e){switch(e){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}(e),ll),e}function gl(e,t,n){if(50<ol)throw ol=0,il=null,Error(i(185));if(null===(e=ml(e,t)))return null;$t(e,t,n),e===Ps&&($s|=t,4===Fs&&vl(e,Ds));var r=qa();1===t?0!=(8&Rs)&&0==(48&Rs)?yl(e):(hl(e,n),0===Rs&&(Vs(),Va())):(0==(4&Rs)||98!==r&&99!==r||(null===al?al=new Set([e]):al.add(e)),hl(e,n)),Hs=e}function ml(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}function hl(e,t){for(var n=e.callbackNode,r=e.suspendedLanes,a=e.pingedLanes,o=e.expirationTimes,s=e.pendingLanes;0<s;){var l=31-qt(s),c=1<<l,u=o[l];if(-1===u){if(0==(c&r)||0!=(c&a)){u=t,Mt(c);var d=Dt;o[l]=10<=d?u+250:6<=d?u+5e3:-1}}else u<=t&&(e.expiredLanes|=c);s&=~c}if(r=jt(e,e===Ps?Ds:0),t=Dt,0===r)null!==n&&(n!==Ma&&Ca(n),e.callbackNode=null,e.callbackPriority=0);else{if(null!==n){if(e.callbackPriority===t)return;n!==Ma&&Ca(n)}15===t?(n=yl.bind(null,e),null===Fa?(Fa=[n],Ba=xa(Na,Wa)):Fa.push(n),n=Ma):14===t?n=Za(99,yl.bind(null,e)):(n=function(e){switch(e){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(i(358,e))}}(t),n=Za(n,bl.bind(null,e))),e.callbackPriority=t,e.callbackNode=n}}function bl(e){if(sl=-1,cl=ll=0,0!=(48&Rs))throw Error(i(327));var t=e.callbackNode;if(Dl()&&e.callbackNode!==t)return null;var n=jt(e,e===Ps?Ds:0);if(0===n)return null;var r=n,a=Rs;Rs|=16;var o=Cl();for(Ps===e&&Ds===r||(Vs(),Sl(e,r));;)try{Al();break}catch(l){xl(e,l)}if(to(),Os.current=o,Rs=a,null!==Is?r=0:(Ps=null,Ds=0,r=Fs),0!=(zs&$s))Sl(e,0);else if(0!==r){if(2===r&&(Rs|=64,e.hydrate&&(e.hydrate=!1,Zr(e.containerInfo)),0!==(n=Ft(e))&&(r=Tl(e,n))),1===r)throw t=Bs,Sl(e,0),vl(e,n),hl(e,$a()),t;switch(e.finishedWork=e.current.alternate,e.finishedLanes=n,r){case 0:case 1:throw Error(i(345));case 2:case 5:Rl(e);break;case 3:if(vl(e,n),(62914560&n)===n&&10<(r=Gs+500-$a())){if(0!==jt(e,0))break;if(((a=e.suspendedLanes)&n)!==n){fl(),e.pingedLanes|=e.suspendedLanes&a;break}e.timeoutHandle=Hr(Rl.bind(null,e),r);break}Rl(e);break;case 4:if(vl(e,n),(4186112&n)===n)break;for(r=e.eventTimes,a=-1;0<n;){var s=31-qt(n);o=1<<s,(s=r[s])>a&&(a=s),n&=~o}if(n=a,10<(n=(120>(n=$a()-n)?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*As(n/1960))-n)){e.timeoutHandle=Hr(Rl.bind(null,e),n);break}Rl(e);break;default:throw Error(i(329))}}return hl(e,$a()),e.callbackNode===t?bl.bind(null,e):null}function vl(e,t){for(t&=~qs,t&=~$s,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-qt(t),r=1<<n;e[n]=-1,t&=~r}}function yl(e){if(0!=(48&Rs))throw Error(i(327));if(Dl(),e===Ps&&0!=(e.expiredLanes&Ds)){var t=Ds,n=Tl(e,t);0!=(zs&$s)&&(n=Tl(e,t=jt(e,t)))}else n=Tl(e,t=jt(e,0));if(0!==e.tag&&2===n&&(Rs|=64,e.hydrate&&(e.hydrate=!1,Zr(e.containerInfo)),0!==(t=Ft(e))&&(n=Tl(e,t))),1===n)throw n=Bs,Sl(e,0),vl(e,t),hl(e,$a()),n;return e.finishedWork=e.current.alternate,e.finishedLanes=t,Rl(e),hl(e,$a()),null}function wl(e,t){var n=Rs;Rs|=1;try{return e(t)}finally{0===(Rs=n)&&(Vs(),Va())}}function kl(e,t){var n=Rs;Rs&=-2,Rs|=8;try{return e(t)}finally{0===(Rs=n)&&(Vs(),Va())}}function _l(e,t){ua(js,Ms),Ms|=t,zs|=t}function El(){Ms=js.current,ca(js)}function Sl(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,Gr(n)),null!==Is)for(n=Is.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&ba();break;case 3:Io(),ca(pa),ca(fa),Ko();break;case 5:Mo(r);break;case 4:Io();break;case 13:case 19:ca(jo);break;case 10:no(r);break;case 23:case 24:El()}n=n.return}Ps=e,Is=Zl(e.current,null),Ds=Ms=zs=t,Fs=0,Bs=null,qs=$s=Us=0}function xl(e,t){for(;;){var n=Is;try{if(to(),Yo.current=Ni,ni){for(var r=Jo.memoizedState;null!==r;){var a=r.queue;null!==a&&(a.pending=null),r=r.next}ni=!1}if(Xo=0,ti=ei=Jo=null,ri=!1,Ns.current=null,null===n||null===n.return){Fs=1,Bs=t,Is=null;break}e:{var o=e,i=n.return,s=n,l=t;if(t=Ds,s.flags|=2048,s.firstEffect=s.lastEffect=null,null!==l&&"object"==typeof l&&"function"==typeof l.then){var c=l;if(0==(2&s.mode)){var u=s.alternate;u?(s.updateQueue=u.updateQueue,s.memoizedState=u.memoizedState,s.lanes=u.lanes):(s.updateQueue=null,s.memoizedState=null)}var d=0!=(1&jo.current),f=i;do{var p;if(p=13===f.tag){var g=f.memoizedState;if(null!==g)p=null!==g.dehydrated;else{var m=f.memoizedProps;p=void 0!==m.fallback&&(!0!==m.unstable_avoidThisFallback||!d)}}if(p){var h=f.updateQueue;if(null===h){var b=new Set;b.add(c),f.updateQueue=b}else h.add(c);if(0==(2&f.mode)){if(f.flags|=64,s.flags|=16384,s.flags&=-2981,1===s.tag)if(null===s.alternate)s.tag=17;else{var v=co(-1,1);v.tag=2,uo(s,v)}s.lanes|=1;break e}l=void 0,s=t;var y=o.pingCache;if(null===y?(y=o.pingCache=new ds,l=new Set,y.set(c,l)):void 0===(l=y.get(c))&&(l=new Set,y.set(c,l)),!l.has(s)){l.add(s);var w=Ul.bind(null,o,c,s);c.then(w,w)}f.flags|=4096,f.lanes=t;break e}f=f.return}while(null!==f);l=Error((V(s.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.")}5!==Fs&&(Fs=2),l=cs(l,s),f=i;do{switch(f.tag){case 3:o=l,f.flags|=4096,t&=-t,f.lanes|=t,fo(f,fs(0,o,t));break e;case 1:o=l;var k=f.type,_=f.stateNode;if(0==(64&f.flags)&&("function"==typeof k.getDerivedStateFromError||null!==_&&"function"==typeof _.componentDidCatch&&(null===Xs||!Xs.has(_)))){f.flags|=4096,t&=-t,f.lanes|=t,fo(f,ps(f,o,t));break e}}f=f.return}while(null!==f)}Nl(n)}catch(E){t=E,Is===n&&null!==n&&(Is=n=n.return);continue}break}}function Cl(){var e=Os.current;return Os.current=Ni,null===e?Ni:e}function Tl(e,t){var n=Rs;Rs|=16;var r=Cl();for(Ps===e&&Ds===t||Sl(e,t);;)try{Ll();break}catch(a){xl(e,a)}if(to(),Rs=n,Os.current=r,null!==Is)throw Error(i(261));return Ps=null,Ds=0,Fs}function Ll(){for(;null!==Is;)Ol(Is)}function Al(){for(;null!==Is&&!Ta();)Ol(Is)}function Ol(e){var t=Ws(e.alternate,e,Ms);e.memoizedProps=e.pendingProps,null===t?Nl(e):Is=t,Ns.current=null}function Nl(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(2048&t.flags)){if(null!==(n=ss(n,t,Ms)))return void(Is=n);if(24!==(n=t).tag&&23!==n.tag||null===n.memoizedState||0!=(1073741824&Ms)||0==(4&n.mode)){for(var r=0,a=n.child;null!==a;)r|=a.lanes|a.childLanes,a=a.sibling;n.childLanes=r}null!==e&&0==(2048&e.flags)&&(null===e.firstEffect&&(e.firstEffect=t.firstEffect),null!==t.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=t.firstEffect),e.lastEffect=t.lastEffect),1<t.flags&&(null!==e.lastEffect?e.lastEffect.nextEffect=t:e.firstEffect=t,e.lastEffect=t))}else{if(null!==(n=ls(t)))return n.flags&=2047,void(Is=n);null!==e&&(e.firstEffect=e.lastEffect=null,e.flags|=2048)}if(null!==(t=t.sibling))return void(Is=t);Is=t=e}while(null!==t);0===Fs&&(Fs=5)}function Rl(e){var t=qa();return Ga(99,Pl.bind(null,e,t)),null}function Pl(e,t){do{Dl()}while(null!==el);if(0!=(48&Rs))throw Error(i(327));var n=e.finishedWork;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null;var r=n.lanes|n.childLanes,a=r,o=e.pendingLanes&~a;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=a,e.mutableReadLanes&=a,e.entangledLanes&=a,a=e.entanglements;for(var s=e.eventTimes,l=e.expirationTimes;0<o;){var c=31-qt(o),u=1<<c;a[c]=0,s[c]=-1,l[c]=-1,o&=~u}if(null!==al&&0==(24&r)&&al.has(e)&&al.delete(e),e===Ps&&(Is=Ps=null,Ds=0),1<n.flags?null!==n.lastEffect?(n.lastEffect.nextEffect=n,r=n.firstEffect):r=n:r=n.firstEffect,null!==r){if(a=Rs,Rs|=32,Ns.current=null,zr=Wt,hr(s=mr())){if("selectionStart"in s)l={start:s.selectionStart,end:s.selectionEnd};else e:if(l=(l=s.ownerDocument)&&l.defaultView||window,(u=l.getSelection&&l.getSelection())&&0!==u.rangeCount){l=u.anchorNode,o=u.anchorOffset,c=u.focusNode,u=u.focusOffset;try{l.nodeType,c.nodeType}catch(C){l=null;break e}var d=0,f=-1,p=-1,g=0,m=0,h=s,b=null;t:for(;;){for(var v;h!==l||0!==o&&3!==h.nodeType||(f=d+o),h!==c||0!==u&&3!==h.nodeType||(p=d+u),3===h.nodeType&&(d+=h.nodeValue.length),null!==(v=h.firstChild);)b=h,h=v;for(;;){if(h===s)break t;if(b===l&&++g===o&&(f=d),b===c&&++m===u&&(p=d),null!==(v=h.nextSibling))break;b=(h=b).parentNode}h=v}l=-1===f||-1===p?null:{start:f,end:p}}else l=null;l=l||{start:0,end:0}}else l=null;Ur={focusedElem:s,selectionRange:l},Wt=!1,ul=null,dl=!1,Ks=r;do{try{Il()}catch(C){if(null===Ks)throw Error(i(330));zl(Ks,C),Ks=Ks.nextEffect}}while(null!==Ks);ul=null,Ks=r;do{try{for(s=e;null!==Ks;){var y=Ks.flags;if(16&y&&be(Ks.stateNode,""),128&y){var w=Ks.alternate;if(null!==w){var k=w.ref;null!==k&&("function"==typeof k?k(null):k.current=null)}}switch(1038&y){case 2:_s(Ks),Ks.flags&=-3;break;case 6:_s(Ks),Ks.flags&=-3,Cs(Ks.alternate,Ks);break;case 1024:Ks.flags&=-1025;break;case 1028:Ks.flags&=-1025,Cs(Ks.alternate,Ks);break;case 4:Cs(Ks.alternate,Ks);break;case 8:xs(s,l=Ks);var _=l.alternate;ws(l),null!==_&&ws(_)}Ks=Ks.nextEffect}}catch(C){if(null===Ks)throw Error(i(330));zl(Ks,C),Ks=Ks.nextEffect}}while(null!==Ks);if(k=Ur,w=mr(),y=k.focusedElem,s=k.selectionRange,w!==y&&y&&y.ownerDocument&&gr(y.ownerDocument.documentElement,y)){null!==s&&hr(y)&&(w=s.start,void 0===(k=s.end)&&(k=w),"selectionStart"in y?(y.selectionStart=w,y.selectionEnd=Math.min(k,y.value.length)):(k=(w=y.ownerDocument||document)&&w.defaultView||window).getSelection&&(k=k.getSelection(),l=y.textContent.length,_=Math.min(s.start,l),s=void 0===s.end?_:Math.min(s.end,l),!k.extend&&_>s&&(l=s,s=_,_=l),l=pr(y,_),o=pr(y,s),l&&o&&(1!==k.rangeCount||k.anchorNode!==l.node||k.anchorOffset!==l.offset||k.focusNode!==o.node||k.focusOffset!==o.offset)&&((w=w.createRange()).setStart(l.node,l.offset),k.removeAllRanges(),_>s?(k.addRange(w),k.extend(o.node,o.offset)):(w.setEnd(o.node,o.offset),k.addRange(w))))),w=[];for(k=y;k=k.parentNode;)1===k.nodeType&&w.push({element:k,left:k.scrollLeft,top:k.scrollTop});for("function"==typeof y.focus&&y.focus(),y=0;y<w.length;y++)(k=w[y]).element.scrollLeft=k.left,k.element.scrollTop=k.top}Wt=!!zr,Ur=zr=null,e.current=n,Ks=r;do{try{for(y=e;null!==Ks;){var E=Ks.flags;if(36&E&&bs(y,Ks.alternate,Ks),128&E){w=void 0;var S=Ks.ref;if(null!==S){var x=Ks.stateNode;Ks.tag,w=x,"function"==typeof S?S(w):S.current=w}}Ks=Ks.nextEffect}}catch(C){if(null===Ks)throw Error(i(330));zl(Ks,C),Ks=Ks.nextEffect}}while(null!==Ks);Ks=null,ja(),Rs=a}else e.current=n;if(Js)Js=!1,el=e,tl=t;else for(Ks=r;null!==Ks;)t=Ks.nextEffect,Ks.nextEffect=null,8&Ks.flags&&((E=Ks).sibling=null,E.stateNode=null),Ks=t;if(0===(r=e.pendingLanes)&&(Xs=null),1===r?e===il?ol++:(ol=0,il=e):ol=0,n=n.stateNode,Ea&&"function"==typeof Ea.onCommitFiberRoot)try{Ea.onCommitFiberRoot(_a,n,void 0,64==(64&n.current.flags))}catch(C){}if(hl(e,$a()),Ys)throw Ys=!1,e=Qs,Qs=null,e;return 0!=(8&Rs)||Va(),null}function Il(){for(;null!==Ks;){var e=Ks.alternate;dl||null===ul||(0!=(8&Ks.flags)?Je(Ks,ul)&&(dl=!0):13===Ks.tag&&Ls(e,Ks)&&Je(Ks,ul)&&(dl=!0));var t=Ks.flags;0!=(256&t)&&hs(e,Ks),0==(512&t)||Js||(Js=!0,Za(97,(function(){return Dl(),null}))),Ks=Ks.nextEffect}}function Dl(){if(90!==tl){var e=97<tl?97:tl;return tl=90,Ga(e,Fl)}return!1}function Ml(e,t){nl.push(t,e),Js||(Js=!0,Za(97,(function(){return Dl(),null})))}function jl(e,t){rl.push(t,e),Js||(Js=!0,Za(97,(function(){return Dl(),null})))}function Fl(){if(null===el)return!1;var e=el;if(el=null,0!=(48&Rs))throw Error(i(331));var t=Rs;Rs|=32;var n=rl;rl=[];for(var r=0;r<n.length;r+=2){var a=n[r],o=n[r+1],s=a.destroy;if(a.destroy=void 0,"function"==typeof s)try{s()}catch(c){if(null===o)throw Error(i(330));zl(o,c)}}for(n=nl,nl=[],r=0;r<n.length;r+=2){a=n[r],o=n[r+1];try{var l=a.create;a.destroy=l()}catch(c){if(null===o)throw Error(i(330));zl(o,c)}}for(l=e.current.firstEffect;null!==l;)e=l.nextEffect,l.nextEffect=null,8&l.flags&&(l.sibling=null,l.stateNode=null),l=e;return Rs=t,Va(),!0}function Bl(e,t,n){uo(e,t=fs(0,t=cs(n,t),1)),t=fl(),null!==(e=ml(e,1))&&($t(e,1,t),hl(e,t))}function zl(e,t){if(3===e.tag)Bl(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){Bl(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Xs||!Xs.has(r))){var a=ps(n,e=cs(t,e),1);if(uo(n,a),a=fl(),null!==(n=ml(n,1)))$t(n,1,a),hl(n,a);else if("function"==typeof r.componentDidCatch&&(null===Xs||!Xs.has(r)))try{r.componentDidCatch(t,e)}catch(o){}break}}n=n.return}}function Ul(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=fl(),e.pingedLanes|=e.suspendedLanes&n,Ps===e&&(Ds&n)===n&&(4===Fs||3===Fs&&(62914560&Ds)===Ds&&500>$a()-Gs?Sl(e,0):qs|=n),hl(e,t)}function $l(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(0==(2&(t=e.mode))?t=1:0==(4&t)?t=99===qa()?1:2:(0===ll&&(ll=zs),0===(t=zt(62914560&~ll))&&(t=4194304))),n=fl(),null!==(e=ml(e,t))&&($t(e,t,n),hl(e,n))}function ql(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.flags=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childLanes=this.lanes=0,this.alternate=null}function Hl(e,t,n,r){return new ql(e,t,n,r)}function Gl(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Zl(e,t){var n=e.alternate;return null===n?((n=Hl(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Vl(e,t,n,r,a,o){var s=2;if(r=e,"function"==typeof e)Gl(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case S:return Wl(n.children,a,o,t);case M:s=8,a|=16;break;case x:s=8,a|=1;break;case C:return(e=Hl(12,n,t,8|a)).elementType=C,e.type=C,e.lanes=o,e;case O:return(e=Hl(13,n,t,a)).type=O,e.elementType=O,e.lanes=o,e;case N:return(e=Hl(19,n,t,a)).elementType=N,e.lanes=o,e;case j:return Kl(n,a,o,t);case F:return(e=Hl(24,n,t,a)).elementType=F,e.lanes=o,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case T:s=10;break e;case L:s=9;break e;case A:s=11;break e;case R:s=14;break e;case P:s=16,r=null;break e;case I:s=22;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Hl(s,n,t,a)).elementType=e,t.type=r,t.lanes=o,t}function Wl(e,t,n,r){return(e=Hl(7,e,r,t)).lanes=n,e}function Kl(e,t,n,r){return(e=Hl(23,e,r,t)).elementType=j,e.lanes=n,e}function Yl(e,t,n){return(e=Hl(6,e,null,t)).lanes=n,e}function Ql(e,t,n){return(t=Hl(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Xl(e,t,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=0,this.eventTimes=Ut(0),this.expirationTimes=Ut(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ut(0),this.mutableSourceEagerHydrationData=null}function Jl(e,t,n,r){var a=t.current,o=fl(),s=pl(a);e:if(n){t:{if(Ke(n=n._reactInternals)!==n||1!==n.tag)throw Error(i(170));var l=n;do{switch(l.tag){case 3:l=l.stateNode.context;break t;case 1:if(ha(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break t}}l=l.return}while(null!==l);throw Error(i(171))}if(1===n.tag){var c=n.type;if(ha(c)){n=ya(n,c,l);break e}}n=l}else n=da;return null===t.context?t.context=n:t.pendingContext=n,(t=co(o,s)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),uo(a,t),gl(a,s,o),s}function ec(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function tc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function nc(e,t){tc(e,t),(e=e.alternate)&&tc(e,t)}function rc(e,t,n){var r=null!=n&&null!=n.hydrationOptions&&n.hydrationOptions.mutableSources||null;if(n=new Xl(e,t,null!=n&&!0===n.hydrate),t=Hl(3,null,null,2===t?7:1===t?3:0),n.current=t,t.stateNode=n,so(t),e[Jr]=n.current,Nr(8===e.nodeType?e.parentNode:e),r)for(e=0;e<r.length;e++){var a=(t=r[e])._getVersion;a=a(t._source),null==n.mutableSourceEagerHydrationData?n.mutableSourceEagerHydrationData=[t,a]:n.mutableSourceEagerHydrationData.push(t,a)}this._internalRoot=n}function ac(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function oc(e,t,n,r,a){var o=n._reactRootContainer;if(o){var i=o._internalRoot;if("function"==typeof a){var s=a;a=function(){var e=ec(i);s.call(e)}}Jl(t,i,e,a)}else{if(o=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new rc(e,0,t?{hydrate:!0}:void 0)}(n,r),i=o._internalRoot,"function"==typeof a){var l=a;a=function(){var e=ec(i);l.call(e)}}kl((function(){Jl(t,i,e,a)}))}return ec(i)}function ic(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!ac(t))throw Error(i(200));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:E,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}Ws=function(e,t,n){var r=t.lanes;if(null!==e)if(e.memoizedProps!==t.pendingProps||pa.current)Mi=!0;else{if(0==(n&r)){switch(Mi=!1,t.tag){case 3:Zi(t),Vo();break;case 5:Do(t);break;case 1:ha(t.type)&&wa(t);break;case 4:Po(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value;var a=t.type._context;ua(Qa,a._currentValue),a._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!=(n&t.child.childLanes)?Xi(e,t,n):(ua(jo,1&jo.current),null!==(t=os(e,t,n))?t.sibling:null);ua(jo,1&jo.current);break;case 19:if(r=0!=(n&t.childLanes),0!=(64&e.flags)){if(r)return as(e,t,n);t.flags|=64}if(null!==(a=t.memoizedState)&&(a.rendering=null,a.tail=null,a.lastEffect=null),ua(jo,jo.current),r)break;return null;case 23:case 24:return t.lanes=0,Ui(e,t,n)}return os(e,t,n)}Mi=0!=(16384&e.flags)}else Mi=!1;switch(t.lanes=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=ma(t,fa.current),ao(t,n),a=ii(null,t,r,e,a,n),t.flags|=1,"object"==typeof a&&null!==a&&"function"==typeof a.render&&void 0===a.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,ha(r)){var o=!0;wa(t)}else o=!1;t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,so(t);var s=r.getDerivedStateFromProps;"function"==typeof s&&ho(t,r,s,e),a.updater=bo,t.stateNode=a,a._reactInternals=t,ko(t,r,e,n),t=Gi(null,t,r,!0,o,n)}else t.tag=0,ji(null,t,a,n),t=t.child;return t;case 16:a=t.elementType;e:{switch(null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),e=t.pendingProps,a=(o=a._init)(a._payload),t.type=a,o=t.tag=function(e){if("function"==typeof e)return Gl(e)?1:0;if(null!=e){if((e=e.$$typeof)===A)return 11;if(e===R)return 14}return 2}(a),e=Ya(a,e),o){case 0:t=qi(null,t,a,e,n);break e;case 1:t=Hi(null,t,a,e,n);break e;case 11:t=Fi(null,t,a,e,n);break e;case 14:t=Bi(null,t,a,Ya(a.type,e),r,n);break e}throw Error(i(306,a,""))}return t;case 0:return r=t.type,a=t.pendingProps,qi(e,t,r,a=t.elementType===r?a:Ya(r,a),n);case 1:return r=t.type,a=t.pendingProps,Hi(e,t,r,a=t.elementType===r?a:Ya(r,a),n);case 3:if(Zi(t),r=t.updateQueue,null===e||null===r)throw Error(i(282));if(r=t.pendingProps,a=null!==(a=t.memoizedState)?a.element:null,lo(e,t),po(t,r,null,n),(r=t.memoizedState.element)===a)Vo(),t=os(e,t,n);else{if((o=(a=t.stateNode).hydrate)&&(zo=Vr(t.stateNode.containerInfo.firstChild),Bo=t,o=Uo=!0),o){if(null!=(e=a.mutableSourceEagerHydrationData))for(a=0;a<e.length;a+=2)(o=e[a])._workInProgressVersionPrimary=e[a+1],Wo.push(o);for(n=To(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|1024,n=n.sibling}else ji(e,t,r,n),Vo();t=t.child}return t;case 5:return Do(t),null===e&&Ho(t),r=t.type,a=t.pendingProps,o=null!==e?e.memoizedProps:null,s=a.children,qr(r,a)?s=null:null!==o&&qr(r,o)&&(t.flags|=16),$i(e,t),ji(e,t,s,n),t.child;case 6:return null===e&&Ho(t),null;case 13:return Xi(e,t,n);case 4:return Po(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Co(t,null,r,n):ji(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,Fi(e,t,r,a=t.elementType===r?a:Ya(r,a),n);case 7:return ji(e,t,t.pendingProps,n),t.child;case 8:case 12:return ji(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,a=t.pendingProps,s=t.memoizedProps,o=a.value;var l=t.type._context;if(ua(Qa,l._currentValue),l._currentValue=o,null!==s)if(l=s.value,0===(o=cr(l,o)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(l,o):1073741823))){if(s.children===a.children&&!pa.current){t=os(e,t,n);break e}}else for(null!==(l=t.child)&&(l.return=t);null!==l;){var c=l.dependencies;if(null!==c){s=l.child;for(var u=c.firstContext;null!==u;){if(u.context===r&&0!=(u.observedBits&o)){1===l.tag&&((u=co(-1,n&-n)).tag=2,uo(l,u)),l.lanes|=n,null!==(u=l.alternate)&&(u.lanes|=n),ro(l.return,n),c.lanes|=n;break}u=u.next}}else s=10===l.tag&&l.type===t.type?null:l.child;if(null!==s)s.return=l;else for(s=l;null!==s;){if(s===t){s=null;break}if(null!==(l=s.sibling)){l.return=s.return,s=l;break}s=s.return}l=s}ji(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=(o=t.pendingProps).children,ao(t,n),r=r(a=oo(a,o.unstable_observedBits)),t.flags|=1,ji(e,t,r,n),t.child;case 14:return o=Ya(a=t.type,t.pendingProps),Bi(e,t,a,o=Ya(a.type,o),r,n);case 15:return zi(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:Ya(r,a),null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2),t.tag=1,ha(r)?(e=!0,wa(t)):e=!1,ao(t,n),yo(t,r,a),ko(t,r,a,n),Gi(null,t,r,!0,e,n);case 19:return as(e,t,n);case 23:case 24:return Ui(e,t,n)}throw Error(i(156,t.tag))},rc.prototype.render=function(e){Jl(e,this._internalRoot,null,null)},rc.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Jl(null,e,null,(function(){t[Jr]=null}))},et=function(e){13===e.tag&&(gl(e,4,fl()),nc(e,4))},tt=function(e){13===e.tag&&(gl(e,67108864,fl()),nc(e,67108864))},nt=function(e){if(13===e.tag){var t=fl(),n=pl(e);gl(e,n,t),nc(e,n)}},rt=function(e,t){return t()},Ce=function(e,t,n){switch(t){case"input":if(ne(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var a=aa(r);if(!a)throw Error(i(90));Q(r),ne(r,a)}}}break;case"textarea":ce(e,n);break;case"select":null!=(t=n.value)&&ie(e,!!n.multiple,t,!1)}},Re=wl,Pe=function(e,t,n,r,a){var o=Rs;Rs|=4;try{return Ga(98,e.bind(null,t,n,r,a))}finally{0===(Rs=o)&&(Vs(),Va())}},Ie=function(){0==(49&Rs)&&(function(){if(null!==al){var e=al;al=null,e.forEach((function(e){e.expiredLanes|=24&e.pendingLanes,hl(e,$a())}))}Va()}(),Dl())},De=function(e,t){var n=Rs;Rs|=2;try{return e(t)}finally{0===(Rs=n)&&(Vs(),Va())}};var sc={Events:[na,ra,aa,Oe,Ne,Dl,{current:!1}]},lc={findFiberByHostInstance:ta,bundleType:0,version:"17.0.2",rendererPackageName:"react-dom"},cc={bundleType:lc.bundleType,version:lc.version,rendererPackageName:lc.rendererPackageName,rendererConfig:lc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:k.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Xe(e))?null:e.stateNode},findFiberByHostInstance:lc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var uc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!uc.isDisabled&&uc.supportsFiber)try{_a=uc.inject(cc),Ea=uc}catch(me){}}t.createPortal=ic,t.hydrate=function(e,t,n){if(!ac(t))throw Error(i(200));return oc(null,e,t,!0,n)}},3935:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(4448)},9590:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function o(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!o(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!o(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!o(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return o(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},405:(e,t,n)=>{"use strict";n.d(t,{B6:()=>G,ql:()=>J});var r=n(7294),a=n(5697),o=n.n(a),i=n(9590),s=n.n(i),l=n(1143),c=n.n(l),u=n(6774),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(this,arguments)}function p(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,g(e,t)}function g(e,t){return g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},g(e,t)}function m(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(a[n]=e[n]);return a}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(h).map((function(e){return h[e]})),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},_=Object.keys(k).reduce((function(e,t){return e[k[t]]=t,e}),{}),E=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},S=function(e){var t=E(e,h.TITLE),n=E(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=E(e,"defaultTitle");return t||r||void 0},x=function(e){return E(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},T=function(e,t){return t.filter((function(e){return void 0!==e[h.BASE]})).map((function(e){return e[h.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a<r.length;a+=1){var o=r[a].toLowerCase();if(-1!==e.indexOf(o)&&n[o])return t.concat(n)}return t}),[])},L=function(e,t,n){var r={};return n.filter((function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)})).map((function(t){return t[e]})).reverse().reduce((function(e,n){var a={};n.filter((function(e){for(var n,o=Object.keys(e),i=0;i<o.length;i+=1){var s=o[i],l=s.toLowerCase();-1===t.indexOf(l)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===l&&"stylesheet"===e[l].toLowerCase()||(n=l),-1===t.indexOf(s)||"innerHTML"!==s&&"cssText"!==s&&"itemprop"!==s||(n=s)}if(!n||!e[n])return!1;var c=e[n].toLowerCase();return r[n]||(r[n]={}),a[n]||(a[n]={}),!r[n][c]&&(a[n][c]=!0,!0)})).reverse().forEach((function(t){return e.push(t)}));for(var o=Object.keys(a),i=0;i<o.length;i+=1){var s=o[i],l=f({},r[s],a[s]);r[s]=l}return e}),[]).reverse()},A=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},O=function(e){return Array.isArray(e)?e.join(""):e},N=function(e,t){return Array.isArray(e)?e.reduce((function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e}),{priority:[],default:[]}):{default:e}},R=function(e,t){var n;return f({},e,((n={})[t]=void 0,n))},P=[h.NOSCRIPT,h.SCRIPT,h.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},M=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[k[n]||n]=e[n],t}),t)},j=function(e,t){return t.map((function(t,n){var a,o=((a={key:n})["data-rh"]=!0,a);return Object.keys(t).forEach((function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?o.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:o[n]=t[e]})),r.createElement(e,o)}))},F=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(a={key:e=t.title})["data-rh"]=!0,o=M(n,a),[r.createElement(h.TITLE,o,e)];var e,n,a,o},toString:function(){return function(e,t,n,r){var a=D(n),o=O(t);return a?"<"+e+' data-rh="true" '+a+">"+I(o,r)+"</"+e+">":"<"+e+' data-rh="true">'+I(o,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return M(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return j(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+I(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===P.indexOf(e);return t+"<"+e+' data-rh="true" '+a+(i?"/>":">"+o+"</"+e+">")}),"")}(e,t,n)}}}},B=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var g=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,a=N(e.metaTags,y),o=N(t,b),i=N(n,v);return{priorityMethods:{toComponent:function(){return[].concat(j(h.META,a.priority),j(h.LINK,o.priority),j(h.SCRIPT,i.priority))},toString:function(){return F(h.META,a.priority,r)+" "+F(h.LINK,o.priority,r)+" "+F(h.SCRIPT,i.priority,r)}},metaTags:a.default,linkTags:o.default,scriptTags:i.default}}(e);p=g.priorityMethods,u=g.linkTags,d=g.metaTags,f=g.scriptTags}return{priority:p,base:F(h.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",a,r),link:F(h.LINK,u,r),meta:F(h.META,d,r),noscript:F(h.NOSCRIPT,o,r),script:F(h.SCRIPT,f,r),style:F(h.STYLE,i,r),title:F(h.TITLE,{title:l,titleAttributes:c},r)}},z=[],U=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=B({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},$=r.createContext({}),q=o().shape({setHelmet:o().func,helmetInstances:o().shape({get:o().func,add:o().func,remove:o().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new U(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement($.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=H,G.propTypes={context:o().shape({helmet:o().shape()}),children:o().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var Z=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),a=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(a),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&("innerHTML"===a?r.innerHTML=t.innerHTML:"cssText"===a?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(a,void 0===t[a]?"":t[a]));r.setAttribute("data-rh","true"),o.some((function(e,t){return n=t,r.isEqualNode(e)}))?o.splice(n,1):i.push(r)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:o,newTags:i}},V=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),s=0;s<i.length;s+=1){var l=i[s],c=t[l]||"";n.getAttribute(l)!==c&&n.setAttribute(l,c),-1===a.indexOf(l)&&a.push(l);var u=o.indexOf(l);-1!==u&&o.splice(u,1)}for(var d=o.length-1;d>=0;d-=1)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},W=function(e,t){var n=e.baseTag,r=e.htmlAttributes,a=e.linkTags,o=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;V(h.BODY,e.bodyAttributes),V(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=O(e)),V(h.TITLE,t)}(u,d);var f={baseTag:Z(h.BASE,n),linkTags:Z(h.LINK,a),metaTags:Z(h.META,o),noscriptTags:Z(h.NOSCRIPT,i),scriptTags:Z(h.SCRIPT,l),styleTags:Z(h.STYLE,c)},p={},g={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(g[e]=f[e].oldTags)})),t&&t(),s(e,p,g)},K=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,a=null,o=(e=n.helmetInstances.get().map((function(e){var t=f({},e.props);return delete t.context,t})),{baseTag:T(["href"],e),bodyAttributes:C("bodyAttributes",e),defer:E(e,"defer"),encode:E(e,"encodeSpecialCharacters"),htmlAttributes:C("htmlAttributes",e),linkTags:L(h.LINK,["rel","href"],e),metaTags:L(h.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:L(h.NOSCRIPT,["innerHTML"],e),onChangeClientState:x(e),scriptTags:L(h.SCRIPT,["src","innerHTML"],e),styleTags:L(h.STYLE,["cssText"],e),title:S(e),titleAttributes:C("titleAttributes",e),prioritizeSeoTags:A(e,"prioritizeSeoTags")});G.canUseDOM?(t=o,K&&cancelAnimationFrame(K),t.defer?K=requestAnimationFrame((function(){W(t,(function(){K=null}))})):(W(t),K=null)):B&&(a=B(o)),r(a)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Y.propTypes={context:q.isRequired},Y.displayName="HelmetDispatcher";var Q=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}p(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!s()(R(this.props,"helmetData"),R(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case h.SCRIPT:case h.NOSCRIPT:return{innerHTML:t};case h.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return f({},a,((t={})[r.type]=i,t.titleAttributes=f({},o),t));case h.BODY:return f({},a,{bodyAttributes:f({},o)});case h.HTML:return f({},a,{htmlAttributes:f({},o)});default:return f({},a,((n={})[r.type]=f({},o),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,a={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,i=m(r,Q),s=Object.keys(i).reduce((function(e,t){return e[_[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,o),l){case h.FRAGMENT:t=n.mapChildrenToProps(o,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:a=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:a,newChildProps:s,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:o})}}})),this.mapArrayTypeChildrenToProps(a,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),a=f({},n),o=n.helmetData;return t&&(a=this.mapChildrenToProps(t,a)),!o||o instanceof U||(o=new U(o.context,o.instances)),o?r.createElement(Y,f({},a,{context:o.value,helmetData:void 0})):r.createElement($.Consumer,null,(function(e){return r.createElement(Y,f({},a,{context:e}))}))},t}(r.Component);J.propTypes={base:o().object,bodyAttributes:o().object,children:o().oneOfType([o().arrayOf(o().node),o().node]),defaultTitle:o().string,defer:o().bool,encodeSpecialCharacters:o().bool,htmlAttributes:o().object,link:o().arrayOf(o().object),meta:o().arrayOf(o().object),noscript:o().arrayOf(o().object),onChangeClientState:o().func,script:o().arrayOf(o().object),style:o().arrayOf(o().object),title:o().string,titleAttributes:o().object,titleTemplate:o().string,prioritizeSeoTags:o().bool,helmetData:o().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},9921:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,a=n?Symbol.for("react.portal"):60106,o=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,g=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,h=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,v=n?Symbol.for("react.fundamental"):60117,y=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case o:case s:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case h:case m:case l:return e;default:return t}}case a:return t}}}function _(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=f,t.Fragment=o,t.Lazy=h,t.Memo=m,t.Portal=a,t.Profiler=s,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return _(e)||k(e)===u},t.isConcurrentMode=_,t.isContextConsumer=function(e){return k(e)===c},t.isContextProvider=function(e){return k(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===f},t.isFragment=function(e){return k(e)===o},t.isLazy=function(e){return k(e)===h},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===a},t.isProfiler=function(e){return k(e)===s},t.isStrictMode=function(e){return k(e)===i},t.isSuspense=function(e){return k(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===o||e===d||e===s||e===i||e===p||e===g||"object"==typeof e&&null!==e&&(e.$$typeof===h||e.$$typeof===m||e.$$typeof===l||e.$$typeof===c||e.$$typeof===f||e.$$typeof===v||e.$$typeof===y||e.$$typeof===w||e.$$typeof===b)},t.typeOf=k},9864:(e,t,n)=>{"use strict";e.exports=n(9921)},8356:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i.apply(this,arguments)}var s=n(7294),l=n(5697),c=[],u=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var a=d(e[r]);a.loading?t.loading=!0:(t.loaded[r]=a.loaded,t.error=a.error),n.push(a.promise),a.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return s.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function g(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var g=i({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),m=null;function h(){return m||(m=e(g.loader)),m.promise}return c.push(h),"function"==typeof g.webpack&&u.push((function(){if((0,g.webpack)().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return h()})),f=d=function(t){function n(n){var r;return o(a(a(r=t.call(this,n)||this)),"retry",(function(){r.setState({error:null,loading:!0,timedOut:!1}),m=e(g.loader),r._loadModule()})),h(),r.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},r}r(n,t),n.preload=function(){return h()};var i=n.prototype;return i.UNSAFE_componentWillMount=function(){this._loadModule()},i.componentDidMount=function(){this._mounted=!0},i._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(g.modules)&&g.modules.forEach((function(t){e.context.loadable.report(t)})),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof g.delay&&(0===g.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){t({pastDelay:!0})}),g.delay)),"number"==typeof g.timeout&&(this._timeout=setTimeout((function(){t({timedOut:!0})}),g.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then((function(){return n(),null})).catch((function(e){return n(),null}))}},i.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},i._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},i.render=function(){return this.state.loading||this.state.error?s.createElement(g.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?g.render(this.state.loaded,this.props):null},n}(s.Component),o(d,"contextTypes",{loadable:l.shape({report:l.func.isRequired})}),f}function m(e){return g(d,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return g(f,e)};var h=function(e){function t(){return e.apply(this,arguments)||this}r(t,e);var n=t.prototype;return n.getChildContext=function(){return{loadable:{report:this.props.report}}},n.render=function(){return s.Children.only(this.props.children)},t}(s.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}o(h,"propTypes",{report:l.func.isRequired}),o(h,"childContextTypes",{loadable:l.shape({report:l.func.isRequired}).isRequired}),m.Capture=h,m.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},m.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=m},8790:(e,t,n)=>{"use strict";n.d(t,{H:()=>s,f:()=>i});var r=n(6550),a=n(7462),o=n(7294);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var a=e.path?(0,r.LX)(t,e):n.length?n[n.length-1].match:r.F0.computeRootMatch(t);return a&&(n.push({route:e,match:a}),e.routes&&i(e.routes,t,n)),a})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?o.createElement(r.rs,n,e.map((function(e,n){return o.createElement(r.AW,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,a.Z)({},n,{},t,{route:e})):o.createElement(e.component,(0,a.Z)({},n,t,{route:e}))}})}))):null}},3727:(e,t,n)=>{"use strict";n.d(t,{OL:()=>y,VK:()=>u,rU:()=>h});var r=n(6550),a=n(5068),o=n(7294),i=n(9318),s=n(7462),l=n(3366),c=n(8776),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,i.lX)(t.props),t}return(0,a.Z)(t,e),t.prototype.render=function(){return o.createElement(r.F0,{history:this.history,children:this.props.children})},t}(o.Component);o.Component;var d=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,i.ob)(e,null,null,t):e},p=function(e){return e},g=o.forwardRef;void 0===g&&(g=p);var m=g((function(e,t){var n=e.innerRef,r=e.navigate,a=e.onClick,i=(0,l.Z)(e,["innerRef","navigate","onClick"]),c=i.target,u=(0,s.Z)({},i,{onClick:function(e){try{a&&a(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||c&&"_self"!==c||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=p!==g&&t||n,o.createElement("a",u)}));var h=g((function(e,t){var n=e.component,a=void 0===n?m:n,u=e.replace,h=e.to,b=e.innerRef,v=(0,l.Z)(e,["component","replace","to","innerRef"]);return o.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=e.history,r=f(d(h,e.location),e.location),l=r?n.createHref(r):"",m=(0,s.Z)({},v,{href:l,navigate:function(){var t=d(h,e.location),r=(0,i.Ep)(e.location)===(0,i.Ep)(f(t));(u||r?n.replace:n.push)(t)}});return p!==g?m.ref=t||b:m.innerRef=b,o.createElement(a,m)}))})),b=function(e){return e},v=o.forwardRef;void 0===v&&(v=b);var y=v((function(e,t){var n=e["aria-current"],a=void 0===n?"page":n,i=e.activeClassName,u=void 0===i?"active":i,p=e.activeStyle,g=e.className,m=e.exact,y=e.isActive,w=e.location,k=e.sensitive,_=e.strict,E=e.style,S=e.to,x=e.innerRef,C=(0,l.Z)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return o.createElement(r.s6.Consumer,null,(function(e){e||(0,c.Z)(!1);var n=w||e.location,i=f(d(S,n),n),l=i.pathname,T=l&&l.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),L=T?(0,r.LX)(n.pathname,{path:T,exact:m,sensitive:k,strict:_}):null,A=!!(y?y(L,n):L),O="function"==typeof g?g(A):g,N="function"==typeof E?E(A):E;A&&(O=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter((function(e){return e})).join(" ")}(O,u),N=(0,s.Z)({},N,p));var R=(0,s.Z)({"aria-current":A&&a||null,className:O,style:N,to:i},C);return b!==v?R.ref=t||x:R.innerRef=x,o.createElement(h,R)}))}))},6550:(e,t,n)=>{"use strict";n.d(t,{AW:()=>S,F0:()=>y,LX:()=>E,TH:()=>P,k6:()=>R,rs:()=>O,s6:()=>v});var r=n(5068),a=n(7294),o=n(5697),i=n.n(o),s=n(9318),l=n(8776),c=n(7462),u=n(9658),d=n.n(u),f=(n(9864),n(3366)),p=(n(8679),1073741823),g="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=a.createContext||function(e,t){var n,o,s="__create-react-context-"+function(){var e="__global_unique_id__";return g[e]=(g[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return(t=e.call.apply(e,[this].concat(o))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter((function(t){return t!==e}))},get:function(){return n},set:function(e,t){n=e,r.forEach((function(e){return e(n,t)}))}}),t}(0,r.Z)(n,e);var a=n.prototype;return a.getChildContext=function(){var e;return(e={})[s]=this.emitter,e},a.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,a=e.value;((o=r)===(i=a)?0!==o||1/o==1/i:o!=o&&i!=i)?n=0:(n="function"==typeof t?t(r,a):p,0!==(n|=0)&&this.emitter.set(e.value,n))}var o,i},a.render=function(){return this.props.children},n}(a.Component);l.childContextTypes=((n={})[s]=i().object.isRequired,n);var c=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),a=0;a<n;a++)r[a]=arguments[a];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,r.Z)(n,t);var a=n.prototype;return a.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?p:t},a.componentDidMount=function(){this.context[s]&&this.context[s].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?p:e},a.componentWillUnmount=function(){this.context[s]&&this.context[s].off(this.onUpdate)},a.getValue=function(){return this.context[s]?this.context[s].get():e},a.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(a.Component);return c.contextTypes=((o={})[s]=i().object,o),{Provider:l,Consumer:c}},h=function(e){var t=m();return t.displayName=e,t},b=h("Router-History"),v=h("Router"),y=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._pendingLocation=e}))),n}(0,r.Z)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen((function(t){e._isMounted&&e.setState({location:t})}))),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return a.createElement(v.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.Component);a.Component;a.Component;var w={},k=1e4,_=0;function E(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,a=n.exact,o=void 0!==a&&a,i=n.strict,s=void 0!==i&&i,l=n.sensitive,c=void 0!==l&&l;return[].concat(r).reduce((function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=w[n]||(w[n]={});if(r[e])return r[e];var a=[],o={regexp:d()(e,a,t),keys:a};return _<k&&(r[e]=o,_++),o}(n,{end:o,strict:s,sensitive:c}),a=r.regexp,i=r.keys,l=a.exec(e);if(!l)return null;var u=l[0],f=l.slice(1),p=e===u;return o&&!p?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:p,params:i.reduce((function(e,t,n){return e[t.name]=f[n],e}),{})}}),null)}var S=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(v.Consumer,null,(function(t){t||(0,l.Z)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?E(n.pathname,e.props):t.match,o=(0,c.Z)({},t,{location:n,match:r}),i=e.props,s=i.children,u=i.component,d=i.render;return Array.isArray(s)&&function(e){return 0===a.Children.count(e)}(s)&&(s=null),a.createElement(v.Provider,{value:o},o.match?s?"function"==typeof s?s(o):s:u?a.createElement(u,o):d?d(o):null:"function"==typeof s?s(o):null)}))},t}(a.Component);function x(e){return"/"===e.charAt(0)?e:"/"+e}function C(e,t){if(!e)return t;var n=x(e);return 0!==t.pathname.indexOf(n)?t:(0,c.Z)({},t,{pathname:t.pathname.substr(n.length)})}function T(e){return"string"==typeof e?e:(0,s.Ep)(e)}function L(e){return function(){(0,l.Z)(!1)}}function A(){}a.Component;var O=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.Z)(t,e),t.prototype.render=function(){var e=this;return a.createElement(v.Consumer,null,(function(t){t||(0,l.Z)(!1);var n,r,o=e.props.location||t.location;return a.Children.forEach(e.props.children,(function(e){if(null==r&&a.isValidElement(e)){n=e;var i=e.props.path||e.props.from;r=i?E(o.pathname,(0,c.Z)({},e.props,{path:i})):t.match}})),r?a.cloneElement(n,{location:o,computedMatch:r}):null}))},t}(a.Component);var N=a.useContext;function R(){return N(b)}function P(){return N(v).location}},9658:(e,t,n)=>{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return s(o(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(s+=e.slice(i,p),i=p+d.length,f)s+=f[1];else{var g=e[i],m=n[2],h=n[3],b=n[4],v=n[5],y=n[6],w=n[7];s&&(r.push(s),s="");var k=null!=m&&null!=g&&g!==m,_="+"===y||"*"===y,E="?"===y||"*"===y,S=n[2]||u,x=b||v;r.push({name:h||o++,prefix:m||"",delimiter:S,optional:E,repeat:_,partial:k,asterisk:!!w,pattern:x?c(x):w?".*":"[^"+l(S)+"]+?"})}}return i<e.length&&(s+=e.substr(i)),s&&r.push(s),r}function i(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function s(e,t){for(var n=new Array(e.length),a=0;a<e.length;a++)"object"==typeof e[a]&&(n[a]=new RegExp("^(?:"+e[a].pattern+")$",d(t)));return function(t,a){for(var o="",s=t||{},l=(a||{}).pretty?i:encodeURIComponent,c=0;c<e.length;c++){var u=e[c];if("string"!=typeof u){var d,f=s[u.name];if(null==f){if(u.optional){u.partial&&(o+=u.prefix);continue}throw new TypeError('Expected "'+u.name+'" to be defined')}if(r(f)){if(!u.repeat)throw new TypeError('Expected "'+u.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(u.optional)continue;throw new TypeError('Expected "'+u.name+'" to not be empty')}for(var p=0;p<f.length;p++){if(d=l(f[p]),!n[c].test(d))throw new TypeError('Expected all "'+u.name+'" to match "'+u.pattern+'", but received `'+JSON.stringify(d)+"`");o+=(0===p?u.prefix:u.delimiter)+d}}else{if(d=u.asterisk?encodeURI(f).replace(/[?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})):l(f),!n[c].test(d))throw new TypeError('Expected "'+u.name+'" to match "'+u.pattern+'", but received "'+d+'"');o+=u.prefix+d}}else o+=u}return o}}function l(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function c(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function u(e,t){return e.keys=t,e}function d(e){return e&&e.sensitive?"":"i"}function f(e,t,n){r(t)||(n=t||n,t=[]);for(var a=(n=n||{}).strict,o=!1!==n.end,i="",s=0;s<e.length;s++){var c=e[s];if("string"==typeof c)i+=l(c);else{var f=l(c.prefix),p="(?:"+c.pattern+")";t.push(c),c.repeat&&(p+="(?:"+f+p+")*"),i+=p=c.optional?c.partial?f+"("+p+")?":"(?:"+f+"("+p+"))?":f+"("+p+")"}}var g=l(n.delimiter||"/"),m=i.slice(-g.length)===g;return a||(i=(m?i.slice(0,-g.length):i)+"(?:"+g+"(?=$))?"),i+=o?"$":a&&m?"":"(?="+g+"|$)",u(new RegExp("^"+i,d(n)),t)}function p(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return u(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],a=0;a<e.length;a++)r.push(p(e[a],t,n).source);return u(new RegExp("(?:"+r.join("|")+")",d(n)),t)}(e,t,n):function(e,t,n){return f(o(e,n),t,n)}(e,t,n)}},2408:(e,t,n)=>{"use strict";var r=n(7418),a=60103,o=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,s=60110,l=60112;t.Suspense=60113;var c=60115,u=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;a=d("react.element"),o=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),s=d("react.context"),l=d("react.forward_ref"),t.Suspense=d("react.suspense"),c=d("react.memo"),u=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m={};function h(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n||g}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=h.prototype;var y=v.prototype=new b;y.constructor=v,r(y,h.prototype),y.isPureReactComponent=!0;var w={current:null},k=Object.prototype.hasOwnProperty,_={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,n){var r,o={},i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,r)&&!_.hasOwnProperty(r)&&(o[r]=t[r]);var l=arguments.length-2;if(1===l)o.children=n;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(r in l=e.defaultProps)void 0===o[r]&&(o[r]=l[r]);return{$$typeof:a,type:e,key:i,ref:s,props:o,_owner:w.current}}function S(e){return"object"==typeof e&&null!==e&&e.$$typeof===a}var x=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function T(e,t,n,r,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l=!1;if(null===e)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case a:case o:l=!0}}if(l)return i=i(l=e),e=""===r?"."+C(l,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(x,"$&/")+"/"),T(i,t,n,"",(function(e){return e}))):null!=i&&(S(i)&&(i=function(e,t){return{$$typeof:a,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||l&&l.key===i.key?"":(""+i.key).replace(x,"$&/")+"/")+e)),t.push(i)),1;if(l=0,r=""===r?".":r+":",Array.isArray(e))for(var c=0;c<e.length;c++){var u=r+C(s=e[c],c);l+=T(s,t,n,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(s=e.next()).done;)l+=T(s=s.value,t,n,u=r+C(s,c++),i);else if("object"===s)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return l}function L(e,t,n){if(null==e)return e;var r=[],a=0;return T(e,r,"","",(function(e){return t.call(n,e,a++)})),r}function A(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var O={current:null};function N(){var e=O.current;if(null===e)throw Error(p(321));return e}var R={ReactCurrentDispatcher:O,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:w,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:L,forEach:function(e,t,n){L(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return L(e,(function(){t++})),t},toArray:function(e){return L(e,(function(e){return e}))||[]},only:function(e){if(!S(e))throw Error(p(143));return e}},t.Component=h,t.PureComponent=v,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=R,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var o=r({},e.props),i=e.key,s=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,l=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)k.call(t,u)&&!_.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){c=Array(u);for(var d=0;d<u;d++)c[d]=arguments[d+2];o.children=c}return{$$typeof:a,type:e.type,key:i,ref:s,props:o,_owner:l}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:s,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=E,t.createFactory=function(e){var t=E.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=S,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:A}},t.memo=function(e,t){return{$$typeof:c,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return N().useCallback(e,t)},t.useContext=function(e,t){return N().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return N().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return N().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return N().useLayoutEffect(e,t)},t.useMemo=function(e,t){return N().useMemo(e,t)},t.useReducer=function(e,t,n){return N().useReducer(e,t,n)},t.useRef=function(e){return N().useRef(e)},t.useState=function(e){return N().useState(e)},t.version="17.0.2"},7294:(e,t,n)=>{"use strict";e.exports=n(2408)},53:(e,t)=>{"use strict";var n,r,a,o;if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var c=null,u=null,d=function(){if(null!==c)try{var e=t.unstable_now();c(!0,e),c=null}catch(n){throw setTimeout(d,0),n}};n=function(e){null!==c?setTimeout(n,0,e):(c=e,setTimeout(d,0))},r=function(e,t){u=setTimeout(e,t)},a=function(){clearTimeout(u)},t.unstable_shouldYield=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var g=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof g&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,h=null,b=-1,v=5,y=0;t.unstable_shouldYield=function(){return t.unstable_now()>=y},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):v=0<e?Math.floor(1e3/e):5};var w=new MessageChannel,k=w.port2;w.port1.onmessage=function(){if(null!==h){var e=t.unstable_now();y=e+v;try{h(!0,e)?k.postMessage(null):(m=!1,h=null)}catch(n){throw k.postMessage(null),n}}else m=!1},n=function(e){h=e,m||(m=!0,k.postMessage(null))},r=function(e,n){b=f((function(){e(t.unstable_now())}),n)},a=function(){p(b),b=-1}}function _(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,a=e[r];if(!(void 0!==a&&0<x(a,t)))break e;e[r]=t,e[n]=a,n=r}}function E(e){return void 0===(e=e[0])?null:e}function S(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,a=e.length;r<a;){var o=2*(r+1)-1,i=e[o],s=o+1,l=e[s];if(void 0!==i&&0>x(i,n))void 0!==l&&0>x(l,i)?(e[r]=l,e[s]=n,r=s):(e[r]=i,e[o]=n,r=o);else{if(!(void 0!==l&&0>x(l,n)))break e;e[r]=l,e[s]=n,r=s}}}return t}return null}function x(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var C=[],T=[],L=1,A=null,O=3,N=!1,R=!1,P=!1;function I(e){for(var t=E(T);null!==t;){if(null===t.callback)S(T);else{if(!(t.startTime<=e))break;S(T),t.sortIndex=t.expirationTime,_(C,t)}t=E(T)}}function D(e){if(P=!1,I(e),!R)if(null!==E(C))R=!0,n(M);else{var t=E(T);null!==t&&r(D,t.startTime-e)}}function M(e,n){R=!1,P&&(P=!1,a()),N=!0;var o=O;try{for(I(n),A=E(C);null!==A&&(!(A.expirationTime>n)||e&&!t.unstable_shouldYield());){var i=A.callback;if("function"==typeof i){A.callback=null,O=A.priorityLevel;var s=i(A.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?A.callback=s:A===E(C)&&S(C),I(n)}else S(C);A=E(C)}if(null!==A)var l=!0;else{var c=E(T);null!==c&&r(D,c.startTime-n),l=!1}return l}finally{A=null,O=o,N=!1}}var j=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){R||N||(R=!0,n(M))},t.unstable_getCurrentPriorityLevel=function(){return O},t.unstable_getFirstCallbackNode=function(){return E(C)},t.unstable_next=function(e){switch(O){case 1:case 2:case 3:var t=3;break;default:t=O}var n=O;O=t;try{return e()}finally{O=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=j,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=O;O=e;try{return t()}finally{O=n}},t.unstable_scheduleCallback=function(e,o,i){var s=t.unstable_now();switch("object"==typeof i&&null!==i?i="number"==typeof(i=i.delay)&&0<i?s+i:s:i=s,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:L++,callback:o,priorityLevel:e,startTime:i,expirationTime:l=i+l,sortIndex:-1},i>s?(e.sortIndex=i,_(T,e),null===E(C)&&e===E(T)&&(P?a():P=!0,r(D,i-s))):(e.sortIndex=l,_(C,e),R||N||(R=!0,n(M))),e},t.unstable_wrapCallback=function(e){var t=O;return function(){var n=O;O=t;try{return e.apply(this,arguments)}finally{O=n}}}},3840:(e,t,n)=>{"use strict";e.exports=n(53)},6774:e=>{e.exports=function(e,t,n,r){var a=n?n.call(r,e,t):void 0;if(void 0!==a)return!!a;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l<o.length;l++){var c=o[l];if(!s(c))return!1;var u=e[c],d=t[c];if(!1===(a=n?n.call(r,u,d,c):void 0)||void 0===a&&u!==d)return!1}return!0}},3250:(e,t,n)=>{"use strict";var r=n(7294);var a="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,i=r.useEffect,s=r.useLayoutEffect,l=r.useDebugValue;function c(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!a(e,n)}catch(r){return!0}}var u="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=o({inst:{value:n,getSnapshot:t}}),a=r[0].inst,u=r[1];return s((function(){a.value=n,a.getSnapshot=t,c(a)&&u({inst:a})}),[e,n,t]),i((function(){return c(a)&&u({inst:a}),e((function(){c(a)&&u({inst:a})}))}),[e]),l(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:u},1688:(e,t,n)=>{"use strict";e.exports=n(3250)},6809:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"Fleek Network Docs | Decentralized Edge Platform",tagline:"Welcome to the docs of Fleek Network, a decentralized edge platform for building web3 edge services.",url:"https://docs.fleek.network",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/favicon.ico?202301091316",organizationName:"fleek-network",projectName:"fleek-network-docs",deploymentBranch:"gh-pages",trailingSlash:!0,i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},presets:[["classic",{docs:{routeBasePath:"/docs",breadcrumbs:!0,sidebarPath:"/home/runner/work/fleek-network-docs/fleek-network-docs/sidebars.js",sidebarCollapsed:!1,sidebarCollapsible:!1},blog:{path:"blog",blogSidebarCount:"ALL",blogSidebarTitle:"All Blog Posts",feedOptions:{type:"all",copyright:"Copyright \xa9 2023 Fleek"}},theme:{customCss:"/home/runner/work/fleek-network-docs/fleek-network-docs/src/css/custom.css"},sitemap:{changefreq:"weekly",priority:.9,ignorePatterns:["/tags/**"],filename:"sitemap.xml"}}]],themeConfig:{image:"img/documentation.png",metadata:[{description:"Welcome to the docs of Fleek Network, a decentralized edge platform for building edge services."}],colorMode:{defaultMode:"dark",disableSwitch:!0,respectPrefersColorScheme:!1},navbar:{logo:{alt:"Fleek",src:"img/logo.png?2023091241"},items:[{to:"docs",label:"Documentation",position:"left"},{to:"blog",label:"Engineering",position:"left"},{to:"guides",label:"Guides",position:"left",activeBasePath:"guides"},{to:"references",label:"References",position:"left",activeBasePath:"references"},{href:"https://github.com/fleek-network/",label:"Github",position:"left",target:"_blank"}],hideOnScroll:!1},footer:{style:"light",links:[{title:"Resources",items:[{to:"docs",label:"Documentation",position:"left"},{to:"blog",label:"Engineering",position:"left"},{to:"guides",label:"Guides",position:"left",activeBasePath:"guides"},{to:"references",label:"References",position:"left",activeBasePath:"references"},{href:"https://github.com/fleek-network/",label:"Github",position:"left",target:"_blank"}]},{title:"Community",items:[{label:"Discord",href:"https://discord.gg/fleekxyz"},{label:"Twitter",href:"https://twitter.com/fleek_net"}]},{title:"Company",items:[{label:"Home",href:"https://fleek.network/"},{label:"Contact us",href:"https://discord.gg/fleekxyz"}]}],logo:{alt:"Fleek Network",src:"img/logo+named.svg?202301101154",href:"https://fleek.network",width:160}},prism:{theme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},algolia:{appId:"ZLPPXSKTFE",apiKey:"33ed5b78ac12317e4243d3f44874cbc8",indexName:"fleek",contextualSearch:!0,searchPagePath:"search",schedule:"every 1 day at 6:00 pm",searchParameters:{}},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},plugins:[["@docusaurus/plugin-google-tag-manager",{containerId:"GTM-PC422SF"}],["content-docs",{id:"guides",path:"guides",routeBasePath:"/guides",sidebarCollapsed:!1,sidebarCollapsible:!1,breadcrumbs:!1,showLastUpdateAuthor:!1,showLastUpdateTime:!0,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/"}],["content-docs",{id:"references",path:"references",routeBasePath:"/references",sidebarCollapsed:!0,sidebarCollapsible:!0,breadcrumbs:!1,showLastUpdateAuthor:!1,showLastUpdateTime:!0,editUrl:"https://github.com/fleek-network/fleek-network-docs/edit/main/"}]],baseUrlIssueBanner:!0,onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{mermaid:!1}}},7462:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}n.d(t,{Z:()=>r})},5068:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function a(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{Z:()=>a})},3366:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n,r,a={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}n.d(t,{Z:()=>r})},8776:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=!0,a="Invariant failed";function o(e,t){if(!e){if(r)throw new Error(a);var n="function"==typeof t?t():t,o=n?"".concat(a,": ").concat(n):a;throw new Error(o)}}},7529:e=>{"use strict";e.exports={}},6887:e=>{"use strict";e.exports=JSON.parse('{"/blog/-951":{"__comp":"a6aa9e1f","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"metadata":"b2b675dd"},"/blog/archive/-d54":{"__comp":"9e4087bc","__context":{"plugin":"e10957d6"},"archive":"b2f554cd"},"/blog/bloom-and-cuckoo-filters-for-cache-summarization/-5a5":{"__comp":"ccc49370","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","content":"6be32138"},"/blog/tags/-f8d":{"__comp":"01a85c17","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","tags":"a7023ddc"},"/blog/tags/blog/-dc0":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"631037e5","listMetadata":"3f3a03c1"},"/blog/tags/content-routing/-f84":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"5ef0bdde","listMetadata":"da8f35c6"},"/blog/tags/engineering/-6c6":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"4035650f","listMetadata":"6cbb3cde"},"/blog/tags/fleek-network/-490":{"__comp":"6875c492","__context":{"plugin":"e10957d6"},"sidebar":"814f3328","items":[{"content":"d1b78a4d"}],"tag":"da002ab0","listMetadata":"cc9d5bf1"},"/docs/tags/-070":{"__comp":"3720c009","__context":{"plugin":"2218035b"},"tags":"55960ee5"},"/docs/tags/about/-dcd":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"45c86e35"},"/docs/tags/algorithms/-cf8":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"143de299"},"/docs/tags/architecture/-4de":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"f6807fb4"},"/docs/tags/awards/-ef9":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"a50e2e4f"},"/docs/tags/build/-cb8":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"39e94577"},"/docs/tags/cdn/-f22":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"b03a0ac1"},"/docs/tags/cli/-ce9":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"54436d06"},"/docs/tags/client/-e82":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"8cf21e85"},"/docs/tags/code-of-conduct/-574":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"d464210a"},"/docs/tags/codebase/-73d":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"a13e0645"},"/docs/tags/command-line-interface/-d62":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"f893ec16"},"/docs/tags/compile/-610":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"153c226b"},"/docs/tags/configuration/-2ee":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"ce321ae3"},"/docs/tags/consensus/-f81":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"4247aede"},"/docs/tags/contribute/-daa":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"35a7e2bf"},"/docs/tags/control/-f13":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"a771de40"},"/docs/tags/decentralization/-d8a":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"39574d2e"},"/docs/tags/develop/-df2":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"82893666"},"/docs/tags/diagnostic/-6bb":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"75d8af72"},"/docs/tags/diagnostics/-354":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"bd59af11"},"/docs/tags/economics/-35c":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"53ca291c"},"/docs/tags/edge-network/-9a2":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"187c6361"},"/docs/tags/edge-platform/-3ff":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"aa81941d"},"/docs/tags/fleek-network/-ed7":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"00309d1b"},"/docs/tags/getting-started/-5c5":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"933a69d3"},"/docs/tags/git/-36d":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"7b667a7f"},"/docs/tags/guide/-cdc":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"b8c37621"},"/docs/tags/healthcheck/-b81":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"7b9de75f"},"/docs/tags/incentives/-8ff":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"48e81e49"},"/docs/tags/learn/-e71":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"ffc337e7"},"/docs/tags/lgtn/-5d0":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"de225737"},"/docs/tags/lightning/-52b":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"a626c4f3"},"/docs/tags/logs/-738":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"79055aff"},"/docs/tags/manage/-ef5":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"180ee354"},"/docs/tags/manual/-02d":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"49b5e83d"},"/docs/tags/node-status/-5b1":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"9bd69ffc"},"/docs/tags/onboarding/-140":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"a9a76bf7"},"/docs/tags/open-source/-864":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"48857ff6"},"/docs/tags/permissionless/-86e":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"e331fbd7"},"/docs/tags/phases/-743":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"f4fd4511"},"/docs/tags/pledge/-ec7":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"cc8e0b88"},"/docs/tags/ports/-fad":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"7aba1839"},"/docs/tags/protocol/-5c7":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"179183ba"},"/docs/tags/repository/-835":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"9cc140f3"},"/docs/tags/reputation/-013":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"4beaa780"},"/docs/tags/requirements/-7cb":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"64d03520"},"/docs/tags/rewards/-80e":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"433ff3d6"},"/docs/tags/roadmap/-d25":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"469c924f"},"/docs/tags/rpc/-f75":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"399f21a8"},"/docs/tags/rust-dependencies/-a0f":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"5d38c936"},"/docs/tags/sdk/-b2b":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"3a6297ac"},"/docs/tags/server/-534":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"51f2bfad"},"/docs/tags/services/-f12":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"fcc63351"},"/docs/tags/snarks/-933":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"08dd5264"},"/docs/tags/standards/-440":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"68b99ecd"},"/docs/tags/systemctl/-e24":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"45ac3af8"},"/docs/tags/systemd/-57d":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"5559e604"},"/docs/tags/testnet/-bc6":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"ec98ad91"},"/docs/tags/token/-e7b":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"2adfdcac"},"/docs/tags/tokenomics/-2b9":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"f02c0d6e"},"/docs/tags/toolkit/-e12":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"763344b9"},"/docs/tags/verification/-c34":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"b696d13b"},"/docs/tags/whitepaper/-798":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"4a821728"},"/docs/tags/wizard/-2b1":{"__comp":"df203c0f","__context":{"plugin":"2218035b"},"tag":"74ec46b4"},"/guides/tags/-f51":{"__comp":"3720c009","__context":{"plugin":"02f62b30"},"tags":"84cbd6c9"},"/guides/tags/configuration/-84f":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"2baa5a9a"},"/guides/tags/container/-31e":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"ad04e600"},"/guides/tags/docker/-316":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"f41bce02"},"/guides/tags/edge-computing/-cc1":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"3b168dbd"},"/guides/tags/fleek-network/-c44":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"6f8964f3"},"/guides/tags/getting-started/-d87":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"4c027320"},"/guides/tags/guide/-3ed":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"5d08f08d"},"/guides/tags/guides/-597":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"b02525a9"},"/guides/tags/help/-903":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"3f0cec70"},"/guides/tags/keys/-035":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"7b788087"},"/guides/tags/keystore/-b73":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"5a9491fe"},"/guides/tags/logs/-91c":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"ae70e824"},"/guides/tags/ownership/-599":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"0fbdd4ac"},"/guides/tags/private-keys/-91d":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"90decb6d"},"/guides/tags/public-keys/-e31":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"564044f9"},"/guides/tags/rebuild/-da1":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"965d240c"},"/guides/tags/setup/-cc1":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"b8466c91"},"/guides/tags/transfer/-e54":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"5ec90731"},"/guides/tags/update/-eb0":{"__comp":"df203c0f","__context":{"plugin":"02f62b30"},"tag":"ceabd901"},"/references/tags/-bb6":{"__comp":"3720c009","__context":{"plugin":"b4f44b9b"},"tags":"f9537533"},"/references/tags/backup/-738":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"21f2cabf"},"/references/tags/build/-591":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"2ddc9f52"},"/references/tags/clean/-84f":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"c3f5dd14"},"/references/tags/clear/-2a0":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"d16f6fc6"},"/references/tags/cli/-59b":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"13986d62"},"/references/tags/commands/-b96":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"2a6b0b88"},"/references/tags/container/-2ea":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"e6a08407"},"/references/tags/delete/-0a8":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"09ac38f0"},"/references/tags/docker/-21c":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"b9b7817e"},"/references/tags/file-permissions/-f21":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"84e08f43"},"/references/tags/fix/-ae4":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"bea6e15b"},"/references/tags/frozen/-b33":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"45e1a117"},"/references/tags/help/-46c":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"af6a11bf"},"/references/tags/idle/-d4a":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"43ee1886"},"/references/tags/image/-6b8":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"ae013ba6"},"/references/tags/keystore/-160":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"6ccb158e"},"/references/tags/lightning/-ba1":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"08ded6db"},"/references/tags/lost-keys/-60c":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"ce4635d7"},"/references/tags/ownership/-58e":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"749619b5"},"/references/tags/permissions/-34d":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"719c0fd7"},"/references/tags/pkill/-d9f":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"166b5465"},"/references/tags/process/-5e4":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"e91f52c1"},"/references/tags/reference/-b27":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"155c1e74"},"/references/tags/references/-91e":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"6e965365"},"/references/tags/remove/-b0b":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"616ee580"},"/references/tags/restore/-80d":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"0ea1f268"},"/references/tags/root/-9c4":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"07f20919"},"/references/tags/service-error/-8d0":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"d1d29319"},"/references/tags/shutdown/-193":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"fa7546af"},"/references/tags/sudoer/-09d":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"0359c679"},"/references/tags/systemctl/-cdc":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"2e0a4d25"},"/references/tags/systemd/-0be":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"50f02954"},"/references/tags/uninstall/-019":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"27528755"},"/references/tags/unit/-20e":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"caaedc90"},"/references/tags/update/-192":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"779cc1e8"},"/references/tags/upgrade/-ee8":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"9bca08cf"},"/references/tags/user-service/-170":{"__comp":"df203c0f","__context":{"plugin":"b4f44b9b"},"tag":"86c3bd1d"},"/search/-2a3":{"__comp":"1a4e3797","__context":{"plugin":"4061bfd3"}},"/docs/-1de":{"__comp":"1be78505","__context":{"plugin":"2218035b"},"versionMetadata":"935f2afb"},"/docs/-e7a":{"__comp":"17896441","content":"c377a04b"},"/docs/develop/client/-720":{"__comp":"17896441","content":"3290fbc2"},"/docs/develop/json-rpc/-3b0":{"__comp":"17896441","content":"ffcb1b32"},"/docs/develop/overview/-4ab":{"__comp":"17896441","content":"95f4d37c"},"/docs/develop/service-development/-a0d":{"__comp":"17896441","content":"f3f8ecb0"},"/docs/learn/delivery-acknowledgements/-76f":{"__comp":"17896441","content":"93df2695"},"/docs/learn/developers/-a5d":{"__comp":"17896441","content":"35230925"},"/docs/learn/introduction/-0c9":{"__comp":"17896441","content":"8def2dd5"},"/docs/learn/services/-095":{"__comp":"17896441","content":"3f90f51b"},"/docs/learn/the-network/-8fa":{"__comp":"17896441","content":"7ceaa645"},"/docs/learn/token-and-economics/-ede":{"__comp":"17896441","content":"b5954e33"},"/docs/node/analyzing-logs/-98d":{"__comp":"17896441","content":"9f7d0305"},"/docs/node/configuration/-191":{"__comp":"17896441","content":"b40daf0f"},"/docs/node/diagnostics/-83b":{"__comp":"17896441","content":"8428fe34"},"/docs/node/health-check/-59e":{"__comp":"17896441","content":"581d5240"},"/docs/node/install/-0d6":{"__comp":"17896441","content":"51d5b592"},"/docs/node/lightning-cli/-88d":{"__comp":"17896441","content":"1366d7ae"},"/docs/node/overview/-603":{"__comp":"17896441","content":"9f1c3232"},"/docs/node/requirements/-8ae":{"__comp":"17896441","content":"44969bae"},"/docs/node/systemd-service/-a24":{"__comp":"17896441","content":"dd97a9bc"},"/docs/node/testnet-onboarding/-2f1":{"__comp":"17896441","content":"665f164c"},"/docs/Open-source/-81b":{"__comp":"17896441","content":"ecfddbd4"},"/docs/Open-source/code-of-conduct/-ff8":{"__comp":"17896441","content":"514cab6e"},"/docs/Open-source/contributing/-27e":{"__comp":"17896441","content":"f50a4147"},"/docs/Open-source/repositories/-93e":{"__comp":"17896441","content":"dc2776f2"},"/docs/roadmap/-532":{"__comp":"17896441","content":"0dffb83e"},"/docs/whitepaper/-d8d":{"__comp":"17896441","content":"c222de09"},"/guides/-3c1":{"__comp":"1be78505","__context":{"plugin":"02f62b30"},"versionMetadata":"fa69a7f4"},"/guides/-ef7":{"__comp":"17896441","content":"29b62a39"},"/guides/Node Operators/getting-started/-a1f":{"__comp":"17896441","content":"1c14429f"},"/guides/Node Operators/how-to-manage-log-files/-951":{"__comp":"17896441","content":"19f79f7b"},"/guides/Node Operators/managing-the-keystore/-176":{"__comp":"17896441","content":"5437f376"},"/guides/Node Operators/running-a-node-in-docker/-afa":{"__comp":"17896441","content":"4c9535f7"},"/guides/Node Operators/transfering-setup-ownership/-2d8":{"__comp":"17896441","content":"1d8a5d15"},"/guides/Node Operators/updating-lightning/-a3e":{"__comp":"17896441","content":"5bc389a1"},"/references/-463":{"__comp":"1be78505","__context":{"plugin":"b4f44b9b"},"versionMetadata":"f3d7f34e"},"/references/-418":{"__comp":"17896441","content":"4d7007b2"},"/references/Docker/build-and-run-in-docker/-8c9":{"__comp":"17896441","content":"d23df0ea"},"/references/Docker/frequently-used-commands-for-docker-setup/-070":{"__comp":"17896441","content":"9722e053"},"/references/Docker/uninstall-docker-setup/-ab1":{"__comp":"17896441","content":"b249ed45"},"/references/Lightning CLI/backing-up-the-keystore/-4c3":{"__comp":"17896441","content":"29b83576"},"/references/Lightning CLI/error-building-on-arm64/-cb1":{"__comp":"17896441","content":"d7d81bf6"},"/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/-bb4":{"__comp":"17896441","content":"d8be0e5a"},"/references/Lightning CLI/file-permissions-and-ownership/-974":{"__comp":"17896441","content":"5b6134d1"},"/references/Lightning CLI/frequently-used-commands-for-native-setup/-a39":{"__comp":"17896441","content":"866d553a"},"/references/Lightning CLI/keys-not-found/-45f":{"__comp":"17896441","content":"fd2b74dc"},"/references/Lightning CLI/node-secret-key-does-not-exist/-c72":{"__comp":"17896441","content":"445e9e2a"},"/references/Lightning CLI/permission-denied-os-error-13/-eed":{"__comp":"17896441","content":"2730e145"},"/references/Lightning CLI/restore-the-keystore/-d91":{"__comp":"17896441","content":"26b85cb6"},"/references/Lightning CLI/uninstall-lightning-node/-a83":{"__comp":"17896441","content":"7aefc753"},"/references/Lightning CLI/update-cli-from-source-code/-6a3":{"__comp":"17896441","content":"40aeb86f"},"/references/Systemd/service-keeps-running-after-shutdown/-176":{"__comp":"17896441","content":"98f9308d"},"/references/Systemd/shutting-down-persistance/-27f":{"__comp":"17896441","content":"8a92e787"},"/references/Systemd/user-service/-9d7":{"__comp":"17896441","content":"b35f1b7f"},"/-a33":{"__comp":"1df93b7f","__context":{"plugin":"85d6e74d"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[532],(()=>{return t=9383,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/runtime~main.3cbddc6e.js b/assets/js/runtime~main.3cbddc6e.js new file mode 100644 index 000000000..27bbdf822 --- /dev/null +++ b/assets/js/runtime~main.3cbddc6e.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,d,a,f,c,b={},t={};function r(e){var d=t[e];if(void 0!==d)return d.exports;var a=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(a.exports,a,a.exports,r),a.loaded=!0,a.exports}r.m=b,r.c=t,e=[],r.O=(d,a,f,c)=>{if(!a){var b=1/0;for(i=0;i<e.length;i++){a=e[i][0],f=e[i][1],c=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&c||b>=c)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,c<b&&(b=c));if(t){e.splice(i--,1);var n=f();void 0!==n&&(d=n)}}return d}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[a,f,c]},r.n=e=>{var d=e&&e.__esModule?()=>e.default:()=>e;return r.d(d,{a:d}),d},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};d=d||[null,a({}),a([]),a(a)];for(var t=2&f&&e;"object"==typeof t&&!~d.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((d=>b[d]=()=>e[d]));return b.default=()=>e,r.d(c,b),c},r.d=(e,d)=>{for(var a in d)r.o(d,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:d[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((d,a)=>(r.f[a](e,d),d)),[])),r.u=e=>"assets/js/"+({4:"779cc1e8",11:"3a6297ac",53:"935f2afb",71:"51f2bfad",173:"48e81e49",327:"b696d13b",373:"9f1c3232",382:"8def2dd5",387:"7ceaa645",402:"49b5e83d",469:"3b168dbd",533:"b2b675dd",551:"b4f44b9b",554:"7aba1839",555:"433ff3d6",572:"caaedc90",581:"a626c4f3",659:"5d08f08d",663:"0ea1f268",706:"719c0fd7",747:"155c1e74",801:"631037e5",814:"95f4d37c",909:"5437f376",920:"b8c37621",982:"f3d7f34e",1025:"98f9308d",1138:"64d03520",1251:"7aefc753",1263:"74ec46b4",1345:"c3f5dd14",1354:"ceabd901",1433:"ae70e824",1474:"75d8af72",1476:"b9b7817e",1477:"b2f554cd",1498:"29b62a39",1510:"29b83576",1517:"166b5465",1563:"39e94577",1611:"fa7546af",1706:"d8be0e5a",1713:"a7023ddc",1771:"564044f9",1837:"ce321ae3",1955:"9722e053",1984:"51d5b592",2023:"d464210a",2027:"d1d29319",2114:"b5954e33",2126:"b40daf0f",2170:"02f62b30",2214:"399f21a8",2235:"3290fbc2",2240:"469c924f",2260:"4035650f",2386:"93df2695",2421:"86c3bd1d",2450:"e6a08407",2501:"5559e604",2517:"8a92e787",2535:"814f3328",2564:"1366d7ae",2702:"1c14429f",2800:"4247aede",2908:"48857ff6",2918:"d7d81bf6",3012:"aa81941d",3023:"d1b78a4d",3089:"a6aa9e1f",3116:"4061bfd3",3131:"f893ec16",3189:"2adfdcac",3218:"6ccb158e",3236:"cc9d5bf1",3237:"1df93b7f",3336:"84cbd6c9",3343:"09ac38f0",3396:"6be32138",3503:"af6a11bf",3608:"9e4087bc",3707:"f02c0d6e",3719:"f41bce02",3751:"3720c009",3863:"53ca291c",4013:"01a85c17",4034:"ec98ad91",4063:"44969bae",4121:"55960ee5",4327:"07f20919",4356:"a9a76bf7",4368:"a94703ab",4402:"40aeb86f",4451:"3f3a03c1",4508:"35a7e2bf",4530:"2218035b",4537:"21f2cabf",4541:"da8f35c6",4556:"68b99ecd",4679:"6e965365",4708:"e10957d6",4713:"9f7d0305",4749:"616ee580",4785:"b03a0ac1",4788:"f6807fb4",4819:"85d6e74d",4826:"50f02954",4846:"fd2b74dc",4872:"54436d06",4888:"f50a4147",4939:"b8466c91",5049:"9cc140f3",5075:"0dffb83e",5081:"4beaa780",5094:"763344b9",5120:"ffcb1b32",5136:"6cbb3cde",5204:"45ac3af8",5318:"581d5240",5347:"f9537533",5466:"43ee1886",5522:"8428fe34",5530:"d16f6fc6",5548:"d23df0ea",5602:"35230925",5649:"7b667a7f",5767:"b249ed45",5844:"ad04e600",5888:"da002ab0",6074:"a771de40",6103:"ccc49370",6272:"4d7007b2",6296:"4c9535f7",6310:"cc8e0b88",6353:"7b9de75f",6362:"749619b5",6410:"514cab6e",6446:"2a6b0b88",6461:"f4fd4511",6476:"5a9491fe",6577:"965d240c",6601:"179183ba",6669:"3f90f51b",6696:"45e1a117",6699:"9bd69ffc",6726:"de225737",6788:"187c6361",6798:"fa69a7f4",6854:"8cf21e85",6926:"27528755",6939:"f3f8ecb0",6971:"c377a04b",6980:"b02525a9",7055:"26b85cb6",7091:"e91f52c1",7136:"a13e0645",7147:"2730e145",7216:"08ded6db",7249:"153c226b",7310:"ffc337e7",7400:"2ddc9f52",7536:"6f8964f3",7563:"c222de09",7649:"0359c679",7706:"b35f1b7f",7796:"a50e2e4f",7804:"ecfddbd4",7813:"933a69d3",7918:"17896441",7920:"1a4e3797",8005:"82893666",8059:"84e08f43",8132:"2e0a4d25",8256:"79055aff",8318:"9bca08cf",8427:"143de299",8489:"19f79f7b",8518:"a7bd4aaa",8567:"5ef0bdde",8578:"445e9e2a",8610:"6875c492",8644:"dc2776f2",8668:"866d553a",8747:"39574d2e",8754:"bea6e15b",8934:"0fbdd4ac",8942:"5ec90731",9021:"2baa5a9a",9062:"7b788087",9188:"bd59af11",9267:"08dd5264",9316:"180ee354",9320:"665f164c",9335:"00309d1b",9336:"3f0cec70",9395:"ce4635d7",9511:"4c027320",9513:"4a821728",9649:"90decb6d",9661:"5e95c892",9707:"dd97a9bc",9743:"fcc63351",9752:"5b6134d1",9804:"5d38c936",9822:"13986d62",9829:"5bc389a1",9847:"45c86e35",9854:"1d8a5d15",9924:"df203c0f",9981:"ae013ba6",9995:"e331fbd7"}[e]||e)+"."+{4:"b5e33d5d",11:"348b248b",53:"3edf634b",71:"03938b9f",130:"2448291a",173:"5ac56e34",327:"67d6433c",373:"754ab62e",382:"8faef833",387:"42ff94cb",402:"bb00ad8f",469:"d8580674",533:"3685267b",551:"24b75469",554:"8f38c854",555:"093c7d9e",572:"0c254351",581:"dee5a042",659:"5c7abe18",663:"b27098e9",706:"6c3d8003",747:"c60231fe",801:"adb20c2c",814:"0a40e7b8",909:"a307a139",920:"3fb7580a",982:"36b0c123",1025:"a01bf3c4",1138:"6f24231a",1251:"cdd60b24",1263:"5a8f5ef0",1345:"74ce3614",1354:"23077e58",1426:"8a7f4119",1433:"0e6f6d61",1474:"0db0b71a",1476:"8ebc058f",1477:"1ddf11f7",1498:"6607397c",1510:"d78afd48",1517:"f98909ca",1563:"85f019bf",1611:"7af1c866",1706:"ea934156",1713:"e95d897a",1771:"b5bab01d",1772:"9796a666",1837:"8a69b8f3",1955:"7ad17092",1984:"eb15ccfd",2023:"3e507ebe",2027:"bcaebf14",2114:"3422a378",2126:"2f5ab135",2170:"11304d9c",2214:"420d866d",2235:"dd92ec9c",2240:"9a76c610",2260:"9316e754",2386:"300a96e1",2421:"9115d118",2450:"9629e8eb",2501:"11d96201",2517:"4f946d9f",2535:"01f98a18",2564:"4fb5075d",2702:"2c119681",2800:"df1864bc",2908:"ba1d9243",2918:"dfef0ceb",3012:"a884d55b",3023:"c349bda3",3089:"e40508bd",3116:"29aa95b8",3131:"d295f0cb",3189:"3c37a29a",3218:"5162cfe7",3236:"8bf22a24",3237:"4902629f",3336:"64b11bb4",3343:"0e47b6a8",3396:"8a943ec7",3503:"050de1e1",3608:"7fa7842e",3707:"a68a515b",3719:"7f0e4028",3751:"30b055b5",3863:"7e6b99d7",4013:"d4221160",4034:"f6dcd324",4063:"ff574e4c",4121:"afc475ed",4327:"72a0ea98",4356:"6ebee837",4368:"1851859d",4402:"bd8448f6",4451:"c14b64e9",4508:"71209370",4530:"a68c5f9c",4537:"c9ad8d38",4541:"faa1df34",4556:"9b719a2d",4679:"33a8784c",4708:"c579463f",4713:"ff0deaac",4749:"6ddee81a",4785:"5e843cb3",4788:"4f260ebf",4819:"6280433f",4826:"c6206aff",4846:"7c595cf3",4872:"4d56aa06",4888:"0bd0271c",4939:"bdc01329",5049:"d46c2c0c",5075:"98f34a7e",5081:"9c9386ab",5094:"3fc871db",5120:"d590406b",5136:"6db4a7cc",5204:"cf7a9fd9",5318:"4f96a3e4",5347:"8676b1d1",5466:"d81e37f7",5522:"9593ce54",5530:"dcce69ae",5548:"1d84ae69",5602:"dcdddd7b",5649:"8a480976",5767:"790c0dff",5844:"80dbb210",5888:"4e4f882b",6074:"cd72cf12",6103:"152e84b2",6272:"4b984760",6296:"6cbde464",6310:"32340495",6353:"61af48f1",6362:"eabd0923",6410:"8af2ed2b",6446:"01c63236",6461:"35512f65",6476:"79d386e5",6577:"50a7d323",6601:"6a924c3e",6669:"c63e3c64",6696:"340acc3e",6699:"96d0dc87",6726:"a2e520ac",6788:"df90bd39",6798:"48858406",6854:"f316391c",6926:"432f62b4",6939:"4317feec",6945:"bd8076fe",6971:"b8a439ee",6980:"4e924af7",7055:"98313bc5",7091:"d3ff2d82",7136:"94a2c40f",7147:"3bb3b825",7216:"a1e0dc68",7249:"722fc636",7310:"5f4be381",7400:"1d8c6c02",7536:"a1c6e6fd",7563:"301bcc1f",7649:"3ca6e3fb",7706:"e3527fb9",7796:"08511bd9",7804:"21bb1ad5",7813:"ba52a263",7874:"f6f729a5",7918:"dbf77ff9",7920:"769d8c18",8005:"1b7a455f",8059:"fd8204f1",8132:"b54bdd52",8256:"33b2b3c8",8318:"cd5bdade",8427:"d3a097ff",8489:"1ade0ebc",8518:"928fb9e5",8567:"da8175a7",8578:"9a475749",8610:"463ee9a3",8644:"a0c19ad7",8668:"15ab360d",8747:"d1d6cecf",8754:"422e763d",8894:"62e3afaa",8934:"514e2af7",8942:"4eab081d",9021:"f25a88f1",9062:"8948d3eb",9188:"82aec483",9267:"7ebeebf6",9316:"b69fc369",9320:"493e219b",9335:"9df700f1",9336:"f7c10106",9395:"2f6e9cd8",9511:"9f0993f7",9513:"3a30c2cd",9649:"17716680",9661:"3e88c822",9707:"8892f4a2",9743:"947aff8c",9752:"4caed6d0",9804:"01ab4afd",9822:"c1425471",9829:"a5e2deb7",9847:"17e3d245",9854:"d895b1ed",9924:"7f1db2f5",9981:"851e7143",9995:"29ba16bf"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,d)=>Object.prototype.hasOwnProperty.call(e,d),f={},c="docta:",r.l=(e,d,a,b)=>{if(f[e])f[e].push(d);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==c+a){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",c+a),t.src=e),f[e]=[d];var l=(d,a)=>{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(a))),d)return d(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",27528755:"6926",35230925:"5602",82893666:"8005","779cc1e8":"4","3a6297ac":"11","935f2afb":"53","51f2bfad":"71","48e81e49":"173",b696d13b:"327","9f1c3232":"373","8def2dd5":"382","7ceaa645":"387","49b5e83d":"402","3b168dbd":"469",b2b675dd:"533",b4f44b9b:"551","7aba1839":"554","433ff3d6":"555",caaedc90:"572",a626c4f3:"581","5d08f08d":"659","0ea1f268":"663","719c0fd7":"706","155c1e74":"747","631037e5":"801","95f4d37c":"814","5437f376":"909",b8c37621:"920",f3d7f34e:"982","98f9308d":"1025","64d03520":"1138","7aefc753":"1251","74ec46b4":"1263",c3f5dd14:"1345",ceabd901:"1354",ae70e824:"1433","75d8af72":"1474",b9b7817e:"1476",b2f554cd:"1477","29b62a39":"1498","29b83576":"1510","166b5465":"1517","39e94577":"1563",fa7546af:"1611",d8be0e5a:"1706",a7023ddc:"1713","564044f9":"1771",ce321ae3:"1837","9722e053":"1955","51d5b592":"1984",d464210a:"2023",d1d29319:"2027",b5954e33:"2114",b40daf0f:"2126","02f62b30":"2170","399f21a8":"2214","3290fbc2":"2235","469c924f":"2240","4035650f":"2260","93df2695":"2386","86c3bd1d":"2421",e6a08407:"2450","5559e604":"2501","8a92e787":"2517","814f3328":"2535","1366d7ae":"2564","1c14429f":"2702","4247aede":"2800","48857ff6":"2908",d7d81bf6:"2918",aa81941d:"3012",d1b78a4d:"3023",a6aa9e1f:"3089","4061bfd3":"3116",f893ec16:"3131","2adfdcac":"3189","6ccb158e":"3218",cc9d5bf1:"3236","1df93b7f":"3237","84cbd6c9":"3336","09ac38f0":"3343","6be32138":"3396",af6a11bf:"3503","9e4087bc":"3608",f02c0d6e:"3707",f41bce02:"3719","3720c009":"3751","53ca291c":"3863","01a85c17":"4013",ec98ad91:"4034","44969bae":"4063","55960ee5":"4121","07f20919":"4327",a9a76bf7:"4356",a94703ab:"4368","40aeb86f":"4402","3f3a03c1":"4451","35a7e2bf":"4508","2218035b":"4530","21f2cabf":"4537",da8f35c6:"4541","68b99ecd":"4556","6e965365":"4679",e10957d6:"4708","9f7d0305":"4713","616ee580":"4749",b03a0ac1:"4785",f6807fb4:"4788","85d6e74d":"4819","50f02954":"4826",fd2b74dc:"4846","54436d06":"4872",f50a4147:"4888",b8466c91:"4939","9cc140f3":"5049","0dffb83e":"5075","4beaa780":"5081","763344b9":"5094",ffcb1b32:"5120","6cbb3cde":"5136","45ac3af8":"5204","581d5240":"5318",f9537533:"5347","43ee1886":"5466","8428fe34":"5522",d16f6fc6:"5530",d23df0ea:"5548","7b667a7f":"5649",b249ed45:"5767",ad04e600:"5844",da002ab0:"5888",a771de40:"6074",ccc49370:"6103","4d7007b2":"6272","4c9535f7":"6296",cc8e0b88:"6310","7b9de75f":"6353","749619b5":"6362","514cab6e":"6410","2a6b0b88":"6446",f4fd4511:"6461","5a9491fe":"6476","965d240c":"6577","179183ba":"6601","3f90f51b":"6669","45e1a117":"6696","9bd69ffc":"6699",de225737:"6726","187c6361":"6788",fa69a7f4:"6798","8cf21e85":"6854",f3f8ecb0:"6939",c377a04b:"6971",b02525a9:"6980","26b85cb6":"7055",e91f52c1:"7091",a13e0645:"7136","2730e145":"7147","08ded6db":"7216","153c226b":"7249",ffc337e7:"7310","2ddc9f52":"7400","6f8964f3":"7536",c222de09:"7563","0359c679":"7649",b35f1b7f:"7706",a50e2e4f:"7796",ecfddbd4:"7804","933a69d3":"7813","1a4e3797":"7920","84e08f43":"8059","2e0a4d25":"8132","79055aff":"8256","9bca08cf":"8318","143de299":"8427","19f79f7b":"8489",a7bd4aaa:"8518","5ef0bdde":"8567","445e9e2a":"8578","6875c492":"8610",dc2776f2:"8644","866d553a":"8668","39574d2e":"8747",bea6e15b:"8754","0fbdd4ac":"8934","5ec90731":"8942","2baa5a9a":"9021","7b788087":"9062",bd59af11:"9188","08dd5264":"9267","180ee354":"9316","665f164c":"9320","00309d1b":"9335","3f0cec70":"9336",ce4635d7:"9395","4c027320":"9511","4a821728":"9513","90decb6d":"9649","5e95c892":"9661",dd97a9bc:"9707",fcc63351:"9743","5b6134d1":"9752","5d38c936":"9804","13986d62":"9822","5bc389a1":"9829","45c86e35":"9847","1d8a5d15":"9854",df203c0f:"9924",ae013ba6:"9981",e331fbd7:"9995"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(d,a)=>{var f=r.o(e,d)?e[d]:void 0;if(0!==f)if(f)a.push(f[2]);else if(/^(1303|532)$/.test(d))e[d]=0;else{var c=new Promise(((a,c)=>f=e[d]=[a,c]));a.push(f[2]=c);var b=r.p+r.u(d),t=new Error;r.l(b,(a=>{if(r.o(e,d)&&(0!==(f=e[d])&&(e[d]=void 0),f)){var c=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+d+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+d,d)}},r.O.j=d=>0===e[d];var d=(d,a)=>{var f,c,b=a[0],t=a[1],o=a[2],n=0;if(b.some((d=>0!==e[d]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(d&&d(a);n<b.length;n++)c=b[n],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return r.O(i)},a=self.webpackChunkdocta=self.webpackChunkdocta||[];a.forEach(d.bind(null,0)),a.push=d.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/assets/js/runtime~main.85c93256.js b/assets/js/runtime~main.85c93256.js deleted file mode 100644 index 2e22e08e3..000000000 --- a/assets/js/runtime~main.85c93256.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,f,d,a,c,b={},t={};function r(e){var f=t[e];if(void 0!==f)return f.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,e=[],r.O=(f,d,a,c)=>{if(!d){var b=1/0;for(i=0;i<e.length;i++){d=e[i][0],a=e[i][1],c=e[i][2];for(var t=!0,o=0;o<d.length;o++)(!1&c||b>=c)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,c<b&&(b=c));if(t){e.splice(i--,1);var n=a();void 0!==n&&(f=n)}}return f}c=c||0;for(var i=e.length;i>0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[d,a,c]},r.n=e=>{var f=e&&e.__esModule?()=>e.default:()=>e;return r.d(f,{a:f}),f},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};f=f||[null,d({}),d([]),d(d)];for(var t=2&a&&e;"object"==typeof t&&!~f.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((f=>b[f]=()=>e[f]));return b.default=()=>e,r.d(c,b),c},r.d=(e,f)=>{for(var d in f)r.o(f,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:f[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((f,d)=>(r.f[d](e,f),f)),[])),r.u=e=>"assets/js/"+({4:"779cc1e8",11:"3a6297ac",53:"935f2afb",71:"51f2bfad",173:"48e81e49",327:"b696d13b",373:"9f1c3232",382:"8def2dd5",387:"7ceaa645",402:"49b5e83d",469:"3b168dbd",533:"b2b675dd",551:"b4f44b9b",554:"7aba1839",555:"433ff3d6",572:"caaedc90",581:"a626c4f3",659:"5d08f08d",663:"0ea1f268",706:"719c0fd7",747:"155c1e74",801:"631037e5",814:"95f4d37c",909:"5437f376",920:"b8c37621",982:"f3d7f34e",1025:"98f9308d",1138:"64d03520",1251:"7aefc753",1263:"74ec46b4",1345:"c3f5dd14",1354:"ceabd901",1433:"ae70e824",1474:"75d8af72",1476:"b9b7817e",1477:"b2f554cd",1498:"29b62a39",1510:"29b83576",1517:"166b5465",1563:"39e94577",1611:"fa7546af",1706:"d8be0e5a",1713:"a7023ddc",1771:"564044f9",1837:"ce321ae3",1955:"9722e053",1984:"51d5b592",2023:"d464210a",2027:"d1d29319",2114:"b5954e33",2126:"b40daf0f",2170:"02f62b30",2214:"399f21a8",2235:"3290fbc2",2240:"469c924f",2260:"4035650f",2386:"93df2695",2421:"86c3bd1d",2450:"e6a08407",2501:"5559e604",2517:"8a92e787",2535:"814f3328",2564:"1366d7ae",2702:"1c14429f",2800:"4247aede",2908:"48857ff6",2918:"d7d81bf6",3012:"aa81941d",3023:"d1b78a4d",3089:"a6aa9e1f",3116:"4061bfd3",3131:"f893ec16",3189:"2adfdcac",3218:"6ccb158e",3236:"cc9d5bf1",3237:"1df93b7f",3336:"84cbd6c9",3343:"09ac38f0",3396:"6be32138",3503:"af6a11bf",3608:"9e4087bc",3707:"f02c0d6e",3719:"f41bce02",3751:"3720c009",3863:"53ca291c",4013:"01a85c17",4034:"ec98ad91",4063:"44969bae",4121:"55960ee5",4327:"07f20919",4356:"a9a76bf7",4402:"40aeb86f",4451:"3f3a03c1",4508:"35a7e2bf",4530:"2218035b",4537:"21f2cabf",4541:"da8f35c6",4556:"68b99ecd",4679:"6e965365",4708:"e10957d6",4713:"9f7d0305",4749:"616ee580",4785:"b03a0ac1",4788:"f6807fb4",4819:"85d6e74d",4826:"50f02954",4846:"fd2b74dc",4872:"54436d06",4888:"f50a4147",4939:"b8466c91",5049:"9cc140f3",5075:"0dffb83e",5081:"4beaa780",5094:"763344b9",5120:"ffcb1b32",5136:"6cbb3cde",5204:"45ac3af8",5318:"581d5240",5347:"f9537533",5466:"43ee1886",5522:"8428fe34",5530:"d16f6fc6",5548:"d23df0ea",5602:"35230925",5649:"7b667a7f",5767:"b249ed45",5844:"ad04e600",5888:"da002ab0",6074:"a771de40",6103:"ccc49370",6272:"4d7007b2",6296:"4c9535f7",6310:"cc8e0b88",6353:"7b9de75f",6362:"749619b5",6410:"514cab6e",6446:"2a6b0b88",6461:"f4fd4511",6476:"5a9491fe",6577:"965d240c",6601:"179183ba",6669:"3f90f51b",6696:"45e1a117",6699:"9bd69ffc",6726:"de225737",6788:"187c6361",6798:"fa69a7f4",6854:"8cf21e85",6926:"27528755",6939:"f3f8ecb0",6971:"c377a04b",6980:"b02525a9",7055:"26b85cb6",7091:"e91f52c1",7136:"a13e0645",7147:"2730e145",7216:"08ded6db",7249:"153c226b",7310:"ffc337e7",7400:"2ddc9f52",7536:"6f8964f3",7563:"c222de09",7649:"0359c679",7706:"b35f1b7f",7796:"a50e2e4f",7804:"ecfddbd4",7813:"933a69d3",7918:"17896441",7920:"1a4e3797",8005:"82893666",8059:"84e08f43",8132:"2e0a4d25",8256:"79055aff",8318:"9bca08cf",8427:"143de299",8489:"19f79f7b",8567:"5ef0bdde",8578:"445e9e2a",8610:"6875c492",8644:"dc2776f2",8668:"866d553a",8747:"39574d2e",8754:"bea6e15b",8934:"0fbdd4ac",8942:"5ec90731",9021:"2baa5a9a",9062:"7b788087",9188:"bd59af11",9267:"08dd5264",9316:"180ee354",9320:"665f164c",9335:"00309d1b",9336:"3f0cec70",9395:"ce4635d7",9511:"4c027320",9513:"4a821728",9514:"1be78505",9649:"90decb6d",9707:"dd97a9bc",9743:"fcc63351",9752:"5b6134d1",9804:"5d38c936",9822:"13986d62",9829:"5bc389a1",9847:"45c86e35",9854:"1d8a5d15",9924:"df203c0f",9981:"ae013ba6",9995:"e331fbd7"}[e]||e)+"."+{4:"bbdd63a1",11:"b4ac4739",53:"73c88fc7",71:"77ca8786",173:"381d2121",327:"1c632dae",373:"1cf2e42e",382:"46757c8d",387:"ac1d6308",402:"31ceddd4",469:"cd5b76ca",533:"3685267b",551:"24b75469",554:"091e2e6b",555:"d3c847c3",572:"7e4aa2bd",581:"9fea3752",659:"ecec00ba",663:"80347ba6",706:"9b552829",747:"42f49a8c",801:"85b42d25",814:"7715ba3a",909:"dd2a93da",920:"03680a1b",982:"da24e3c4",1025:"be94bcbf",1138:"0c257146",1251:"f5cd3448",1263:"45c490ed",1345:"c34d5bde",1354:"affbfa3f",1426:"39540556",1433:"246e99e9",1474:"de071f8d",1476:"d1ea4071",1477:"295697e8",1498:"d491548c",1510:"1c09dc14",1517:"2fd54cee",1563:"fb5615ec",1611:"b7f84265",1706:"f9e6cd73",1713:"e95d897a",1771:"91e85ef3",1837:"bd881c9e",1955:"24ccaeca",1984:"a4e0e2e7",2023:"31238def",2027:"ebda8846",2114:"0de601d3",2126:"f8f42c37",2170:"11304d9c",2214:"90418f6a",2235:"83ee952a",2240:"1b5727ea",2260:"c73efbe4",2386:"12f4ff8d",2421:"e7c31aca",2450:"1751bc14",2501:"2c5aa46d",2517:"a068730e",2535:"d24f5f57",2564:"fe7fc0fe",2702:"6809339c",2800:"b2010ed6",2908:"d7494b7e",2918:"be572449",3012:"9d9f9412",3023:"8e6e2837",3089:"28469447",3116:"29aa95b8",3131:"dafed2ec",3189:"a382b418",3218:"71a0d814",3236:"8bf22a24",3237:"4902629f",3336:"64b11bb4",3343:"e1a56ba9",3396:"e604e6f4",3503:"4290cebc",3608:"a9c67174",3707:"a8b752d8",3719:"82543bf2",3751:"a4574b8c",3863:"82f62613",4013:"7d963c01",4034:"08a89d13",4063:"7e6abc6e",4121:"afc475ed",4327:"ff3964a2",4356:"5c10b5a8",4402:"376587f0",4451:"c14b64e9",4508:"e661e27e",4530:"a68c5f9c",4537:"6cb7a47f",4541:"faa1df34",4556:"3b517092",4679:"0fc782cb",4708:"c579463f",4713:"7388f64a",4749:"e30472b0",4785:"7c16d2b5",4788:"5389a650",4819:"6280433f",4826:"171a32d5",4846:"6aac091f",4872:"aef64e50",4888:"103a0c55",4939:"eed55eb6",4972:"0a28dda3",5049:"46c0f2b1",5075:"6c9e5ec7",5081:"28992a2f",5094:"ca82c87e",5120:"d819dc1a",5136:"6db4a7cc",5204:"59f3bef9",5318:"87a21bde",5347:"8676b1d1",5466:"331e3119",5522:"0509f320",5530:"a492f280",5548:"892d5604",5602:"29f648b5",5649:"ae55a2ab",5767:"77028740",5844:"4cda4442",5888:"79cb2336",6048:"a0d2f860",6074:"71ea664a",6103:"084c8d77",6272:"73a373f9",6296:"9ccfa098",6310:"61c83c7a",6353:"0ebd6f32",6362:"778e9505",6410:"e8c2eaad",6446:"dfc48d4a",6461:"1869451f",6476:"195d2f1b",6577:"50abd3fb",6601:"be6e6772",6669:"2d2941a9",6696:"149c1b9d",6699:"df99b872",6726:"ae0ddde1",6788:"b8c530ea",6798:"90bbc604",6854:"eb0c3500",6926:"a604f963",6939:"c4976496",6945:"bd8076fe",6971:"a63d0c15",6980:"456b9285",7055:"b913bd37",7091:"e63d5f81",7136:"b94fc59c",7147:"70545291",7216:"249775d4",7249:"d148cb4c",7310:"dce1780a",7400:"80c52109",7536:"0f47a8ee",7563:"ec3d20c2",7649:"33816ca2",7706:"eab94299",7796:"1318cb1d",7804:"f15998ec",7813:"580d79a0",7918:"1c8df702",7920:"3c1887b3",8005:"f3b79821",8059:"e19511bc",8105:"7cae6d1f",8132:"00fdda3c",8256:"6c794010",8318:"cbc2db42",8427:"c3fedd0b",8489:"3e9395c7",8567:"fbb18141",8578:"e889d98e",8610:"bfbc1fdc",8644:"224fc2b8",8668:"cbd99266",8747:"a089ce5c",8754:"5e98adf3",8894:"62e3afaa",8934:"fde097b1",8942:"f6a49b70",9021:"4b0721ba",9062:"328863f6",9188:"470c9730",9267:"a583e0ee",9316:"4835f795",9320:"eb74b7a6",9335:"9a24e38b",9336:"f407843f",9395:"d356d916",9511:"0ae961df",9513:"447bd46f",9514:"60b95ee7",9649:"9b736857",9707:"316666d0",9743:"75cdda8a",9752:"a464da92",9804:"8764d96d",9822:"279d55ed",9829:"9f343a0c",9847:"7db05553",9854:"2b13cbd9",9924:"8ad14275",9981:"4cc80cf7",9995:"8617ba2c"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,f)=>Object.prototype.hasOwnProperty.call(e,f),a={},c="docta:",r.l=(e,f,d,b)=>{if(a[e])a[e].push(f);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==c+d){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",c+d),t.src=e),a[e]=[f];var l=(f,d)=>{t.onerror=t.onload=null,clearTimeout(s);var c=a[e];if(delete a[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(d))),f)return f(d)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"7918",27528755:"6926",35230925:"5602",82893666:"8005","779cc1e8":"4","3a6297ac":"11","935f2afb":"53","51f2bfad":"71","48e81e49":"173",b696d13b:"327","9f1c3232":"373","8def2dd5":"382","7ceaa645":"387","49b5e83d":"402","3b168dbd":"469",b2b675dd:"533",b4f44b9b:"551","7aba1839":"554","433ff3d6":"555",caaedc90:"572",a626c4f3:"581","5d08f08d":"659","0ea1f268":"663","719c0fd7":"706","155c1e74":"747","631037e5":"801","95f4d37c":"814","5437f376":"909",b8c37621:"920",f3d7f34e:"982","98f9308d":"1025","64d03520":"1138","7aefc753":"1251","74ec46b4":"1263",c3f5dd14:"1345",ceabd901:"1354",ae70e824:"1433","75d8af72":"1474",b9b7817e:"1476",b2f554cd:"1477","29b62a39":"1498","29b83576":"1510","166b5465":"1517","39e94577":"1563",fa7546af:"1611",d8be0e5a:"1706",a7023ddc:"1713","564044f9":"1771",ce321ae3:"1837","9722e053":"1955","51d5b592":"1984",d464210a:"2023",d1d29319:"2027",b5954e33:"2114",b40daf0f:"2126","02f62b30":"2170","399f21a8":"2214","3290fbc2":"2235","469c924f":"2240","4035650f":"2260","93df2695":"2386","86c3bd1d":"2421",e6a08407:"2450","5559e604":"2501","8a92e787":"2517","814f3328":"2535","1366d7ae":"2564","1c14429f":"2702","4247aede":"2800","48857ff6":"2908",d7d81bf6:"2918",aa81941d:"3012",d1b78a4d:"3023",a6aa9e1f:"3089","4061bfd3":"3116",f893ec16:"3131","2adfdcac":"3189","6ccb158e":"3218",cc9d5bf1:"3236","1df93b7f":"3237","84cbd6c9":"3336","09ac38f0":"3343","6be32138":"3396",af6a11bf:"3503","9e4087bc":"3608",f02c0d6e:"3707",f41bce02:"3719","3720c009":"3751","53ca291c":"3863","01a85c17":"4013",ec98ad91:"4034","44969bae":"4063","55960ee5":"4121","07f20919":"4327",a9a76bf7:"4356","40aeb86f":"4402","3f3a03c1":"4451","35a7e2bf":"4508","2218035b":"4530","21f2cabf":"4537",da8f35c6:"4541","68b99ecd":"4556","6e965365":"4679",e10957d6:"4708","9f7d0305":"4713","616ee580":"4749",b03a0ac1:"4785",f6807fb4:"4788","85d6e74d":"4819","50f02954":"4826",fd2b74dc:"4846","54436d06":"4872",f50a4147:"4888",b8466c91:"4939","9cc140f3":"5049","0dffb83e":"5075","4beaa780":"5081","763344b9":"5094",ffcb1b32:"5120","6cbb3cde":"5136","45ac3af8":"5204","581d5240":"5318",f9537533:"5347","43ee1886":"5466","8428fe34":"5522",d16f6fc6:"5530",d23df0ea:"5548","7b667a7f":"5649",b249ed45:"5767",ad04e600:"5844",da002ab0:"5888",a771de40:"6074",ccc49370:"6103","4d7007b2":"6272","4c9535f7":"6296",cc8e0b88:"6310","7b9de75f":"6353","749619b5":"6362","514cab6e":"6410","2a6b0b88":"6446",f4fd4511:"6461","5a9491fe":"6476","965d240c":"6577","179183ba":"6601","3f90f51b":"6669","45e1a117":"6696","9bd69ffc":"6699",de225737:"6726","187c6361":"6788",fa69a7f4:"6798","8cf21e85":"6854",f3f8ecb0:"6939",c377a04b:"6971",b02525a9:"6980","26b85cb6":"7055",e91f52c1:"7091",a13e0645:"7136","2730e145":"7147","08ded6db":"7216","153c226b":"7249",ffc337e7:"7310","2ddc9f52":"7400","6f8964f3":"7536",c222de09:"7563","0359c679":"7649",b35f1b7f:"7706",a50e2e4f:"7796",ecfddbd4:"7804","933a69d3":"7813","1a4e3797":"7920","84e08f43":"8059","2e0a4d25":"8132","79055aff":"8256","9bca08cf":"8318","143de299":"8427","19f79f7b":"8489","5ef0bdde":"8567","445e9e2a":"8578","6875c492":"8610",dc2776f2:"8644","866d553a":"8668","39574d2e":"8747",bea6e15b:"8754","0fbdd4ac":"8934","5ec90731":"8942","2baa5a9a":"9021","7b788087":"9062",bd59af11:"9188","08dd5264":"9267","180ee354":"9316","665f164c":"9320","00309d1b":"9335","3f0cec70":"9336",ce4635d7:"9395","4c027320":"9511","4a821728":"9513","1be78505":"9514","90decb6d":"9649",dd97a9bc:"9707",fcc63351:"9743","5b6134d1":"9752","5d38c936":"9804","13986d62":"9822","5bc389a1":"9829","45c86e35":"9847","1d8a5d15":"9854",df203c0f:"9924",ae013ba6:"9981",e331fbd7:"9995"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(f,d)=>{var a=r.o(e,f)?e[f]:void 0;if(0!==a)if(a)d.push(a[2]);else if(/^(1303|532)$/.test(f))e[f]=0;else{var c=new Promise(((d,c)=>a=e[f]=[d,c]));d.push(a[2]=c);var b=r.p+r.u(f),t=new Error;r.l(b,(d=>{if(r.o(e,f)&&(0!==(a=e[f])&&(e[f]=void 0),a)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;t.message="Loading chunk "+f+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,a[1](t)}}),"chunk-"+f,f)}},r.O.j=f=>0===e[f];var f=(f,d)=>{var a,c,b=d[0],t=d[1],o=d[2],n=0;if(b.some((f=>0!==e[f]))){for(a in t)r.o(t,a)&&(r.m[a]=t[a]);if(o)var i=o(r)}for(f&&f(d);n<b.length;n++)c=b[n],r.o(e,c)&&e[c]&&e[c][0](),e[c]=0;return r.O(i)},d=self.webpackChunkdocta=self.webpackChunkdocta||[];d.forEach(f.bind(null,0)),d.push=f.bind(null,d.push.bind(d))})()})(); \ No newline at end of file diff --git a/blog/archive/index.html b/blog/archive/index.html index 7ca0391a3..5748d9f83 100644 --- a/blog/archive/index.html +++ b/blog/archive/index.html @@ -1,9 +1,9 @@ <!doctype html> -<html lang="en" dir="ltr" class="plugin-blog plugin-id-default"> +<html lang="en" dir="ltr" class="plugin-blog plugin-id-default" data-has-hydrated="false"> <head> <meta charset="UTF-8"> -<meta name="generator" content="Docusaurus v2.4.1"> -<title data-rh="true">Archive | Fleek Network Docs | Decentralized Edge Platform + +Archive | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/blog/atom.xml b/blog/atom.xml index 279b6b237..7cb82e218 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -2,7 +2,7 @@ https://docs.fleek.network/blog Fleek Network Docs | Decentralized Edge Platform Blog - 2023-10-31T18:15:43.000Z + 2023-11-01T18:03:13.000Z https://github.com/jpmonette/feed Fleek Network Docs | Decentralized Edge Platform Blog @@ -12,29 +12,119 @@ <![CDATA[Bloom Filters and Cuckoo Filters for Cache Summarization]]> https://docs.fleek.network/blog/bloom-and-cuckoo-filters-for-cache-summarization - 2023-10-31T18:15:43.000Z + 2023-11-01T18:03:13.000Z - Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

Background

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

Bloom Filters

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries. -The answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate. -Of course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions. + Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

+

Background

+

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

+

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

+

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

+

Bloom Filters

+

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries. +The answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

+

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate. +Of course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

+

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions. The resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren't already 1).
-To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters. -Counting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

Each position in the array is no longer a single bit but a group of bits representing a counter. -Whenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

Cuckoo Filters

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters). -A relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets. -We determine two candidate buckets for each element using two different hash functions, h1 and h2.

The contains operation will check if either bucket contains the element. -For insertion, if either bucket is empty, the element will be inserted into the empty bucket.

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location. -This may trigger another relocation if the alternate location is not empty.

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

The fingerprint size is derived from the desired false positive rate.
-A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
-For a given element x, the two candidate buckets are computed as follows:

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

Benchmarking

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

Experimental Setup

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

Memory Footprint

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that -these factors have on the memory footprint.

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. -The size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

Lookup Performance

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1], -where Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

However, the performance difference is negligible.

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative. -The shaded region indicates the standard deviation.

Insertion Performance

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels. -Fig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

Capacity and Scaling

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded. -Bloom filters and Cuckoo filters behave differently in this scenario.

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of -relocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

The proposed technique is also applicable to Cuckoo filters.

Other Filters

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

  • Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

  • XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

Conclusion

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

References

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom. -In Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

]]>
+To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

+

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

+

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

+

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters. +Counting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

+

Each position in the array is no longer a single bit but a group of bits representing a counter. +Whenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

+

Cuckoo Filters

+

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters). +A relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

+

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

+

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets. +We determine two candidate buckets for each element using two different hash functions, h1 and h2.

+

The contains operation will check if either bucket contains the element. +For insertion, if either bucket is empty, the element will be inserted into the empty bucket.

+

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location. +This may trigger another relocation if the alternate location is not empty.

+

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

+

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

+

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

+

The fingerprint size is derived from the desired false positive rate.
+A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

+

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

+

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
+For a given element x, the two candidate buckets are computed as follows:

+

+

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

+

Benchmarking

+

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

+

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

+

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

+

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

+

Experimental Setup

+

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

+

Memory Footprint

+

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that +these factors have on the memory footprint.

+

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. +The size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

+

+
+

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

+
+

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

+

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

+

+
+

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

+
+

Lookup Performance

+

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

+

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

+

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1], +where Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

+

However, the performance difference is negligible.

+

+
+

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative. +The shaded region indicates the standard deviation.

+
+

Insertion Performance

+

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels. +Fig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

+

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

+

+
+

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

+
+

Capacity and Scaling

+

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded. +Bloom filters and Cuckoo filters behave differently in this scenario.

+

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of +relocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

+

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

+

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

+

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

+

The proposed technique is also applicable to Cuckoo filters.

+

Other Filters

+

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

+
    +
  • +

    Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

    +
  • +
  • +

    XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

    +
  • +
+

Conclusion

+

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

+

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

+

References

+

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom. +In Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

+

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

+

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

+

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

+

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

+

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

+

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

]]> Matthias Wright https://github.com/matthias-wright diff --git a/blog/bloom-and-cuckoo-filters-for-cache-summarization/index.html b/blog/bloom-and-cuckoo-filters-for-cache-summarization/index.html index dbcd25f38..238e43fa4 100644 --- a/blog/bloom-and-cuckoo-filters-for-cache-summarization/index.html +++ b/blog/bloom-and-cuckoo-filters-for-cache-summarization/index.html @@ -1,9 +1,9 @@ - + - -Bloom Filters and Cuckoo Filters for Cache Summarization | Fleek Network Docs | Decentralized Edge Platform + +Bloom Filters and Cuckoo Filters for Cache Summarization | Fleek Network Docs | Decentralized Edge Platform @@ -12,36 +12,123 @@ - - - + + + - + -
-

Bloom Filters and Cuckoo Filters for Cache Summarization

· 11 min read
Matthias Wright

Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

Background

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

Bloom Filters

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries. -The answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate. -Of course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions. +

Bloom Filters and Cuckoo Filters for Cache Summarization

· 11 min read
Matthias Wright

Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

+

Background

+

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

+

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

+

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

+

Bloom Filters

+

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries. +The answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

+

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate. +Of course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

+

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions. The resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren't already 1).
-To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters. -Counting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

Each position in the array is no longer a single bit but a group of bits representing a counter. -Whenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

Cuckoo Filters

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters). -A relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets. -We determine two candidate buckets for each element using two different hash functions, h1 and h2.

The contains operation will check if either bucket contains the element. -For insertion, if either bucket is empty, the element will be inserted into the empty bucket.

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location. -This may trigger another relocation if the alternate location is not empty.

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

The fingerprint size is derived from the desired false positive rate.
-A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
-For a given element x, the two candidate buckets are computed as follows:

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

Benchmarking

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

Experimental Setup

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

Memory Footprint

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that -these factors have on the memory footprint.

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. -The size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

Lookup Performance

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1], -where Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

However, the performance difference is negligible.

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative. -The shaded region indicates the standard deviation.

Insertion Performance

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels. -Fig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

Capacity and Scaling

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded. -Bloom filters and Cuckoo filters behave differently in this scenario.

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of -relocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

The proposed technique is also applicable to Cuckoo filters.

Other Filters

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

  • Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

  • XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

Conclusion

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

References

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom. -In Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

- - +To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

+

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

+

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

+

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters. +Counting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

+

Each position in the array is no longer a single bit but a group of bits representing a counter. +Whenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

+

Cuckoo Filters

+

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters). +A relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

+

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

+

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets. +We determine two candidate buckets for each element using two different hash functions, h1 and h2.

+

The contains operation will check if either bucket contains the element. +For insertion, if either bucket is empty, the element will be inserted into the empty bucket.

+

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location. +This may trigger another relocation if the alternate location is not empty.

+

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

+

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

+

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

+

The fingerprint size is derived from the desired false positive rate.
+A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

+

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

+

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
+For a given element x, the two candidate buckets are computed as follows:

+

+

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

+

Benchmarking

+

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

+

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

+

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

+

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

+

Experimental Setup

+

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

+

Memory Footprint

+

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that +these factors have on the memory footprint.

+

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. +The size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

+

+
+

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

+
+

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

+

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

+

+
+

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

+
+

Lookup Performance

+

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

+

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

+

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1], +where Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

+

However, the performance difference is negligible.

+

+
+

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative. +The shaded region indicates the standard deviation.

+
+

Insertion Performance

+

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels. +Fig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

+

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

+

+
+

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

+
+

Capacity and Scaling

+

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded. +Bloom filters and Cuckoo filters behave differently in this scenario.

+

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of +relocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

+

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

+

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

+

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

+

The proposed technique is also applicable to Cuckoo filters.

+

Other Filters

+

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

+
    +
  • +

    Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

    +
  • +
  • +

    XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

    +
  • +
+

Conclusion

+

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

+

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

+

References

+

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom. +In Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

+

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

+

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

+

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

+

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

+

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

+

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

\ No newline at end of file diff --git a/blog/feed.json b/blog/feed.json index 963878058..4c63f89a2 100644 --- a/blog/feed.json +++ b/blog/feed.json @@ -6,11 +6,11 @@ "items": [ { "id": "https://docs.fleek.network/blog/bloom-and-cuckoo-filters-for-cache-summarization", - "content_html": "

Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

Background

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

Bloom Filters

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries.\nThe answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate.\nOf course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions.\nThe resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren't already 1).
\nTo check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters.\nCounting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

Each position in the array is no longer a single bit but a group of bits representing a counter.\nWhenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

Cuckoo Filters

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters).\nA relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets.\nWe determine two candidate buckets for each element using two different hash functions, h1 and h2.

The contains operation will check if either bucket contains the element.\nFor insertion, if either bucket is empty, the element will be inserted into the empty bucket.

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location.\nThis may trigger another relocation if the alternate location is not empty.

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

The fingerprint size is derived from the desired false positive rate.
\nA problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
\nFor a given element x, the two candidate buckets are computed as follows:

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

Benchmarking

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

Experimental Setup

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

Memory Footprint

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that\nthese factors have on the memory footprint.

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1.\nThe size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

Lookup Performance

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1],\nwhere Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

However, the performance difference is negligible.

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative.\nThe shaded region indicates the standard deviation.

Insertion Performance

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels.\nFig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

Capacity and Scaling

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded.\nBloom filters and Cuckoo filters behave differently in this scenario.

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of\nrelocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

The proposed technique is also applicable to Cuckoo filters.

Other Filters

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

  • Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

  • XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

Conclusion

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

References

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom.\nIn Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

", + "content_html": "

Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

\n

Background

\n

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

\n

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

\n

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

\n

Bloom Filters

\n

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries.\nThe answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

\n

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate.\nOf course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

\n

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions.\nThe resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren't already 1).
\nTo check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

\n

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

\n

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

\n

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters.\nCounting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

\n

Each position in the array is no longer a single bit but a group of bits representing a counter.\nWhenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

\n

Cuckoo Filters

\n

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters).\nA relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

\n

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

\n

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets.\nWe determine two candidate buckets for each element using two different hash functions, h1 and h2.

\n

The contains operation will check if either bucket contains the element.\nFor insertion, if either bucket is empty, the element will be inserted into the empty bucket.

\n

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location.\nThis may trigger another relocation if the alternate location is not empty.

\n

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

\n

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

\n

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

\n

The fingerprint size is derived from the desired false positive rate.
\nA problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

\n

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

\n

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
\nFor a given element x, the two candidate buckets are computed as follows:

\n

\n

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

\n

Benchmarking

\n

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

\n

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

\n

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

\n

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

\n

Experimental Setup

\n

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

\n

Memory Footprint

\n

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that\nthese factors have on the memory footprint.

\n

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1.\nThe size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

\n

\n
\n

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

\n
\n

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

\n

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

\n

\n
\n

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

\n
\n

Lookup Performance

\n

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

\n

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

\n

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1],\nwhere Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

\n

However, the performance difference is negligible.

\n

\n
\n

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative.\nThe shaded region indicates the standard deviation.

\n
\n

Insertion Performance

\n

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels.\nFig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

\n

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

\n

\n
\n

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

\n
\n

Capacity and Scaling

\n

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded.\nBloom filters and Cuckoo filters behave differently in this scenario.

\n

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of\nrelocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

\n

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

\n

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

\n

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

\n

The proposed technique is also applicable to Cuckoo filters.

\n

Other Filters

\n

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

\n
    \n
  • \n

    Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

    \n
  • \n
  • \n

    XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

    \n
  • \n
\n

Conclusion

\n

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

\n

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

\n

References

\n

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom.\nIn Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

\n

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

\n

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

\n

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

\n

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

\n

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

\n

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

", "url": "https://docs.fleek.network/blog/bloom-and-cuckoo-filters-for-cache-summarization", "title": "Bloom Filters and Cuckoo Filters for Cache Summarization", "summary": "Summary of our experiment informing whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters.", - "date_modified": "2023-10-31T18:15:43.000Z", + "date_modified": "2023-11-01T18:03:13.000Z", "author": { "name": "Matthias Wright", "url": "https://github.com/matthias-wright" diff --git a/blog/index.html b/blog/index.html index 46948caea..6b612fe56 100644 --- a/blog/index.html +++ b/blog/index.html @@ -1,9 +1,9 @@ - + - -Blog | Fleek Network Docs | Decentralized Edge Platform + +Blog | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-
- - +
\ No newline at end of file diff --git a/blog/rss.xml b/blog/rss.xml index 77dedac3a..a37c310e6 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -4,7 +4,7 @@ Fleek Network Docs | Decentralized Edge Platform Blog https://docs.fleek.network/blog Fleek Network Docs | Decentralized Edge Platform Blog - Tue, 31 Oct 2023 18:15:43 GMT + Wed, 01 Nov 2023 18:03:13 GMT https://validator.w3.org/feed/docs/rss2.html https://github.com/jpmonette/feed en @@ -13,29 +13,119 @@ <![CDATA[Bloom Filters and Cuckoo Filters for Cache Summarization]]> https://docs.fleek.network/blog/bloom-and-cuckoo-filters-for-cache-summarization https://docs.fleek.network/blog/bloom-and-cuckoo-filters-for-cache-summarization - Tue, 31 Oct 2023 18:15:43 GMT + Wed, 01 Nov 2023 18:03:13 GMT - Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

Background

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

Bloom Filters

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries. -The answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate. -Of course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions. + Disclaimer: This is not a general comparison between Bloom filters and Cuckoo filters. This blog post summarizes some of the experiments we conducted to decide whether or not we should replace our implementation of Counting Bloom filters with Cuckoo filters, for a specific use case.

+

Background

+

Nodes on Fleek Network currently use Counting Bloom filters to summarize their cached content. These cache summaries are exchanged with other nodes in order to facilitate content routing.

+

If a particular node does not store a requested piece of content, it can use the Bloom filters that it received from its peers to check if a peer stores the requested content.

+

We are using Counting Bloom filters rather than regular Bloom filters because we need to be able to remove elements from the filter to support cache eviction.

+

Bloom Filters

+

A Bloom filter is a space-efficient probabilistic data structure that can be used to perform approximate set membership queries. +The answer to an approximate set membership query is not no or yes, but rather no or probably. This probably is quantified with the false positive rate.

+

One of the convenient features of Bloom filters is that they can be configured to have a specific false positive rate. +Of course, there is a tradeoff here; the lower the false positive rate, the larger the memory footprint. Bloom filters support two operations: insert and contains.

+

A Bloom filter is represented by an array of m bits together with k independent hash functions. To insert an element into the filter, it is hashed with each of the k hash functions. The resulting hashes are interpreted as integers (modulo m) to obtain k array positions. The bits at these positions are then set to 1 (if there aren't already 1).
-To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters. -Counting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

Each position in the array is no longer a single bit but a group of bits representing a counter. -Whenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

Cuckoo Filters

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters). -A relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets. -We determine two candidate buckets for each element using two different hash functions, h1 and h2.

The contains operation will check if either bucket contains the element. -For insertion, if either bucket is empty, the element will be inserted into the empty bucket.

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location. -This may trigger another relocation if the alternate location is not empty.

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

The fingerprint size is derived from the desired false positive rate.
-A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
-For a given element x, the two candidate buckets are computed as follows:

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

Benchmarking

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

Experimental Setup

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

Memory Footprint

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that -these factors have on the memory footprint.

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. -The size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

Lookup Performance

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1], -where Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

However, the performance difference is negligible.

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative. -The shaded region indicates the standard deviation.

Insertion Performance

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels. -Fig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

Capacity and Scaling

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded. -Bloom filters and Cuckoo filters behave differently in this scenario.

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of -relocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

The proposed technique is also applicable to Cuckoo filters.

Other Filters

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

  • Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

  • XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

Conclusion

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

References

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom. -In Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

]]>
+To check whether or not an element is contained in the filter, the element is hashed k times with the different hash functions.

+

If all bits at the resulting array positions are 1, the element is assumed to be present. If any of the k bits are zero, we can be certain that the queried element is not present in the set.

+

However, even if all bits are 1, it might still be the case that the bits were set by a combination of other elements. This is where the aforementioned false positive rate comes into play.

+

Since we also need a remove operation for our use case, we have been using Counting Bloom filters, a variant of Bloom filters. +Counting Bloom filters retain most of the properties that regular Bloom filters have. The remove operation comes at the cost of an increased memory footprint.

+

Each position in the array is no longer a single bit but a group of bits representing a counter. +Whenever an element is inserted into the filter, the counters for all k positions are incremented by 1. To remove an element, we decrement the counters.

+

Cuckoo Filters

+

Bloom filters are the most known members of a class of data structures called Approximate Membership Query Filters (AMQ Filters). +A relatively recent addition to this class is the Cuckoo filter [1]. Cuckoo filters share many similarities with Bloom filters, especially Counting Bloom filters.

+

They are space-efficient and can be used for approximate set membership queries. Cuckoo filters also support the operations insert, contains, and remove, and have configurable false positive rates.

+

Cuckoo filters are based on Cuckoo hash tables [2] and leverage an optimization called partial-key cuckoo hashing. A basic Cuckoo hash table consists of an array of buckets. +We determine two candidate buckets for each element using two different hash functions, h1 and h2.

+

The contains operation will check if either bucket contains the element. +For insertion, if either bucket is empty, the element will be inserted into the empty bucket.

+

If neither bucket is empty, one of the buckets is selected, and the existing element is removed and inserted into its alternate location. +This may trigger another relocation if the alternate location is not empty.

+

Although the insertion operation may perform a sequence of relocations, the amortized runtime is O(1).

+

Most implementations of Cuckoo hash tables and, consequently, Cuckoo filters will use buckets that can hold multiple elements, as proposed in [3].

+

For Cuckoo filters, the hash table size is reduced by only storing fingerprints - a bit string calculated from an element's hash - rather than key-value pairs.

+

The fingerprint size is derived from the desired false positive rate.
+A problem that arises is that, to relocate existing fingerprints using the Cuckoo hashing approach described above, we need the original hash from which the fingerprint was derived.

+

Of course, we could store this hash somewhere, but the whole point of using fingerprints is to reduce the memory footprint of the filter.

+

The solution to this predicament is the aforementioned partial-key cuckoo hashing, a technique for determining an element's alternate location using only its fingerprint.
+For a given element x, the two candidate buckets are computed as follows:

+

+

An important property of this technique is that h1(x) can also be computed from h2(x) and the fingerprint.

+

Benchmarking

+

As this post mentioned, we are not aiming for a general comparison of Counting Bloom and Cuckoo filters.

+

Instead, we want to determine which filter suits our specific use case better. The two main properties we are looking for are space efficiency and lookup performance.

+

Space efficiency is important because nodes frequently update their cache and have to communicate these changes with their peers. These messages should take up as little bandwidth as possible.

+

Lookup speed is also important because Fleek Network aims to serve user requests as quickly as possible. Checking whether a peer has some content stored in their cache summary should not be a bottleneck.

+

Experimental Setup

+

We are using our own Counting Bloom filter implementation and scalable cuckoo filter Cuckoo filter implementation in Rust, the original cuckoofilter implementation is in C++. All experiments were performed on a Linux machine with 16 GB RAM and an Intel Core i7 (10th Gen). Whenever the experiment is probabilistic, we repeat the experiment 20 times and report the mean and standard deviation.

+

Memory Footprint

+

For both Counting Bloom filters and Cuckoo filters, the memory footprint is determined by two factors: the filter's capacity and the desired false positive rate. In the first experiment, we examine the impact that +these factors have on the memory footprint.

+

To this end, we fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The result is shown in Fig. 1. +The size of Bloom filters scales linearly with the capacity. Cuckoo filters are more space-efficient. This result is consistent with the experiments reported in [1].

+

+
+

Figure 1: We fix the false positive rate and initialize the filters with capacities ranging from 100K to 1M. The y-axis shows the size of the filters in Megabytes.

+
+

Next, we fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. Fig. 2 shows that Cuckoo filters are more space-efficient.

+

The gap between Counting Bloom filters and Cuckoo filters grows as the false positive rate decreases. This is also consistent with experiments in [1].

+

+
+

Figure 2: We fix the capacity and initialize the filters with false positive rates ranging from 0.0001 to 0.5. The y-axis shows the size of the filters in Megabytes.

+
+

Lookup Performance

+

We first add elements to both filters until the capacity is reached. We then measure the lookup performance for different ratios of positive and negative lookups.

+

A positive lookup is for an existing element, and a negative lookup is for an element not contained in the filter. We perform 100K lookups for each ratio and report the average lookup duration and standard deviation.

+

Fig. 3 shows the results. Bloom filters perform slightly better on average than Cuckoo filters. This result is inconsistent with [1], +where Cuckoo filters were reported to have a better lookup performance than Bloom filters. It should be noted here that the authors in [1] use the original C++ Cuckoo filter implementation and their own unreleased Bloom filter implementation. In contrast, we use a Rust Cuckoo filter implementation and our Bloom filter implementation. We cannot easily determine the reason for this discrepancy.

+

However, the performance difference is negligible.

+

+
+

Figure 3: Lookup performance for different ratios of positive and negative lookups. For example, ratio 0.25 indicates that 25% of lookups are positive and 75% are negative. +The shaded region indicates the standard deviation.

+
+

Insertion Performance

+

Less critical than lookup performance but still important for our purposes is insertion performance. We measure how the insertion performance varies for different occupancy levels. +Fig. 4 shows the results. The insertion performance is constant across all levels of occupancy for Bloom filters.

+

For Cuckoo filters, the performance decreases as the filter becomes fuller because more relocations are required. In Fig. 4, the performance for Bloom filters is not constant. It quickly increases and then remains constant. This can be explained by CPU caching.

+

+
+

Figure 4: Insertion performance for different occupancy levels. The shaded region indicates the standard deviation.

+
+

Capacity and Scaling

+

We have mentioned the capacity of a filter several times now. An interesting case is what happens when a filter's capacity is exceeded. +Bloom filters and Cuckoo filters behave differently in this scenario.

+

For Bloom filters, the insertion operation always succeeds. However, the false positive rate will rapidly increase as we exceed the filter's capacity. While Bloom filters fail silently, Cuckoo filters are more explicit. Most implementations have a maximum number of +relocations that will be performed for an insertion. The insertion operation will return an error if more relocations are required.

+

For both filters, we can avoid this problem by simply initializing the filter with a sufficiently large capacity. However, this will increase the memory footprint of the filter.

+

Furthermore, it is difficult to predict how many elements a node on Fleek Network will cache. It is also likely that the number of cached elements will greatly vary for different nodes.

+

Fortunately, a variant of Bloom filters called Scalable Bloom Filters [4] can adapt dynamically to the number of elements stored while guaranteeing a maximum false positive rate.

+

The proposed technique is also applicable to Cuckoo filters.

+

Other Filters

+

While we only looked at Bloom filters and Cuckoo filters, there are other AMQ filters that we want to mention here briefly:

+
    +
  • +

    Quotient filters [5, 6]: Compact hash tables that support insertion, lookup, and deletion. Less space-efficient than Bloom filters and Cuckoo filters.

    +
  • +
  • +

    XOR filters [7]: More space-efficient than Bloom filters and Cuckoo filters. However, they are static, meaning the filter has to be rebuilt if additional elements are added.

    +
  • +
+

Conclusion

+

We examined whether Counting Bloom filters or Cuckoo filters are more suitable for summarizing caches on Fleek Network. Cuckoo filters are more space-efficient, especially for lower false positive rates. Bloom filters have a slightly better insertion and lookup performance for the implementations we tested.

+

Both filters can be adapted to grow and shrink in size dynamically. Since the difference in insertion and lookup performance is negligible while Cuckoo filters are significantly more space-efficient, we favor Cuckoo filters for our use case.

+

References

+

[1] Bin Fan, Dave G. Andersen, Michael Kaminsky, and Michael D. Mitzenmacher. Cuckoo Filter: Practically Better Than Bloom. +In Proceedings of the 10th ACM International Conference on emerging Networking Experiments and Technologies (CoNEXT 14). Association for Computing Machinery, New York, NY, USA, pp. 75-88, 2014.

+

[2] Rasmus Pagha and Flemming Friche Rodler. Cuckoo hashing. Journal of Algorithms, 51(2), pp. 122-144, 2004.

+

[3] Martin Dietzfelbinger and Christoph Weidling. Balanced Allocation and Dictionaries with Tightly Packed Constant Size Bins. Theoretical Computer Science, 380(1), pp. 47-68, 2007.

+

[4] Paulo S. Almeida, Carlos Baquero, Nuno Preguiça, and David Hutchison. Scalable Bloom Filters. Information Processing Letters, 101(6), pp. 255-261, 2007.

+

[5] John G. Cleary. Compact hash tables using bidirectional linear probing. IEEE Transactions on Computers. 33(9), pp. 828-834, 1984.

+

[6] Anna Pagh, Rasmus Pagh, and S. Srinivasa Rao. An optimal Bloom filter replacement. Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 823-829, 2005.

+

[7] Thomas Mueller Graf and Daniel Lemire. Xor Filters: Faster and Smaller Than Bloom and Cuckoo Filters. ACM Journal of Experimental Algorithmics. 25, pp. 1-16, 2020.

]]> fleek network blog engineering diff --git a/blog/tags/blog/index.html b/blog/tags/blog/index.html index b30bfbbe3..251f05bf2 100644 --- a/blog/tags/blog/index.html +++ b/blog/tags/blog/index.html @@ -1,9 +1,9 @@ - + - -One post tagged with "blog" | Fleek Network Docs | Decentralized Edge Platform + +One post tagged with "blog" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One post tagged with "blog"

View All Tags
- - +

One post tagged with "blog"

View All Tags
\ No newline at end of file diff --git a/blog/tags/content-routing/index.html b/blog/tags/content-routing/index.html index 4fef3e2db..671fda454 100644 --- a/blog/tags/content-routing/index.html +++ b/blog/tags/content-routing/index.html @@ -1,9 +1,9 @@ - + - -One post tagged with "content routing" | Fleek Network Docs | Decentralized Edge Platform + +One post tagged with "content routing" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One post tagged with "content routing"

View All Tags
- - +

One post tagged with "content routing"

View All Tags
\ No newline at end of file diff --git a/blog/tags/engineering/index.html b/blog/tags/engineering/index.html index 9bd4d47fd..60cae1b93 100644 --- a/blog/tags/engineering/index.html +++ b/blog/tags/engineering/index.html @@ -1,9 +1,9 @@ - + - -One post tagged with "engineering" | Fleek Network Docs | Decentralized Edge Platform + +One post tagged with "engineering" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One post tagged with "engineering"

View All Tags
- - +

One post tagged with "engineering"

View All Tags
\ No newline at end of file diff --git a/blog/tags/fleek-network/index.html b/blog/tags/fleek-network/index.html index bc34e33e3..453e19580 100644 --- a/blog/tags/fleek-network/index.html +++ b/blog/tags/fleek-network/index.html @@ -1,9 +1,9 @@ - + - -One post tagged with "fleek network" | Fleek Network Docs | Decentralized Edge Platform + +One post tagged with "fleek network" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One post tagged with "fleek network"

View All Tags
- - +

One post tagged with "fleek network"

View All Tags
\ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html index da42aaeba..cfb0694c1 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -1,9 +1,9 @@ - + - -Tags | Fleek Network Docs | Decentralized Edge Platform + +Tags | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/Open-source/code-of-conduct/index.html b/docs/Open-source/code-of-conduct/index.html index 4c4a7e98d..0d291fd3d 100644 --- a/docs/Open-source/code-of-conduct/index.html +++ b/docs/Open-source/code-of-conduct/index.html @@ -1,9 +1,9 @@ - + - -Code of Conduct | Fleek Network Docs | Decentralized Edge Platform + +Code of Conduct | Fleek Network Docs | Decentralized Edge Platform @@ -12,43 +12,67 @@ - - - + + + - + -
-

Code of Conduct

Our Pledge

In the interest of fostering an open and welcoming environment, we as +

Code of Conduct

Our Pledge

+

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation.

Our Standards

Examples of behavior that contributes to a positive environment for our -community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, -and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the -overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or -advances
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email -address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a -professional setting

Our Responsibilities

Project maintainers are responsible for clarifying and enforcing our standards of +appearance, race, religion, or sexual identity and orientation.

+

Our Standards

+

Examples of behavior that contributes to a positive environment for our +community include:

+
    +
  • Demonstrating empathy and kindness toward other people
  • +
  • Being respectful of differing opinions, viewpoints, and experiences
  • +
  • Giving and gracefully accepting constructive feedback
  • +
  • Accepting responsibility and apologizing to those affected by our mistakes, +and learning from the experience
  • +
  • Focusing on what is best not just for us as individuals, but for the +overall community
  • +
+

Examples of unacceptable behavior include:

+
    +
  • The use of sexualized language or imagery, and sexual attention or +advances
  • +
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • +
  • Public or private harassment
  • +
  • Publishing others' private information, such as a physical or email +address, without their explicit permission
  • +
  • Other conduct which could reasonably be considered inappropriate in a +professional setting
  • +
+

Our Responsibilities

+

Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in -response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject +response to any instances of unacceptable behavior.

+

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem -inappropriate, threatening, offensive, or harmful.

Scope

This Code of Conduct applies within all community spaces, and also applies when +inappropriate, threatening, offensive, or harmful.

+

Scope

+

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed -representative at an online or offline event.

Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at dev@fleek.network. -All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the -reporter of any incident.

Attribution

This Code of Conduct is adapted from the Contributor Covenant, version +representative at an online or offline event.

+

Enforcement

+

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at Fleek Network Discord. +All complaints will be reviewed and investigated promptly and fairly.

+

All community leaders are obligated to respect the privacy and security of the +reporter of any incident.

+

Attribution

+

This Code of Conduct is adapted from the Contributor Covenant, version 1.4 and 2.0, -and was generated by contributing-gen.

- - +and was generated by contributing-gen.

\ No newline at end of file diff --git a/docs/Open-source/contributing/index.html b/docs/Open-source/contributing/index.html index 7c1af77d7..03846b720 100644 --- a/docs/Open-source/contributing/index.html +++ b/docs/Open-source/contributing/index.html @@ -1,9 +1,9 @@ - + - -Contributing | Fleek Network Docs | Decentralized Edge Platform + +Contributing | Fleek Network Docs | Decentralized Edge Platform @@ -12,19 +12,93 @@ - - - + + + - + -
-

Contributing to Lightning

First off, thanks for taking the time to contribute!

All types of contributions are encouraged and valued. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions.

info

If you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:

  • Star the project
  • Tweet about it
  • Refer this project in your project's readme
  • Mention the project at local meetups and tell your friends/colleagues

Code of Conduct

This project and everyone participating in it is governed by the +

Contributing to Lightning

+

First off, thanks for taking the time to contribute!

+

All types of contributions are encouraged and valued. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions.

+
info

If you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:

    +
  • Star the project
  • +
  • Tweet about it
  • +
  • Refer this project in your project's readme
  • +
  • Mention the project at local meetups and tell your friends/colleagues
  • +
+

Code of Conduct

+

This project and everyone participating in it is governed by the Lightning Code of Conduct. -By participating, you are expected to uphold this code. Please report unacceptable behavior -to dev@fleek.network.

I Have a Question

info

If you want to ask a question, we assume that you have read the available Documentation.

Before you ask a question, it is best to search for existing Issues that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.

If you then still feel the need to ask a question and need clarification, we recommend the following:

  • Open an Issue.
  • Provide as much context as you can about what you're running into.
  • Provide project and platform versions (rust, cargo, etc), depending on what seems relevant.

We will then take care of the issue as soon as possible.

I Want To Contribute

Legal Notice

When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.

Reporting Bugs

Before Submitting a Bug Report

A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.

  • Make sure that you are using the latest version.
  • Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the documentation. If you are looking for support, you might want to check this section).
  • To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the bug tracker.
  • Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.
  • Collect information about the bug:
    • Stack trace (Traceback)
    • OS, Platform and Version (Linux, macOS, x86, ARM)
    • Version of the compiler, SDK, runtime environment, package manager, depending on what seems relevant.
    • Possibly your input and the output
    • Can you reliably reproduce the issue? And can you also reproduce it with older versions?

How Do I Submit a Good Bug Report?

info

You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to dev@fleek.network.

If you run into an issue with the project:

  • Open an Issue. (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
  • Explain the behavior you would expect and the actual behavior.
  • Please provide as much context as possible and describe the reproduction steps that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
  • Provide the information you collected in the previous section.

Once it's filed:

  • The project team will label the issue accordingly.
  • A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as needs-repro. Bugs with the needs-repro tag will not be addressed until they are reproduced.
  • If the team is able to reproduce the issue, it will be marked needs-fix, as well as possibly other tags (such as critical), and the issue will be left to be implemented by someone.

Suggesting Enhancements

This section guides you through submitting an enhancement suggestion for Lightning, including completely new features and minor improvements to existing functionality. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.

Before Submitting an Enhancement

  • Make sure that you are using the latest version.
  • Read the documentation carefully and find out if the functionality is already covered, maybe by an individual configuration.
  • Perform a search to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
  • Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.

How Do I Submit a Good Enhancement Suggestion?

Enhancement suggestions are tracked as GitHub issues.

  • Use a clear and descriptive title for the issue to identify the suggestion.
  • Provide a step-by-step description of the suggested enhancement in as many details as possible.
  • Describe the current behavior and explain which behavior you expected to see instead and why. At this point you can also tell which alternatives do not work for you.
  • Explain why this enhancement would be useful to most Lightning users. You may also want to point out the other projects that solved it better and which could serve as inspiration.

Workflow

The project is under heavy development to release the first version of the node and launch the testnet. Until then, the core team will be working from the main branch. PRs will be reviewed and treated case by case but the core team will commit directly to main for now.

Join The Project Team

Please visit our Discord to get in touch with us.

Attribution

This guide is based on the contributing-gen. Make your own!

- - +By participating, you are expected to uphold this code. Please report unacceptable behavior to the team via our Discord.

+

I Have a Question

+
info

If you want to ask a question, we assume that you have read the available Documentation.

+

Before you ask a question, it is best to search for existing Issues that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.

+

If you then still feel the need to ask a question and need clarification, we recommend the following:

+
    +
  • Open an Issue.
  • +
  • Provide as much context as you can about what you're running into.
  • +
  • Provide project and platform versions (rust, cargo, etc), depending on what seems relevant.
  • +
+

We will then take care of the issue as soon as possible.

+

I Want To Contribute

+
Legal Notice

When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.

+

Reporting Bugs

+

Before Submitting a Bug Report

+

A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.

+
    +
  • Make sure that you are using the latest version.
  • +
  • Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the documentation. If you are looking for support, you might want to check this section).
  • +
  • To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the bug tracker.
  • +
  • Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.
  • +
  • Collect information about the bug: +
      +
    • Stack trace (Traceback)
    • +
    • OS, Platform and Version (Linux, macOS, x86, ARM)
    • +
    • Version of the compiler, SDK, runtime environment, package manager, depending on what seems relevant.
    • +
    • Possibly your input and the output
    • +
    • Can you reliably reproduce the issue? And can you also reproduce it with older versions?
    • +
    +
  • +
+

How Do I Submit a Good Bug Report?

+
info

You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to the team–request it through Discord.

+

If you run into an issue with the project:

+
    +
  • Open an Issue. (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
  • +
  • Explain the behavior you would expect and the actual behavior.
  • +
  • Please provide as much context as possible and describe the reproduction steps that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
  • +
  • Provide the information you collected in the previous section.
  • +
+

Once it's filed:

+
    +
  • The project team will label the issue accordingly.
  • +
  • A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as needs-repro. Bugs with the needs-repro tag will not be addressed until they are reproduced.
  • +
  • If the team is able to reproduce the issue, it will be marked needs-fix, as well as possibly other tags (such as critical), and the issue will be left to be implemented by someone.
  • +
+

Suggesting Enhancements

+

This section guides you through submitting an enhancement suggestion for Lightning, including completely new features and minor improvements to existing functionality. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.

+

Before Submitting an Enhancement

+
    +
  • Make sure that you are using the latest version.
  • +
  • Read the documentation carefully and find out if the functionality is already covered, maybe by an individual configuration.
  • +
  • Perform a search to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
  • +
  • Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.
  • +
+

How Do I Submit a Good Enhancement Suggestion?

+

Enhancement suggestions are tracked as GitHub issues.

+
    +
  • Use a clear and descriptive title for the issue to identify the suggestion.
  • +
  • Provide a step-by-step description of the suggested enhancement in as many details as possible.
  • +
  • Describe the current behavior and explain which behavior you expected to see instead and why. At this point you can also tell which alternatives do not work for you.
  • +
  • Explain why this enhancement would be useful to most Lightning users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
  • +
+

Workflow

+

The project is under heavy development to release the first version of the node and launch the testnet. Until then, the core team will be working from the main branch. PRs will be reviewed and treated case by case but the core team will commit directly to main for now.

+

Join The Project Team

+

Please visit our Discord to get in touch with us.

+

Attribution

+

This guide is based on the contributing-gen. Make your own!

\ No newline at end of file diff --git a/docs/Open-source/index.html b/docs/Open-source/index.html index da8ffd1c3..dd9ffa9bb 100644 --- a/docs/Open-source/index.html +++ b/docs/Open-source/index.html @@ -1,9 +1,9 @@ - + - -Open-source | Fleek Network Docs | Decentralized Edge Platform + +Open-source | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,20 @@ - - - + + + - + -
-
- - +
\ No newline at end of file diff --git a/docs/Open-source/repositories/index.html b/docs/Open-source/repositories/index.html index 217ad1b79..163c275d6 100644 --- a/docs/Open-source/repositories/index.html +++ b/docs/Open-source/repositories/index.html @@ -1,9 +1,9 @@ - + - -Repositories | Fleek Network Docs | Decentralized Edge Platform + +Repositories | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,16 @@ - - - + + + - + -
-

Repositories

The Fleek Network's repositories contain a collection of source code, libraries, and other software artifacts that are used to build and maintain our products collaboratively.

These repositories are carefully managed and versioned to ensure that developers can easily collaborate and work together on code changes. They are also regularly audited to ensure that only high-quality software is included and that security vulnerabilities are quickly identified and addressed.

Overall, our open-source repositories are an essential part of our development process and help us deliver reliable and secure products to our community.

Find all our repositories on Github

- - +

Repositories

The Fleek Network's repositories contain a collection of source code, libraries, and other software artifacts that are used to build and maintain our products collaboratively.

+

These repositories are carefully managed and versioned to ensure that developers can easily collaborate and work together on code changes. They are also regularly audited to ensure that only high-quality software is included and that security vulnerabilities are quickly identified and addressed.

+

Overall, our open-source repositories are an essential part of our development process and help us deliver reliable and secure products to our community.

+

Find all our repositories on Github

\ No newline at end of file diff --git a/docs/develop/client/index.html b/docs/develop/client/index.html index d5665d176..3a141798b 100644 --- a/docs/develop/client/index.html +++ b/docs/develop/client/index.html @@ -1,9 +1,9 @@ - + - -Client | Fleek Network Docs | Decentralized Edge Platform + +Client | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/develop/json-rpc/index.html b/docs/develop/json-rpc/index.html index 80e5bf947..144a51033 100644 --- a/docs/develop/json-rpc/index.html +++ b/docs/develop/json-rpc/index.html @@ -1,9 +1,9 @@ - + - -JSON-RPC | Fleek Network Docs | Decentralized Edge Platform + +JSON-RPC | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/develop/overview/index.html b/docs/develop/overview/index.html index 58a70bb02..86b5399c5 100644 --- a/docs/develop/overview/index.html +++ b/docs/develop/overview/index.html @@ -1,9 +1,9 @@ - + - -Overview | Fleek Network Docs | Decentralized Edge Platform + +Overview | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

Overview

Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.

- - +

Overview

Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.

\ No newline at end of file diff --git a/docs/develop/service-development/index.html b/docs/develop/service-development/index.html index 2d0090586..6b3ab0e08 100644 --- a/docs/develop/service-development/index.html +++ b/docs/develop/service-development/index.html @@ -1,9 +1,9 @@ - + - -Service development | Fleek Network Docs | Decentralized Edge Platform + +Service development | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 3e7fb3f3b..94db27f2b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,9 +1,9 @@ - + - -About | Fleek Network Docs | Decentralized Edge Platform + +About | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,24 @@ - - - + + + - + -
-

Fleek Network is an open-source Edge Computing Platform to accelerate the development and execution of decentralized Web Services.

The system builds on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators who can operate nodes, build services that use the network’s resources, or consume Fleek Network services on the Edge.

Applications, platforms and protocols build and utilize decentralized services on Fleek Network to optimize performance and reduce dependency on centralized cloud providers. Developers can build faster and launch better products by offloading parts of the stack to the Edge to focus on core features.

tip

To participate in the alpha Testnet, you can begin by setting up and running nodes. Check the requirements and find the onboarding instructions to enable you to install a network node successfully.

info

The Fleek Network's documentation is organized as follows:

Documentation brief breakdown of the Fleek Network.

Engineering offers a deeper look into how our engineering team works, research, and technology behind Fleek Network.

Guides provide step-by-step instructions for performing specific tasks.

References section provides short materials for Fleek Network command-line interfaces (CLIs), and application programming interfaces (APIs) for managing the resources and development. It is assumed that you already have a basic understanding of important concepts.

Roadmap

We aim to bring computation to where demand is. You can find Fleek Network's public roadmap here.

Need help?

Be part of a community! Join the Fleek Network discord if you want to ask a question, require help or exchange ideas.

Found an issue?

Issues can be reported in the correspondent repositories here and any other reports by messaging us on discord.

- - +
+

Fleek Network is an open-source Edge Computing Platform to accelerate the development and execution of decentralized Web Services.

+

The system builds on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators who can operate nodes, build services that use the network’s resources, or consume Fleek Network services on the Edge.

+

Applications, platforms and protocols build and utilize decentralized services on Fleek Network to optimize performance and reduce dependency on centralized cloud providers. Developers can build faster and launch better products by offloading parts of the stack to the Edge to focus on core features.

+
tip

To participate in the alpha Testnet, you can begin by setting up and running nodes. Check the requirements and find the onboarding instructions to enable you to install a network node successfully.

+
info

The Fleek Network's documentation is organized as follows:

Documentation brief breakdown of the Fleek Network.

Engineering offers a deeper look into how our engineering team works, research, and technology behind Fleek Network.

Guides provide step-by-step instructions for performing specific tasks.

References section provides short materials for Fleek Network command-line interfaces (CLIs), and application programming interfaces (APIs) for managing the resources and development. It is assumed that you already have a basic understanding of important concepts.

+

Roadmap

+

We aim to bring computation to where demand is. You can find Fleek Network's public roadmap here.

+

Need help?

+

Be part of a community! Join the Fleek Network discord if you want to ask a question, require help or exchange ideas.

+

Found an issue?

+

Issues can be reported in the correspondent repositories here and any other reports by messaging us on discord.

\ No newline at end of file diff --git a/docs/learn/delivery-acknowledgements/index.html b/docs/learn/delivery-acknowledgements/index.html index de4b7df85..3f0165196 100644 --- a/docs/learn/delivery-acknowledgements/index.html +++ b/docs/learn/delivery-acknowledgements/index.html @@ -1,9 +1,9 @@ - + - -Delivery Acknowledgements | Fleek Network Docs | Decentralized Edge Platform + +Delivery Acknowledgements | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,42 @@ - - - + + + - + -
-

Overview

When a client signs a message, it creates a Delivery Acknowledgement that confirms a successful service computation delivery by a node. This process ensures the immutability and integrity of the message (the client cannot change or reverse it) and also includes metadata about the commodities consumed by the node during the service execution. This metadata helps in calculating the reward that the node will receive.

info

The Narwhal and Bullshark consensus primary transaction is the order of batched Delivery Acknowledgements. Every time a node serves a request, it gathers Delivery Acknowledgements that, upon submission, reward the node at the end of an epoch (which is approximately 24 hours).

To claim the reward and other fees, nodes can add received Delivery Acknowledgements to a local pool and periodically submit them in batches to reach a consensus. This process also ensures consistent updates to the client's balance in stable coin.

The amounts deducted from all clients during an epoch, move to a payout pool which is distributed fairly to node account owners based on the work performed in the epoch.

For a more in-depth dive into Delivery Acknowledgements-related topics, it's advised to read the whitepaper. Also, a holistic version of the Network is available on our documentation site.

SNARKs (Non-interactive zero-knowledge proofs)

SNARKs is an acronym that stands for Succinct Non-interactive Argument of Knowledge. A SNARK is a cryptographic proof that allows one party to prove to another that it knows a secret without revealing the secret itself.

It's a product of encryption that makes direct communication between a prover and verifier needless, effectively removing any intermediaries.

note

A SNARK is a cryptographic proof that is utilized as an optimization for Delivery Acknowledgements. It's not a requirement to understand Delivery Acknowledgements. However, an important implementation detail for performance and message handling.

The periodic submission of Delivery Acknowledgements, allows us to leverage SNARK proofs recursively, aggregating many of these Delivery Acknowledgements. By batching, we lower the expenses associated with networking and computing power which would've been much higher if verified individually.

Optimization

The Fleek Network uses Narwhal as a DAG-mempool for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine.

tip

Read The Consensus Algorithm section, to learn more about Narwhal and Bullshark. Alternatively, check the whitepaper for more detailed information.

Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked node at the end of every epoch (about 24 hours). Integrity is met due to the node rotation that occurs at each period, reducing risks associated with nodes being compromised and affecting the committee's purity.

Since the number of Delivery Acknowledgements can be considerably high, only a few of these are handled by consensus. It rolls up the head and tail from the batch list and leverages Zero-Knowledge proofs recursively to validate them. By rolling up a smaller footprint, it optimizes data and network performance without compromising the security of the protocol.

In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining nodes performantly and securely.

Node vs. Client Process Flow

The process by which Delivery Acknowledgement works is that a node starts by sending an encrypted request to a client and once received, a signed Delivery Acknowledgement attests to it.

Upon Delivery Acknowledgment, the node should transmit an encryption key.

If a node fails to send a key after the client signs the Delivery Acknowledgement, the committee safeguards the user request interest by sending a valid rebuilt key back.

As a consequence of malicious behavior, the committee has the node slashed by the protocol-slashing mechanism penalizing dishonest participation while allowing the request flow to run smoothly for the betterment of the end-user experience.

note

The process ensures that nodes get paid for work performed and clients get the requests fulfilled. It helps achieve decentralization and trustworthiness as the process applies to any sort of client-server communication, such as Gateways. Also, considering the impact this might have on the network, a node encryption key response has a small impact performance of 300 milliseconds (0.3ms) of latency.

Content and Streaming Verifiability

A Delivery Acknowledgement message signing is deterministic, completely dependent on its inputs and the sequence of the instructions fulfilled which are strictly validated.

Thus, the entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability. This ensures that the hash being requested is the one being served.

Learn more about it in the Content Addressing section.

Delivery Acknowledgement Customization

A Service can have a custom configuration to specify how Delivery Acknowledgements should behave or work. Patterns and conventions should be expected to emerge from the Service builder community and best practices.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Overview

+

When a client signs a message, it creates a Delivery Acknowledgement that confirms a successful service computation delivery by a node. This process ensures the immutability and integrity of the message (the client cannot change or reverse it) and also includes metadata about the commodities consumed by the node during the service execution. This metadata helps in calculating the reward that the node will receive.

+
info

The Narwhal and Bullshark consensus primary transaction is the order of batched Delivery Acknowledgements. Every time a node serves a request, it gathers Delivery Acknowledgements that, upon submission, reward the node at the end of an epoch (which is approximately 24 hours).

+

To claim the reward and other fees, nodes can add received Delivery Acknowledgements to a local pool and periodically submit them in batches to reach a consensus. This process also ensures consistent updates to the client's balance in stable coin.

+

The amounts deducted from all clients during an epoch, move to a payout pool which is distributed fairly to node account owners based on the work performed in the epoch.

+

For a more in-depth dive into Delivery Acknowledgements-related topics, it's advised to read the whitepaper. Also, a holistic version of the Network is available on our documentation site.

+

SNARKs (Non-interactive zero-knowledge proofs)

+

SNARKs is an acronym that stands for Succinct Non-interactive Argument of Knowledge. A SNARK is a cryptographic proof that allows one party to prove to another that it knows a secret without revealing the secret itself.

+

It's a product of encryption that makes direct communication between a prover and verifier needless, effectively removing any intermediaries.

+
note

A SNARK is a cryptographic proof that is utilized as an optimization for Delivery Acknowledgements. It's not a requirement to understand Delivery Acknowledgements. However, an important implementation detail for performance and message handling.

+

The periodic submission of Delivery Acknowledgements, allows us to leverage SNARK proofs recursively, aggregating many of these Delivery Acknowledgements. By batching, we lower the expenses associated with networking and computing power which would've been much higher if verified individually.

+

Optimization

+

The Fleek Network uses Narwhal as a DAG-mempool for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine.

+
tip

Read The Consensus Algorithm section, to learn more about Narwhal and Bullshark. Alternatively, check the whitepaper for more detailed information.

+

Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked node at the end of every epoch (about 24 hours). Integrity is met due to the node rotation that occurs at each period, reducing risks associated with nodes being compromised and affecting the committee's purity.

+

Since the number of Delivery Acknowledgements can be considerably high, only a few of these are handled by consensus. It rolls up the head and tail from the batch list and leverages Zero-Knowledge proofs recursively to validate them. By rolling up a smaller footprint, it optimizes data and network performance without compromising the security of the protocol.

+

In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining nodes performantly and securely.

+

Node vs. Client Process Flow

+

The process by which Delivery Acknowledgement works is that a node starts by sending an encrypted request to a client and once received, a signed Delivery Acknowledgement attests to it.

+

Upon Delivery Acknowledgment, the node should transmit an encryption key.

+

If a node fails to send a key after the client signs the Delivery Acknowledgement, the committee safeguards the user request interest by sending a valid rebuilt key back.

+

As a consequence of malicious behavior, the committee has the node slashed by the protocol-slashing mechanism penalizing dishonest participation while allowing the request flow to run smoothly for the betterment of the end-user experience.

+
note

The process ensures that nodes get paid for work performed and clients get the requests fulfilled. It helps achieve decentralization and trustworthiness as the process applies to any sort of client-server communication, such as Gateways. Also, considering the impact this might have on the network, a node encryption key response has a small impact performance of 300 milliseconds (0.3ms) of latency.

+

Content and Streaming Verifiability

+

A Delivery Acknowledgement message signing is deterministic, completely dependent on its inputs and the sequence of the instructions fulfilled which are strictly validated.

+

Thus, the entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability. This ensures that the hash being requested is the one being served.

+

Learn more about it in the Content Addressing section.

+

Delivery Acknowledgement Customization

+

A Service can have a custom configuration to specify how Delivery Acknowledgements should behave or work. Patterns and conventions should be expected to emerge from the Service builder community and best practices.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/learn/developers/index.html b/docs/learn/developers/index.html index 061d43da0..399068db3 100644 --- a/docs/learn/developers/index.html +++ b/docs/learn/developers/index.html @@ -1,9 +1,9 @@ - + - -Developers | Fleek Network Docs | Decentralized Edge Platform + +Developers | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,24 @@ - - - + + + - + -
-

Developers

info

This documentation is currently placeholder as the team prepares for an early testnet release around the month of August, where full documentation for node runners and services will release.

Developer in Fleek Network - Current State

As a developer, you will be able to build or use services running on Fleek Network's decentralized edge infrastructure.

This will be possible after our initial Testnet rollouts in August, and after we publish our Service Development Kit (SDK) for service development. Currently, we are finalizing the core developments of the protocol and setting the foundations for the testnet release.

How can you Start Getting Involved Today?

  1. Get familiar with the project with our Whitepaper.
  2. Review our open-source codebase on Github.
  3. Learn about services in Fleek Network.
  4. Want to run a node? Join our community in Discord to get updates when possible.
  5. Or sign up to the newsletter on our website for updates.
- - +

Developers

info

This documentation is currently placeholder as the team prepares for an early testnet release around the month of August, where full documentation for node runners and services will release.

+

Developer in Fleek Network - Current State

+

As a developer, you will be able to build or use services running on Fleek Network's decentralized edge infrastructure.

+

This will be possible after our initial Testnet rollouts in August, and after we publish our Service Development Kit (SDK) for service development. Currently, we are finalizing the core developments of the protocol and setting the foundations for the testnet release.

+

How can you Start Getting Involved Today?

+
    +
  1. Get familiar with the project with our Whitepaper.
  2. +
  3. Review our open-source codebase on Github.
  4. +
  5. Learn about services in Fleek Network.
  6. +
  7. Want to run a node? Join our community in Discord to get updates when possible.
  8. +
  9. Or sign up to the newsletter on our website for updates.
  10. +
\ No newline at end of file diff --git a/docs/learn/introduction/index.html b/docs/learn/introduction/index.html index 30064897d..2320c6b5a 100644 --- a/docs/learn/introduction/index.html +++ b/docs/learn/introduction/index.html @@ -1,9 +1,9 @@ - + - -Introduction | Fleek Network Docs | Decentralized Edge Platform + +Introduction | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,30 @@ - - - + + + - + -
-

Introduction

The Core of Fleek Network offers a foundational layer to enable developers to build and deploy Edge Services efficiently. It abstracts away the development complexities of consensus, cryptography, storage and peer-to-peer networking, etc, to simplify things conceptually. It frees developers and teams to focus on what matters the most to reach business goals.

In contrast, end users have access to network services on the edge, that provide different kinds of computation and data processing features.

We'll take a brief look into why does it exist, how does it work, and learn about services, amongst other topics.

tip

For a deep dive into Fleek Network, check the whitepaper section.

Why does it exist?

Many Web3 products rely on the conventional models of centralized cloud infrastructure, due to the lack of corresponding alternatives.

Some of the most popular Web3 products rely on content delivery and edge computing provided by the monopolized cloud market. Unlike a decentralized system, the opposite is more vulnerable to attacks, as computation and data can be easily manipulated to suit the monopoly's business goals.

Meanwhile, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage, offering a sustainable alternative to traditional centralized architectures.

The Fleek Network provides the alternative, paving the way to a decentralized edge computing future that is secure, transparent and accessible to everybody in the world.

Motivation

The Fleek Network team was motivated to create a decentralized Edge Platform due to the current infrastructure trends, user concerns and demands. The modern web is shifting from the cloud to the edge, which is a reflection of the internet's growing user base and the need for low latency for users worldwide.

This development is a crucial and necessary step towards significantly enhancing the reliability, efficiency, and decentralization of Web3 applications and platforms, such as the next iteration of the Fleek platform.

How does it work?

When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated.

Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed.

The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the epoch (about 24h). This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Introduction

+

The Core of Fleek Network offers a foundational layer to enable developers to build and deploy Edge Services efficiently. It abstracts away the development complexities of consensus, cryptography, storage and peer-to-peer networking, etc, to simplify things conceptually. It frees developers and teams to focus on what matters the most to reach business goals.

+

In contrast, end users have access to network services on the edge, that provide different kinds of computation and data processing features.

+

We'll take a brief look into why does it exist, how does it work, and learn about services, amongst other topics.

+
tip

For a deep dive into Fleek Network, check the whitepaper section.

+

Why does it exist?

+

Many Web3 products rely on the conventional models of centralized cloud infrastructure, due to the lack of corresponding alternatives.

+

Some of the most popular Web3 products rely on content delivery and edge computing provided by the monopolized cloud market. Unlike a decentralized system, the opposite is more vulnerable to attacks, as computation and data can be easily manipulated to suit the monopoly's business goals.

+

Meanwhile, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage, offering a sustainable alternative to traditional centralized architectures.

+

The Fleek Network provides the alternative, paving the way to a decentralized edge computing future that is secure, transparent and accessible to everybody in the world.

+

Motivation

+

The Fleek Network team was motivated to create a decentralized Edge Platform due to the current infrastructure trends, user concerns and demands. The modern web is shifting from the cloud to the edge, which is a reflection of the internet's growing user base and the need for low latency for users worldwide.

+

This development is a crucial and necessary step towards significantly enhancing the reliability, efficiency, and decentralization of Web3 applications and platforms, such as the next iteration of the Fleek platform.

+

How does it work?

+

When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated.

+

Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed.

+

The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the epoch (about 24h). This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/learn/services/index.html b/docs/learn/services/index.html index 713a5c373..15574c00e 100644 --- a/docs/learn/services/index.html +++ b/docs/learn/services/index.html @@ -1,9 +1,9 @@ - + - -Services | Fleek Network Docs | Decentralized Edge Platform + +Services | Fleek Network Docs | Decentralized Edge Platform @@ -12,17 +12,69 @@ - - - + + + - + -
-

Overview

A Fleek Network Service is a modular application that runs on nodes and allows users to perform well-defined functions or some specific tasks. Services are scalable and performant due to edge computation and networking features provided by the core principles of the network.

As a permissionless system, services are built by developers who are free to build and deploy them to run on the decentralized edge platform. Applications can be of any kind but are generally described as web services. These are cryptographically secure and run within a fair economically incentivized model. The services are hosted in user-managed resources and are highly available to customers and end-users in exchange for rewards.

A Service Development Toolkit (SDK) facilitates access to core APIs and resources for developers. Services run in a sandboxed environment (unable to access the host's processes, hardware and kernel directly) and are restricted to specific features such as cryptography, networking and storage. The service implementation source code is fully managed by the author(s), owner(s) and development team(s).

info

At an early stage, core services are statically linked to the node's binary process (Lightning). In the future, the Fleek Network protocol aims to load services dynamically.

Service Development Toolkit (SDK)

The Service Development Toolkit (SDK) abstracts the core protocol features, including the communication with the middleware which is done through an Inter-Process Communication (IPC) system. Any system-level programming language, such as C/C++, Go or Rust can establish a communication channel with the middleware. By using the toolkit, a Service builder accelerates the development process e.g. effectively enables nodes to generate Delivery Acknowledgements (SNARKs) that prove work completion which is used to determine rewards, along with other cryptographic commitments.

info

As discussed in The Network section, Delivery Acknowledgements include metadata about the commodities consumed by a node while executing or running a service. It also contains cryptographically secured metadata that are tamper-proof and used to determine the reward attributed to a node.

A commitment ensures clients receive the correct work output that is being requested, such as content, a computed response, etc. In addition to preventing malicious services from coercing a node into making false commitments. Likewise, the commitments generated by a node determine the bandwidth and computation served, amongst other commodities.

Handshake

The Handshake component is the entry point to external communications with a node. It enables clients to establish an encrypted communication session with the node and interact with services over a secure transport layer (TLS+TCP or QUIC). On establishing a client and node connection, public keys are exchanged and a lane is negotiated for the session. A Handshake is required for a client to access and interact with a service.

Service geographic distribution

The network takes care of infrastructure coverage, scalability, and incentivizing edge nodes to run services. It employs a range of algorithms to assign edge nodes in each geographic region to handle the work for each service, guaranteeing the most efficient route. Additionally, when a service experiences a surge in demand and scales up, any unused services are automatically downscaled. By dynamically allocating resources, it eliminates unnecessary resource usage and allows efficient garbage collection. All of this is achieved while maintaining optimal levels of trust, security, infrastructure coverage, and performance guarantees.

Resources as commodities

The hardware resources used by a service are packaged and measured as commodities. Includes things like bandwidth and CPU, along with their respective commodities such as GB(s) and CPU cycles. Delivery Acknowledgements detail the commodities used by a node during service execution. The data is used to reward the node based on the current pricing of those commodities set by the network governance.

Use-cases

Building on Fleek Network's Decentralized Edge Infrastructure unlocks various opportunities and advantages for Service builders, that empower them to implement most of the following concepts.

Traditional Services

Edge Functions

Edge computing comes in many flavors, and Fleek Network can support many serverless or edge computing functions. For example, low-cost computation for JavaScript functions, Lambda, runtimes or Cloudflare Workers-like computing. Can also perform deterministic computation, consensus-based computation, ZK-computation, and EVM computation. The network is non-opinionated and enables developers to refine their computing service in great detail.

SSR/ISR

One applied edge compute use-case that can be built is Server-side Rendering (SSR) or Incremental Static Regeneration Service (ISR) on top of a container/serverless engine. Given the granularity of content verification within the core's hashing, streaming of particular pieces of data can be optimized and parallelized across multiple nodes. Such as chunking pages of static sites and regenerating only where needed.

Hosting

Web3 apps are generally composed of a backend and a frontend stack. The backends are considerably decentralized but often have the client-side facing interface hosted into a central cloud provider. Given the desirability of content delivery acceleration services for a snappy user experience, that end customers demand. The Fleek Network takes a big step forward on this topic, as services can leverage the block store and content addressability (IPFS) for an application host provider.

As we have today with user stories like S3 or Netlify, a service can use Fleek Network as a storage layer for static sites. Similarly, a CDN or SSR can complement static site hosting by accelerating and dynamically computing user needs. In consequence, the reward mechanism would distribute rewards fairly to every actor in the computation and fulfillment of paying customers for these requests, e.g. service builder, node operator, etc.

CDN

A decentralized CDN is a big missing piece in the Web3 infra stack. Every protocol, middleware, service, and app can benefit from content acceleration. Today most projects use popular CDNs in front of their stacks for optimization and performance improvement e.g. availability and latency. A decentralized CDN built on Fleek Network can gain great notoriety in the blockchain and Web3 development communities, due to its benefits and principles, without sacrificing performance and cost of integration.

The dCDN service can cache content based on the user request and popularity, and put it in the speediest location based on the network reputation system, computation and routing response timings. Conceptually similar to a traditional CDN, but abstracting the geo-location that is usually specified by user-selected zones.

tip

While the network does not possess a specific concept of geography, it gains an implicit understanding of geographical proximity through the data it collects on latency and hop counts between nodes, which is a part of the reputation system.

Learn more about how Fleek Network behaves by reading the whitepaper.

Container Orchestration

A decentralized orchestration service built on a content-addressable edge network can bring benefits in performance and delivery. A service could utilize the native content-addressing and Blake3 hashing and verified data streaming to partition large container image files and serve them at scale in a multi-region environment.

Fleek Network can act as a p2p CDN, serving container chunks in a parallelized, verified, and performant way–without sacrificing decentralization. Similar to concepts that can be found in Docker image hosting, Docker Swarm clustering, etc.

CRDT Databases

Database services in a decentralized edge platform with a content addressable core can benefit from the network's data deduplication and integrity characteristics.

Particularly a CRDT database service could be built to converge data from multiple edge locations replicas. Given all data is content-addressed, unique content hashes allow for easy differentiation and verification as the data is replicated.

Web3 Services

Blockchain Snapshots

Interchain synchronization of a full-node history is CPU-intensive. Can take hours, days or weeks depending on blockchain technology. On Fleek Network's core, the internal blockchain is based on content addressability which stores snapshots of the state HEAD. It utilizes decentralized content acceleration for node entire-state synchronization for higher speed.

A service can be built that does a similar process for any chain. By automating snapshot storage timely and in-synchronization to the chain HEAD. It can deliver an entire state to a node rapidly.

Decentralized IPFS Pinning

All content on the Fleek Network is content addressed and referred to by the CID, which mapping of the CID to the origin is stored in perpetuity. Coupled with the built-in file system interlinked to decentralized storage protocols such as Arweave and Filecoin, an IPFS pinning service can be built. A pinning service for IPFS that provides the user experience we are accustomed to, but using decentralized infrastructure, which today's IPFS pinning services fail to offer.

Worth mentioning that an IPFS pinning service as such, would be cheaper and provide better availability, performance and security guarantees. For example, as the network stores the CID-to-origin mapping in perpetuity, even if an IPFS file is lost it can be easily retrieved if there's at least one origin.

VM's (EVM, zkVM's, etc.)

A service that deploys a virtual machine, such as many zk-VMs, or the EVM can be built and deployed to Fleek Network. It can provide compute in the zk-VM and provide the zk-SNARK from the node, proving the correctness of the response. In addition, the network routing can ensure that the zk-VM computation is happening in the closest proximity to the client based on latency and other network factors.

Ephemeral Rollups

The Fleek Network can be utilized as a short-term service platform for a variety of applications or side-chaining that compute state and roll it up to a smart contract. An NFT minting or game event that occurs during a short period, can roll up state to a smart contract after the event time elapses.

To help users mitigate gas costs and feeds while providing instant finality throughout an event. Consequently, roll-ups would run on a decentralized network, that is fault-resistant and highly performant.

Proof Generation

As a result of the rise of Zero-Knowledge proofs (SNARKs, STARKs) for performance and cost-efficient proof generation, there are benefits for computing them closer to end-users and in a decentralized manner which Fleek Network Edge Network entails.

For example, a hypothetical Groth16 service can read parameters from configuration files in a file system and generate a proof based on public user custom parameters.

Alternative Sequencers

As encountered by most sequencers that post transactions to Layer-1 settlement contracts (which are mostly done over centralized processes), Layer-2 networks bypass these by posting them manually. -This causes long finalization times and a reduction in block speeds on Layer-1, which is contrary to what users are familiar with and find ordinary on Layer-2.

In Fleek Network, a service builder can offer an alternative to a Layer-2 sequencer, that is decentralized and more reliable by batching and posting to Layer-1 settlement contracts. With equivalent Layer-2 settlement times.

An additional benefit can be enabling end-user gasless transaction submissions by disregarding a Layer-2 gas token to submit transactions to Layer-1.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Overview

+

A Fleek Network Service is a modular application that runs on nodes and allows users to perform well-defined functions or some specific tasks. Services are scalable and performant due to edge computation and networking features provided by the core principles of the network.

+

As a permissionless system, services are built by developers who are free to build and deploy them to run on the decentralized edge platform. Applications can be of any kind but are generally described as web services. These are cryptographically secure and run within a fair economically incentivized model. The services are hosted in user-managed resources and are highly available to customers and end-users in exchange for rewards.

+

A Service Development Toolkit (SDK) facilitates access to core APIs and resources for developers. Services run in a sandboxed environment (unable to access the host's processes, hardware and kernel directly) and are restricted to specific features such as cryptography, networking and storage. The service implementation source code is fully managed by the author(s), owner(s) and development team(s).

+
info

At an early stage, core services are statically linked to the node's binary process (Lightning). In the future, the Fleek Network protocol aims to load services dynamically.

+

Service Development Toolkit (SDK)

+

The Service Development Toolkit (SDK) abstracts the core protocol features, including the communication with the middleware which is done through an Inter-Process Communication (IPC) system. Any system-level programming language, such as C/C++, Go or Rust can establish a communication channel with the middleware. By using the toolkit, a Service builder accelerates the development process e.g. effectively enables nodes to generate Delivery Acknowledgements (SNARKs) that prove work completion which is used to determine rewards, along with other cryptographic commitments.

+
info

As discussed in The Network section, Delivery Acknowledgements include metadata about the commodities consumed by a node while executing or running a service. It also contains cryptographically secured metadata that are tamper-proof and used to determine the reward attributed to a node.

+

A commitment ensures clients receive the correct work output that is being requested, such as content, a computed response, etc. In addition to preventing malicious services from coercing a node into making false commitments. Likewise, the commitments generated by a node determine the bandwidth and computation served, amongst other commodities.

+

Handshake

+

The Handshake component is the entry point to external communications with a node. It enables clients to establish an encrypted communication session with the node and interact with services over a secure transport layer (TLS+TCP or QUIC). On establishing a client and node connection, public keys are exchanged and a lane is negotiated for the session. A Handshake is required for a client to access and interact with a service.

+

Service geographic distribution

+

The network takes care of infrastructure coverage, scalability, and incentivizing edge nodes to run services. It employs a range of algorithms to assign edge nodes in each geographic region to handle the work for each service, guaranteeing the most efficient route. Additionally, when a service experiences a surge in demand and scales up, any unused services are automatically downscaled. By dynamically allocating resources, it eliminates unnecessary resource usage and allows efficient garbage collection. All of this is achieved while maintaining optimal levels of trust, security, infrastructure coverage, and performance guarantees.

+

Resources as commodities

+

The hardware resources used by a service are packaged and measured as commodities. Includes things like bandwidth and CPU, along with their respective commodities such as GB(s) and CPU cycles. Delivery Acknowledgements detail the commodities used by a node during service execution. The data is used to reward the node based on the current pricing of those commodities set by the network governance.

+

Use-cases

+

Building on Fleek Network's Decentralized Edge Infrastructure unlocks various opportunities and advantages for Service builders, that empower them to implement most of the following concepts.

+

Traditional Services

+

Edge Functions

+

Edge computing comes in many flavors, and Fleek Network can support many serverless or edge computing functions. For example, low-cost computation for JavaScript functions, Lambda, runtimes or Cloudflare Workers-like computing. Can also perform deterministic computation, consensus-based computation, ZK-computation, and EVM computation. The network is non-opinionated and enables developers to refine their computing service in great detail.

+

SSR/ISR

+

One applied edge compute use-case that can be built is Server-side Rendering (SSR) or Incremental Static Regeneration Service (ISR) on top of a container/serverless engine. Given the granularity of content verification within the core's hashing, streaming of particular pieces of data can be optimized and parallelized across multiple nodes. Such as chunking pages of static sites and regenerating only where needed.

+

Hosting

+

Web3 apps are generally composed of a backend and a frontend stack. The backends are considerably decentralized but often have the client-side facing interface hosted into a central cloud provider. Given the desirability of content delivery acceleration services for a snappy user experience, that end customers demand. The Fleek Network takes a big step forward on this topic, as services can leverage the block store and content addressability (IPFS) for an application host provider.

+

As we have today with user stories like S3 or Netlify, a service can use Fleek Network as a storage layer for static sites. Similarly, a CDN or SSR can complement static site hosting by accelerating and dynamically computing user needs. In consequence, the reward mechanism would distribute rewards fairly to every actor in the computation and fulfillment of paying customers for these requests, e.g. service builder, node operator, etc.

+

CDN

+

A decentralized CDN is a big missing piece in the Web3 infra stack. Every protocol, middleware, service, and app can benefit from content acceleration. Today most projects use popular CDNs in front of their stacks for optimization and performance improvement e.g. availability and latency. A decentralized CDN built on Fleek Network can gain great notoriety in the blockchain and Web3 development communities, due to its benefits and principles, without sacrificing performance and cost of integration.

+

The dCDN service can cache content based on the user request and popularity, and put it in the speediest location based on the network reputation system, computation and routing response timings. Conceptually similar to a traditional CDN, but abstracting the geo-location that is usually specified by user-selected zones.

+
tip

While the network does not possess a specific concept of geography, it gains an implicit understanding of geographical proximity through the data it collects on latency and hop counts between nodes, which is a part of the reputation system.

+

Learn more about how Fleek Network behaves by reading the whitepaper.

+

Container Orchestration

+

A decentralized orchestration service built on a content-addressable edge network can bring benefits in performance and delivery. A service could utilize the native content-addressing and Blake3 hashing and verified data streaming to partition large container image files and serve them at scale in a multi-region environment.

+

Fleek Network can act as a p2p CDN, serving container chunks in a parallelized, verified, and performant way–without sacrificing decentralization. Similar to concepts that can be found in Docker image hosting, Docker Swarm clustering, etc.

+

CRDT Databases

+

Database services in a decentralized edge platform with a content addressable core can benefit from the network's data deduplication and integrity characteristics.

+

Particularly a CRDT database service could be built to converge data from multiple edge locations replicas. Given all data is content-addressed, unique content hashes allow for easy differentiation and verification as the data is replicated.

+

Web3 Services

+

Blockchain Snapshots

+

Interchain synchronization of a full-node history is CPU-intensive. Can take hours, days or weeks depending on blockchain technology. On Fleek Network's core, the internal blockchain is based on content addressability which stores snapshots of the state HEAD. It utilizes decentralized content acceleration for node entire-state synchronization for higher speed.

+

A service can be built that does a similar process for any chain. By automating snapshot storage timely and in-synchronization to the chain HEAD. It can deliver an entire state to a node rapidly.

+

Decentralized IPFS Pinning

+

All content on the Fleek Network is content addressed and referred to by the CID, which mapping of the CID to the origin is stored in perpetuity. Coupled with the built-in file system interlinked to decentralized storage protocols such as Arweave and Filecoin, an IPFS pinning service can be built. A pinning service for IPFS that provides the user experience we are accustomed to, but using decentralized infrastructure, which today's IPFS pinning services fail to offer.

+

Worth mentioning that an IPFS pinning service as such, would be cheaper and provide better availability, performance and security guarantees. For example, as the network stores the CID-to-origin mapping in perpetuity, even if an IPFS file is lost it can be easily retrieved if there's at least one origin.

+

VM's (EVM, zkVM's, etc.)

+

A service that deploys a virtual machine, such as many zk-VMs, or the EVM can be built and deployed to Fleek Network. It can provide compute in the zk-VM and provide the zk-SNARK from the node, proving the correctness of the response. In addition, the network routing can ensure that the zk-VM computation is happening in the closest proximity to the client based on latency and other network factors.

+

Ephemeral Rollups

+

The Fleek Network can be utilized as a short-term service platform for a variety of applications or side-chaining that compute state and roll it up to a smart contract. An NFT minting or game event that occurs during a short period, can roll up state to a smart contract after the event time elapses.

+

To help users mitigate gas costs and feeds while providing instant finality throughout an event. Consequently, roll-ups would run on a decentralized network, that is fault-resistant and highly performant.

+

Proof Generation

+

As a result of the rise of Zero-Knowledge proofs (SNARKs, STARKs) for performance and cost-efficient proof generation, there are benefits for computing them closer to end-users and in a decentralized manner which Fleek Network Edge Network entails.

+

For example, a hypothetical Groth16 service can read parameters from configuration files in a file system and generate a proof based on public user custom parameters.

+

Alternative Sequencers

+

As encountered by most sequencers that post transactions to Layer-1 settlement contracts (which are mostly done over centralized processes), Layer-2 networks bypass these by posting them manually. +This causes long finalization times and a reduction in block speeds on Layer-1, which is contrary to what users are familiar with and find ordinary on Layer-2.

+

In Fleek Network, a service builder can offer an alternative to a Layer-2 sequencer, that is decentralized and more reliable by batching and posting to Layer-1 settlement contracts. With equivalent Layer-2 settlement times.

+

An additional benefit can be enabling end-user gasless transaction submissions by disregarding a Layer-2 gas token to submit transactions to Layer-1.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/learn/the-network/index.html b/docs/learn/the-network/index.html index 260d3d3e5..7bd42073a 100644 --- a/docs/learn/the-network/index.html +++ b/docs/learn/the-network/index.html @@ -1,9 +1,9 @@ - + - -The Network | Fleek Network Docs | Decentralized Edge Platform + +The Network | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,275 @@ - - - + + + - + -
-

Protocol

The Fleek Network is designed to deliver computation cheaper, faster and more efficiently than existing cloud providers by allowing anyone to offer computer resources for rewards. Including, secured information about who requested it on the network.

The Fleek Network is a proof-of-stake protocol, that takes advantage of Ethereum for staking, payments, governance and other economic features.

This is achieved by a combination of SNARKs (Succinct Non-interactive Argument of Knowledge), Narwhal and Bullshark consensus, including other cryptographic and economic guarantees to achieve a trustless decentralized and long-term sustainable environment.

It's important to keep track of these components to ensure that the system is running fairly. The protocol holds the state for the following:

  • Token Balances
  • Staking details
  • The Node Reputation
  • Data on how much work a Node has performed in a given epoch

As a decentralized network, the state of these is replicated across all of the distributed nodes in the network by forming a blockchain, in which consensus on transactions transmutes to the final immutable state.

The Consensus algorithm

Narwhal and Bullshark, are high-performant mempool and consensus engines by Mysten Labs. The Fleek Network uses Narwhal as a DAG-mempool for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine.

note

The primary transactions being ordered by the consensus algorithm is the batch of Delivery Acknowledgements stored in a local list of transactions before commitment to the blockchain (memory pool).

The Narwhal algorithm is based on the separation between the dissemination and transaction ordering to achieve high throughput in the blockchain system. The protocol achieves reliable dissemination and storage of causal histories of transactions. Narwhal tolerates an asynchronous network and maintains high performance despite failures.

Bullshark is a zero-message overhead consensus algorithm that handles transactions that require total ordering (linear ordering), and synchronization of the transactions between nodes and the global network state.

To put it simply, where Narwhal ensures data is submitted to consensus, Bullshark sorts out the order of the data.

Total ordering

Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked Node at the end of every epoch (about 24 hours). The integrity is met due to the Node rotation that occurs at each period, reducing risks associated with Nodes being compromised and affecting the committee purity. In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining Nodes.

The Edge Network

Edge computing is about processing data at the closest point of interaction, while cloud computing is about processing data in a data center.

Instead of resolving requests in the cloud, where roundtrip times are noticeable due to latency, the processing of requests is done at your closest convenience, which means getting you a quicker response and a better user experience.

Fleek Network's Edge computing is computing that's done at the speediest location to the user. Provided by Network Nodes that are favorably dispersed and operated by a diverse community.

The community members host and operate the Network Nodes, which form the Edge Platform, and contribute to an autonomous and decentralized network of web services.

Some of the resources provided by the network nodes are:

  • Disk Storage
  • Processing power (CPU Units)
  • Network bandwidth

The Edge Network aims to provide computational resources where a user most needs them.

Incentives and rewards

Fleek Network issues FLK–an ERC-20 fungible token created using the Ethereum Blockchain–which Node operators must stake to perform work on the network. On the other hand, developers and clients use stablecoins in a fair exchange for the commodities and resources consumed on the network.

warning

A Node Operator has to stake FLK to have a node participate in the Network. A node without FLK staken is referred to as a stakeless node. A stakeless node cannot contribute or participate in the network, as there would be no way to punish them for malicious behavior. Thus, all fully operational nodes in the network, without exception, have a stake.

A node is a process that runs on a machine that provides resources to the network. The resources are packaged as commodities. For instance:

  • Availability / Up-time
  • Bandwidth
  • CPU

These commodities are exchanged fairly and pricing is decided by the ecosystem and network governance. To ensure a stable and predictable income stream, the rewards awarded to Node Operators are predetermined at a stable rate (USD).

Service providers are rewarded in many ways, for instance, by fulfilling cache requests per bandwidth, and sharing cached data with other peers–as an incentive for a shared economy, therefore the more bandwidth served, the more tokens received.

When an epoch ends, which is about 24 hours, the rewards from all submitted Delivery Acknowledgements are distributed to the edge nodes.

Delivery Acknowledgements (SNARKs)

A Delivery Acknowledgement is a signed message by a client attesting that a node has successfully delivered a task to the client. These acknowledgements are instantly finalized locally and irreversible by the client.

The Delivery Acknowledgements are cryptographically secured and tamper-proof, meaning that the transaction contains irrefutable details about all parts involved in the transaction.

A Delivery Acknowledgement includes metadata about the commodities consumed by a node while executing or running a service. Also contains metadata that is used to determine the reward attributed to a Node.

tip

A Node provides the computational resources to the network and keeps track of doings in a list of Delivery Acknowledgements, on which the rewards' mechanism is based at the end of each Epoch (about 24 hours).

Finally, Delivery Acknowledgements are gathered and batched by nodes before being submitted to the core protocol and committee as described in the consensus section.

To learn more, visit the section Delivery Acknowledgements.

Reputation system

The Fleek Network has a reputation system where nodes rate each other. The ratings are collected timely and an aggregation algorithm calculates the overall rate for each node at the end of every epoch.

Noteworthy, any reputation system that depends on players attributing rates to each other can be exploited. For prevention, a custom version of the EigenTrust algorithm is used to reduce dishonest and incorrect measurements.

Some other procedures where a node is rated are on the interactions between nodes while servicing. Meaning that a node earns a rate per service interaction.

The information is replicated across the network securely and cannot be tampered with and is a valuable and reliable source of knowledge for optimization tasks.

A few optimization tasks include:

  • Optimizing the network flow
  • Assigning services to nodes
  • Determining proximity

The reputation system is used to determine the service routing and work allocation.

Actors and their roles

The Fleek Network is a system where actors play important roles, namely:

  • Client
  • Developer
  • End-user
  • Node Operator

Each of these users has a huge role in contributing and participating in the network. They make it possible and lively by requesting resources, through usage, payments or by simply being a plain member of the community.

Client

The Client is a user that consumes data from the network, for instance:

  • A developer interested in using the CDN in an application
  • A media publisher wanting to accelerate access to media assets
  • A system administrator looking for instructions to troubleshoot the client library
  • A Solutions Architect looking for a quick overview of an alternative service for a centralized provider
  • Instructions to install and use the client library
  • A Web developer looking to decentralize an API service

A client is a paying customer for the commodities and resources consumed on the network, e.g. a CDN service customer who pays for bandwidth use, etc.

This type of user can:

  • Top up the account to have enough credit to exchange for service
  • Check the balance
  • Check the cost(s) of the service(s)
  • Many others (relative to the service offering that might be of a third-party provider)

Developer

The Developer is a knowledgeable user that enables the business logic and end-to-end experience to the end-user through applications or services. Take, for example:

  • Protocol development contributor
  • Service creator
  • Client library user
  • Contributions to the client libraries and tools
  • The library method and parameters references
  • Versions and features support

A developer is often described as a builder who enables the end-to-end experience in the Fleek Network. A builder that can work at the Service provider level, protocol development, core contributor and, amongst others, at a higher level, such as providing support and integrations of services in applications or third-party systems.

End-user

An End-user is someone to whom the data or computation output is ultimately delivered, amongst others:

  • Static assets, such as images rendered on a website
  • Image optimization output for a very particular size request
  • Server-side rendering
  • Data response provided via HTTP Gateway or RPC

The service outputs are for the end-user, but payment for the service is the responsibility of the client that manages the application or service the end-user interacts with.

Node operator

A Node Operator is a kind of system administrator who builds, configures, installs or maintains a node(s) in a server. To mention a few use cases:

  • Builds the node binary from source-code
  • Updates the source-code repository, which node is built on
  • Runs the installation wizard to setup a node
  • Installs the node manually
  • Configures the node
  • Secures the server

The Fleek Network works as a distributed system of nodes where each node operates and contributes to the system’s overall health and functionality with computational resources by network operation demand.

Nodes are set up to run on servers by operators. Operators are system administrators who build, configure, install and maintain the nodes in a server. Generally, a node is installed and runs on a computer or virtual private server (VPS) lent by a cloud service provider.

info

A server is a computer machine where a Node runs and can be located anywhere in the world.

The Node Operator is a critical system actor that is incentivized to manage one or many nodes. Ultimately making the Fleek Network what is about, a decentralized orchestration layer and infrastructure.

Any individual who's interested in learning can become a Node Operator by reading the documentation, or content made available by the network core team and community.

Multi-Service Support

The Fleek Network provides a base layer as the foundation of many Services. Simplicity at its core, it handles Proof-of-delivery and other client-node exchanges, such as user balance and rewards.

It's designed to allow anyone to create and deploy a custom service to the network, without the need for anyone's permission. The protocol slashing mechanisms help deter malicious behavior and penalize dishonest participants while allowing the service, a modular unit, to operate at maximum availability and performance.

Within a diverse ecosystem where node operators are free to choose which services to run, e.g. an operator might find popular services more appealing economically. Thus, the network is nonhomogenous, made up of different types of resource servers, requirements and services.

Abstraction and build blocks

Abstraction is conceptually useful in decentralized and distributed web service development because of how incredibly complex it can become and the speed at which developers have to react to the outside world. The core team put most of the complexity into well-defined building blocks.

The building blocks provide you with enough level of detail that the modern developer experience demands but with cryptographic, economical and security assurances for confident service development, amongst others.

The Fleek Network implementation is open source and freely available for consultation and contribution when more detail or refinement is required by the community and other observers.

Modular architecture

Lightning is the repository name containing the Fleek multi-service Edge Network implementation.

The project aims to provide a higher focus on engineering productivity from the get-go, an improvement over the original Ursa implementation, which was exclusively focused on CDN, one of many services Lightning offers support.

info

Lightning is the open-source Rust implementation of Fleek Network. The repository contains the source code for the implementation of Fleek Network at https://github.com/fleek-network/lightning.

Some of the main differences from Ursa’s implementation are:

  • The dynamic service loading approach
  • Decoupling of the network's core from the service implementation
  • Higher-level architecture that makes it easier to maintain and within reach of external contributors.

Lightning’s development approach is more open, which allows the community to build services and also helps the core team work on other features or services in parallel.

Repository

The repository contains the source code for the implementation of the Fleek Network and is located at https://github.com/fleek-network/lightning, a private repository that will go public after the whitepaper announcement and roadmap.

Directory structure

There are three top-level directories, namely lib, core and services.

Lib - These are open-source libraries created to help tackle the project features and packaged with a friendly license in the Rust ecosystem (MIT, Apache).

Core - The primary protocol implementation, where node crate contains the essential feature set or base functionality. Includes the interfaces crate, where the top-down specification of the project is located.

Services - A Service is a business logic provider built with the SDK (Service Development Kit). A service is decoupled from the core of the network and loaded dynamically [1] during the runtime using FFI (foreigner function interface).

draco
├── lib
│ ├── affair
│ ├── atomo
│ └── blake3-tree
├── core
│ ├── node
│ ├── interfaces
│ ├── application
│ ├── blockstore
│ ├── consensus
│ ├── handshake
│ ├── identity
│ ├── origin-arweave
│ ├── origin-filecoin
│ ├── origin-ipfs
│ ├── pod
│ ├── reputation
│ ├── rpc
│ └── sdk
└── services
└── cdn

Interfaces

The design pattern adopted for this software is highly inspired by the Object-Oriented model described by Alan Kay, which may be a bit different from OOP which grew to fame due to Java.

In a nutshell, this is similar to the same idea, and we represent different units of computation and process as objects that communicate with each other by message passing.

Identity on the Fleek Network

The identity on the Fleek Network is issued and controlled by individuals, which means that there aren't any central entities that issue, manage or control it for you. An identity is created without permission from anyone, and stored securely and privately.

caution

Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility.

The types of Identities found in the Fleek Network are used for:

  • Node (for BFT DAG consensus)
  • Node Network (for fast communication signatures)
  • Account Owner (any actor holding a balance on Fleek Network)

The Public-key cryptography used in the network identities are the following curves:

  • BLS12-381 is a pairing-friendly elliptic curve construction from the BLS family
  • Ed25519 is the EdDSA signature scheme using SHA-512 (SHA-2) and Curve25519
  • Secp256k1 is the Elliptic Curve Digital Signature Algorithm (ECDSA) used by Bitcoin and Ethereum

The identities are associated with the elliptic curves as follows:

  • A Node key (ConsensusPublicKey) is BLS12-381 which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates
  • A Node Networking key (NodePublicKey) is Ed25519 used for the speed and performance of the network communications
  • Account Owner keys are based on secp256k1, which corresponds to an Ethereum Address

Transactions can be signed by the Account Owner—an Ethereum key (secp256k1) owned by the user on an external wallet and initially required to bridge assets from L2—and Node identities

Node Networking with Narwhal utilizes the Node Network key (Ed25519) is much more efficient when dealing with a single signature instead of aggregated signatures.

Content addressability and verifiability

The way content is distributed, handled and stored defines how trustworthy's a protocol. Some of the primitives to achieve it has roots in linked data, immutability, verification and the semantic web.

On Fleek Network, you either hint about data packed into a format called a Content Archive (CAR) or an existing CID of a CAR file—which hash addresses are unique and universally addressable. The network never stores data, only a cache layer to existing storage as origins. For example, on HTTP PUT we're just telling the network that there's some origin it should care about and cache.

Some of the principles that help us provide guarantees to end-users require a high ability for content verification, as a consequence, the immutability of files is critical to the system.

info

To emphasize, immutability means the state of not changing, or being unable to change!

Immutability

Fleek Network deals with files in a manner where the content determines the address in which the user of the system can locate and verify it unquestionably. This is possible due to cryptography, in which the same data always produces the same hash deterministically.

  • A file whose content determines the hash, but is also impossible to invert it
  • Unable to reconstruct data from a hash
  • It's unique, not two files produce the same file or content
  • Any change in the content should always generate a completely different hash

In retrospect, what we have on the web today are files accessible via a URL address and the problem with this approach is that the content is not intrinsically tight to the address e.g. the content can change and the URL remains the same. That is the problematic way we access files on the web today, which we call "Location addressing", and the way we solve it for the web of tomorrow is called "Content addressing".

Content addressing

Content addressing is where we use a hash to access the content, and it allows us to verify that the content we received is the content we asked for. For this, we use a special hash called CID (Content Identifier), a cryptography hash function that maps input of arbitrary size to the output of a fixed size—the content identifiers are short, regardless of the size of the content, and the address does not tell us where the content is stored.

The entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability.

info

The CID is a sort of string-like binary that is human-friendlier in comparison to the underlying binary, which is way longer.

info

Caching and deduplication are possible due to the immutability of content e.g. if content changes, let's say that an image has some new detail, the files share many of the same bytes. The amount of data we have to transfer to fetch is minimum, we'd only pull the difference. In today's web, we'd have to transfer both files in full, which is a worse path on resource allocation and performance.

Hash functions

The hash function for creating CIDs uses sha-256, but there is support for other hashing algorithms, such as sha1 (used by Git), sha2-256, sha3-255, blake2b-160, blake3, etc. Some older algorithms are proven not to be collision-free, so if algorithms can break, we have to switch the hash algorithm we use in the future! The problem with this switching of algorithms is the need to find a future-proof way of identifying the hash functions used to generate the hash, as well as the hash name.

Multihash is a protocol that comes into play to provide us with valuable metadata for future-proofing. In an attempt to summarize it, it's the composition of a hash placed at the end, a prefix, as a number to identify the algorithm used, and a number, to identify the hash name. Therefore, we'd start raising some questions. Without it, how would we get the data back without the ability to identify how it was encoded? Some users could use cbor, protocol buffers, json, etc, and there might be plenty of good reasons why for those choices. Maybe it's a compact binary encoding that is very efficient for storage, easy to work with, etc.

What's important is that it is the user's choice and why IPLD becomes useful for Fleek Network's use cases. A system for understanding and working with data that is made of a data model, codecs, tools for linking, and then a handful of other powerful features that help us develop a decentralized application.

Interplanetary linked data (IPLD)

Interplanetary linked data (IPLD) provides us with all the metadata prefixes to soothe the system needs, and provides us with the data model of the content-addressable web, as discussed earlier. IPLD is a set of conventions for creating decentralized data structures that are universally addressable and linkable.

A Distributed Hash Table (DHT) enables the network to store an IPLD or flexible mapping from any "immutable data pointer", such as a CID to its corresponding Blake3 hash. As mentioned in the Content Addressing section, the network operates over Blake3 hashing for efficient content handling.

info

These addressable and linkable data structures will allow us to do for data what URLs and links did for HTML web pages (Quote from IPLD).

Content Addressable aRchive (CAR)

The core of Fleek Network understands the IPLD CAR Content Addressable aRchive, which unpacks and traverses to cache individual files. The archive's content is hashed as Blake3, which Fleek Network uses to address all data coming and going into the network, regardless of their origin.

warning

Despite handling IPLD CAR files, it serves raw archive content to the client. In other words, if a request for a complete CAR came through a gateway, the gateway (as a client) would have to build the file from the streamed data before sending it as a response to the end user.

info

The ordering of blocks in a CAR is random, e.g. two different CAR files storing the same content. This causes the need to traverse the archive (DAG-PB/UnixFS) to store the CAR blocks as individual content.

HTTP PUT Request Origin

An Origin is a location where content originates from. In the context of Fleek Network, the origin has to be supported for the data retrieval to function, some examples of what will be supported are Arweave, Filecoin and IPFS. For instance, the first supported storage is IPFS and a user of Fleek Network should have the data pinned for IPFS somewhere to have it cached by the Fleek Network CDN service on an HTTP PUT request.

info

A Client-side library can provide helpers to upload to some origin, such as IPFS and call the HTTP PUT for the origin.

Binary process

The Fleek Network binary process is the program that's been compiled down to machine code that the computer's processor can understand and execute. The project source code repository from which the binary is compiled is called Lightning. Most node operators set up the nodes by running the install wizard, others do it manually. When a node operator runs a node, it means that the binary process is launched in the node operator's computer. It runs as a separate instance in memory, with its own set of resources and permissions. The Fleek Network binary is an essential component that contributes to the network formation, distribution and decentralization. It runs on a supported Linux operating system, enabling users to run a wide variety of computing services and perform complex tasks.

Ports

Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully.

We reserve the following top level ranges:

  • TCP: 4200-4299
  • UDP: 4300-4399

Each service in the node has 10 ports reserved within each range.

note

For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node.

tip

For the Node Operators who opt to run the get.fleek.network assisted installer, the ports are verified if in use.

The Node process requires the following ports:

Connection Pool (4x00-4x09)

  • Netkit QUIC: 4300 (UDP)

Consensus (4x10-4x19)

  • Mempool: 4210 (TCP)
  • Primary: 4310 (UDP)
  • Worker: 4311 (UDP)

Handshake (4x20-4x29)

  • HTTP: 4220 (TCP)
  • TCP: 4221 (TCP)
  • WebRTC: 4320 (UDP)
  • WebTransport: 4321 (UDP)

RPC (4x30-4x39)

  • HTTP: 4230 (TCP)
  • WebSocket / WebTransport?

DHT (4x40-4x49)

  • UDP: 4340 (UDP)

Broadcast

  • Uses connection pool

Blockstore Server

  • Uses connection pool
required

The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports.

JSON-RPC Interface

A JSON-RPC (JavaScript Object Notation Remote Procedure Call) is a protocol that enables communication between client and server applications. The Fleek Network JSON-RPC API enables JSON-RPC interaction with Fleek Network Node.

Fleek Network JSON-RPC API reference documentation is available at https://fleek-network.github.io/lightning/api-documentation.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Protocol

+

The Fleek Network is designed to deliver computation cheaper, faster and more efficiently than existing cloud providers by allowing anyone to offer computer resources for rewards. Including, secured information about who requested it on the network.

+

The Fleek Network is a proof-of-stake protocol, that takes advantage of Ethereum for staking, payments, governance and other economic features.

+

This is achieved by a combination of SNARKs (Succinct Non-interactive Argument of Knowledge), Narwhal and Bullshark consensus, including other cryptographic and economic guarantees to achieve a trustless decentralized and long-term sustainable environment.

+

It's important to keep track of these components to ensure that the system is running fairly. The protocol holds the state for the following:

+
    +
  • Token Balances
  • +
  • Staking details
  • +
  • The Node Reputation
  • +
  • Data on how much work a Node has performed in a given epoch
  • +
+

As a decentralized network, the state of these is replicated across all of the distributed nodes in the network by forming a blockchain, in which consensus on transactions transmutes to the final immutable state.

+

The Consensus algorithm

+

Narwhal and Bullshark, are high-performant mempool and consensus engines by Mysten Labs. The Fleek Network uses Narwhal as a DAG-mempool for transaction ordering (as total ordering or linear order) and Bullshark as the consensus engine.

+
note

The primary transactions being ordered by the consensus algorithm is the batch of Delivery Acknowledgements stored in a local list of transactions before commitment to the blockchain (memory pool).

+

The Narwhal algorithm is based on the separation between the dissemination and transaction ordering to achieve high throughput in the blockchain system. The protocol achieves reliable dissemination and storage of causal histories of transactions. Narwhal tolerates an asynchronous network and maintains high performance despite failures.

+

Bullshark is a zero-message overhead consensus algorithm that handles transactions that require total ordering (linear ordering), and synchronization of the transactions between nodes and the global network state.

+

To put it simply, where Narwhal ensures data is submitted to consensus, Bullshark sorts out the order of the data.

+
Total ordering

Total ordering is performed by a committee-based approach. The committee is formed from a subset of any valid staked Node at the end of every epoch (about 24 hours). The integrity is met due to the Node rotation that occurs at each period, reducing risks associated with Nodes being compromised and affecting the committee purity. In summary, a subset of Nodes forms a new committee at each Epoch, that does the transaction ordering of the workload computed and submitted by the remaining Nodes.

+

The Edge Network

+

Edge computing is about processing data at the closest point of interaction, while cloud computing is about processing data in a data center.

+

Instead of resolving requests in the cloud, where roundtrip times are noticeable due to latency, the processing of requests is done at your closest convenience, which means getting you a quicker response and a better user experience.

+

Fleek Network's Edge computing is computing that's done at the speediest location to the user. Provided by Network Nodes that are favorably dispersed and operated by a diverse community.

+

The community members host and operate the Network Nodes, which form the Edge Platform, and contribute to an autonomous and decentralized network of web services.

+

Some of the resources provided by the network nodes are:

+
    +
  • Disk Storage
  • +
  • Processing power (CPU Units)
  • +
  • Network bandwidth
  • +
+

The Edge Network aims to provide computational resources where a user most needs them.

+

Incentives and rewards

+

Fleek Network issues FLK–an ERC-20 fungible token created using the Ethereum Blockchain–which Node operators must stake to perform work on the network. On the other hand, developers and clients use stablecoins in a fair exchange for the commodities and resources consumed on the network.

+
warning

A Node Operator has to stake FLK to have a node participate in the Network. A node without FLK staken is referred to as a stakeless node. A stakeless node cannot contribute or participate in the network, as there would be no way to punish them for malicious behavior. Thus, all fully operational nodes in the network, without exception, have a stake.

+

A node is a process that runs on a machine that provides resources to the network. The resources are packaged as commodities. For instance:

+
    +
  • Availability / Up-time
  • +
  • Bandwidth
  • +
  • CPU
  • +
+

These commodities are exchanged fairly and pricing is decided by the ecosystem and network governance. To ensure a stable and predictable income stream, the rewards awarded to Node Operators are predetermined at a stable rate (USD).

+

Service providers are rewarded in many ways, for instance, by fulfilling cache requests per bandwidth, and sharing cached data with other peers–as an incentive for a shared economy, therefore the more bandwidth served, the more tokens received.

+

When an epoch ends, which is about 24 hours, the rewards from all submitted Delivery Acknowledgements are distributed to the edge nodes.

+

Delivery Acknowledgements (SNARKs)

+

A Delivery Acknowledgement is a signed message by a client attesting that a node has successfully delivered a task to the client. These acknowledgements are instantly finalized locally and irreversible by the client.

+

The Delivery Acknowledgements are cryptographically secured and tamper-proof, meaning that the transaction contains irrefutable details about all parts involved in the transaction.

+

A Delivery Acknowledgement includes metadata about the commodities consumed by a node while executing or running a service. Also contains metadata that is used to determine the reward attributed to a Node.

+
tip

A Node provides the computational resources to the network and keeps track of doings in a list of Delivery Acknowledgements, on which the rewards' mechanism is based at the end of each Epoch (about 24 hours).

+

Finally, Delivery Acknowledgements are gathered and batched by nodes before being submitted to the core protocol and committee as described in the consensus section.

+

To learn more, visit the section Delivery Acknowledgements.

+

Reputation system

+

The Fleek Network has a reputation system where nodes rate each other. The ratings are collected timely and an aggregation algorithm calculates the overall rate for each node at the end of every epoch.

+

Noteworthy, any reputation system that depends on players attributing rates to each other can be exploited. For prevention, a custom version of the EigenTrust algorithm is used to reduce dishonest and incorrect measurements.

+

Some other procedures where a node is rated are on the interactions between nodes while servicing. Meaning that a node earns a rate per service interaction.

+

The information is replicated across the network securely and cannot be tampered with and is a valuable and reliable source of knowledge for optimization tasks.

+

A few optimization tasks include:

+
    +
  • Optimizing the network flow
  • +
  • Assigning services to nodes
  • +
  • Determining proximity
  • +
+

The reputation system is used to determine the service routing and work allocation.

+

Actors and their roles

+

The Fleek Network is a system where actors play important roles, namely:

+
    +
  • Client
  • +
  • Developer
  • +
  • End-user
  • +
  • Node Operator
  • +
+

Each of these users has a huge role in contributing and participating in the network. They make it possible and lively by requesting resources, through usage, payments or by simply being a plain member of the community.

+

Client

+

The Client is a user that consumes data from the network, for instance:

+
    +
  • A developer interested in using the CDN in an application
  • +
  • A media publisher wanting to accelerate access to media assets
  • +
  • A system administrator looking for instructions to troubleshoot the client library
  • +
  • A Solutions Architect looking for a quick overview of an alternative service for a centralized provider
  • +
  • Instructions to install and use the client library
  • +
  • A Web developer looking to decentralize an API service
  • +
+

A client is a paying customer for the commodities and resources consumed on the network, e.g. a CDN service customer who pays for bandwidth use, etc.

+

This type of user can:

+
    +
  • Top up the account to have enough credit to exchange for service
  • +
  • Check the balance
  • +
  • Check the cost(s) of the service(s)
  • +
  • Many others (relative to the service offering that might be of a third-party provider)
  • +
+

Developer

+

The Developer is a knowledgeable user that enables the business logic and end-to-end experience to the end-user through applications or services. Take, for example:

+
    +
  • Protocol development contributor
  • +
  • Service creator
  • +
  • Client library user
  • +
  • Contributions to the client libraries and tools
  • +
  • The library method and parameters references
  • +
  • Versions and features support
  • +
+

A developer is often described as a builder who enables the end-to-end experience in the Fleek Network. A builder that can work at the Service provider level, protocol development, core contributor and, amongst others, at a higher level, such as providing support and integrations of services in applications or third-party systems.

+

End-user

+

An End-user is someone to whom the data or computation output is ultimately delivered, amongst others:

+
    +
  • Static assets, such as images rendered on a website
  • +
  • Image optimization output for a very particular size request
  • +
  • Server-side rendering
  • +
  • Data response provided via HTTP Gateway or RPC
  • +
+

The service outputs are for the end-user, but payment for the service is the responsibility of the client that manages the application or service the end-user interacts with.

+

Node operator

+

A Node Operator is a kind of system administrator who builds, configures, installs or maintains a node(s) in a server. To mention a few use cases:

+
    +
  • Builds the node binary from source-code
  • +
  • Updates the source-code repository, which node is built on
  • +
  • Runs the installation wizard to setup a node
  • +
  • Installs the node manually
  • +
  • Configures the node
  • +
  • Secures the server
  • +
+

The Fleek Network works as a distributed system of nodes where each node operates and contributes to the system’s overall health and functionality with computational resources by network operation demand.

+

Nodes are set up to run on servers by operators. Operators are system administrators who build, configure, install and maintain the nodes in a server. Generally, a node is installed and runs on a computer or virtual private server (VPS) lent by a cloud service provider.

+
info

A server is a computer machine where a Node runs and can be located anywhere in the world.

+

The Node Operator is a critical system actor that is incentivized to manage one or many nodes. Ultimately making the Fleek Network what is about, a decentralized orchestration layer and infrastructure.

+

Any individual who's interested in learning can become a Node Operator by reading the documentation, or content made available by the network core team and community.

+

Multi-Service Support

+

The Fleek Network provides a base layer as the foundation of many Services. Simplicity at its core, it handles Proof-of-delivery and other client-node exchanges, such as user balance and rewards.

+

It's designed to allow anyone to create and deploy a custom service to the network, without the need for anyone's permission. The protocol slashing mechanisms help deter malicious behavior and penalize dishonest participants while allowing the service, a modular unit, to operate at maximum availability and performance.

+

Within a diverse ecosystem where node operators are free to choose which services to run, e.g. an operator might find popular services more appealing economically. Thus, the network is nonhomogenous, made up of different types of resource servers, requirements and services.

+

Abstraction and build blocks

+

Abstraction is conceptually useful in decentralized and distributed web service development because of how incredibly complex it can become and the speed at which developers have to react to the outside world. The core team put most of the complexity into well-defined building blocks.

+

The building blocks provide you with enough level of detail that the modern developer experience demands but with cryptographic, economical and security assurances for confident service development, amongst others.

+

The Fleek Network implementation is open source and freely available for consultation and contribution when more detail or refinement is required by the community and other observers.

+

Modular architecture

+

Lightning is the repository name containing the Fleek multi-service Edge Network implementation.

+

The project aims to provide a higher focus on engineering productivity from the get-go, an improvement over the original Ursa implementation, which was exclusively focused on CDN, one of many services Lightning offers support.

+
info

Lightning is the open-source Rust implementation of Fleek Network. The repository contains the source code for the implementation of Fleek Network at https://github.com/fleek-network/lightning.

+

Some of the main differences from Ursa’s implementation are:

+
    +
  • The dynamic service loading approach
  • +
  • Decoupling of the network's core from the service implementation
  • +
  • Higher-level architecture that makes it easier to maintain and within reach of external contributors.
  • +
+

Lightning’s development approach is more open, which allows the community to build services and also helps the core team work on other features or services in parallel.

+

Repository

+

The repository contains the source code for the implementation of the Fleek Network and is located at https://github.com/fleek-network/lightning, a private repository that will go public after the whitepaper announcement and roadmap.

+

Directory structure

+

There are three top-level directories, namely lib, core and services.

+

Lib - These are open-source libraries created to help tackle the project features and packaged with a friendly license in the Rust ecosystem (MIT, Apache).

+

Core - The primary protocol implementation, where node crate contains the essential feature set or base functionality. Includes the interfaces crate, where the top-down specification of the project is located.

+

Services - A Service is a business logic provider built with the SDK (Service Development Kit). A service is decoupled from the core of the network and loaded dynamically [1] during the runtime using FFI (foreigner function interface).

+
draco
├── lib
│ ├── affair
│ ├── atomo
│ └── blake3-tree
├── core
│ ├── node
│ ├── interfaces
│ ├── application
│ ├── blockstore
│ ├── consensus
│ ├── handshake
│ ├── identity
│ ├── origin-arweave
│ ├── origin-filecoin
│ ├── origin-ipfs
│ ├── pod
│ ├── reputation
│ ├── rpc
│ └── sdk
└── services
└── cdn
+

Interfaces

+

The design pattern adopted for this software is highly inspired by the Object-Oriented model described by Alan Kay, which may be a bit different from OOP which grew to fame due to Java.

+

In a nutshell, this is similar to the same idea, and we represent different units of computation and process as objects that communicate with each other by message passing.

+

Identity on the Fleek Network

+

The identity on the Fleek Network is issued and controlled by individuals, which means that there aren't any central entities that issue, manage or control it for you. An identity is created without permission from anyone, and stored securely and privately.

+
caution

Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility.

+

The types of Identities found in the Fleek Network are used for:

+
    +
  • Node (for BFT DAG consensus)
  • +
  • Node Network (for fast communication signatures)
  • +
  • Account Owner (any actor holding a balance on Fleek Network)
  • +
+

The Public-key cryptography used in the network identities are the following curves:

+
    +
  • BLS12-381 is a pairing-friendly elliptic curve construction from the BLS family
  • +
  • Ed25519 is the EdDSA signature scheme using SHA-512 (SHA-2) and Curve25519
  • +
  • Secp256k1 is the Elliptic Curve Digital Signature Algorithm (ECDSA) used by Bitcoin and Ethereum
  • +
+

The identities are associated with the elliptic curves as follows:

+
    +
  • A Node key (ConsensusPublicKey) is BLS12-381 which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates
  • +
  • A Node Networking key (NodePublicKey) is Ed25519 used for the speed and performance of the network communications
  • +
  • Account Owner keys are based on secp256k1, which corresponds to an Ethereum Address
  • +
+

Transactions can be signed by the Account Owner—an Ethereum key (secp256k1) owned by the user on an external wallet and initially required to bridge assets from L2—and Node identities

+

Node Networking with Narwhal utilizes the Node Network key (Ed25519) is much more efficient when dealing with a single signature instead of aggregated signatures.

+

Content addressability and verifiability

+

The way content is distributed, handled and stored defines how trustworthy's a protocol. Some of the primitives to achieve it has roots in linked data, immutability, verification and the semantic web.

+

On Fleek Network, you either hint about data packed into a format called a Content Archive (CAR) or an existing CID of a CAR file—which hash addresses are unique and universally addressable. The network never stores data, only a cache layer to existing storage as origins. For example, on HTTP PUT we're just telling the network that there's some origin it should care about and cache.

+

Some of the principles that help us provide guarantees to end-users require a high ability for content verification, as a consequence, the immutability of files is critical to the system.

+
info

To emphasize, immutability means the state of not changing, or being unable to change!

+

Immutability

+

Fleek Network deals with files in a manner where the content determines the address in which the user of the system can locate and verify it unquestionably. This is possible due to cryptography, in which the same data always produces the same hash deterministically.

+
    +
  • A file whose content determines the hash, but is also impossible to invert it
  • +
  • Unable to reconstruct data from a hash
  • +
  • It's unique, not two files produce the same file or content
  • +
  • Any change in the content should always generate a completely different hash
  • +
+

In retrospect, what we have on the web today are files accessible via a URL address and the problem with this approach is that the content is not intrinsically tight to the address e.g. the content can change and the URL remains the same. That is the problematic way we access files on the web today, which we call "Location addressing", and the way we solve it for the web of tomorrow is called "Content addressing".

+

Content addressing

+

Content addressing is where we use a hash to access the content, and it allows us to verify that the content we received is the content we asked for. For this, we use a special hash called CID (Content Identifier), a cryptography hash function that maps input of arbitrary size to the output of a fixed size—the content identifiers are short, regardless of the size of the content, and the address does not tell us where the content is stored.

+

The entire network operates based on content addressing based on Blake3 hashing for efficient content identification and streaming verifiability.

+
info

The CID is a sort of string-like binary that is human-friendlier in comparison to the underlying binary, which is way longer.

+
info

Caching and deduplication are possible due to the immutability of content e.g. if content changes, let's say that an image has some new detail, the files share many of the same bytes. The amount of data we have to transfer to fetch is minimum, we'd only pull the difference. In today's web, we'd have to transfer both files in full, which is a worse path on resource allocation and performance.

+

Hash functions

+

The hash function for creating CIDs uses sha-256, but there is support for other hashing algorithms, such as sha1 (used by Git), sha2-256, sha3-255, blake2b-160, blake3, etc. Some older algorithms are proven not to be collision-free, so if algorithms can break, we have to switch the hash algorithm we use in the future! The problem with this switching of algorithms is the need to find a future-proof way of identifying the hash functions used to generate the hash, as well as the hash name.

+

Multihash is a protocol that comes into play to provide us with valuable metadata for future-proofing. In an attempt to summarize it, it's the composition of a hash placed at the end, a prefix, as a number to identify the algorithm used, and a number, to identify the hash name. Therefore, we'd start raising some questions. Without it, how would we get the data back without the ability to identify how it was encoded? Some users could use cbor, protocol buffers, json, etc, and there might be plenty of good reasons why for those choices. Maybe it's a compact binary encoding that is very efficient for storage, easy to work with, etc.

+

What's important is that it is the user's choice and why IPLD becomes useful for Fleek Network's use cases. A system for understanding and working with data that is made of a data model, codecs, tools for linking, and then a handful of other powerful features that help us develop a decentralized application.

+

Interplanetary linked data (IPLD)

+

Interplanetary linked data (IPLD) provides us with all the metadata prefixes to soothe the system needs, and provides us with the data model of the content-addressable web, as discussed earlier. IPLD is a set of conventions for creating decentralized data structures that are universally addressable and linkable.

+

A Distributed Hash Table (DHT) enables the network to store an IPLD or flexible mapping from any "immutable data pointer", such as a CID to its corresponding Blake3 hash. As mentioned in the Content Addressing section, the network operates over Blake3 hashing for efficient content handling.

+
info

These addressable and linkable data structures will allow us to do for data what URLs and links did for HTML web pages (Quote from IPLD).

+

Content Addressable aRchive (CAR)

+

The core of Fleek Network understands the IPLD CAR Content Addressable aRchive, which unpacks and traverses to cache individual files. The archive's content is hashed as Blake3, which Fleek Network uses to address all data coming and going into the network, regardless of their origin.

+
warning

Despite handling IPLD CAR files, it serves raw archive content to the client. In other words, if a request for a complete CAR came through a gateway, the gateway (as a client) would have to build the file from the streamed data before sending it as a response to the end user.

+
info

The ordering of blocks in a CAR is random, e.g. two different CAR files storing the same content. This causes the need to traverse the archive (DAG-PB/UnixFS) to store the CAR blocks as individual content.

+

HTTP PUT Request Origin

+

An Origin is a location where content originates from. In the context of Fleek Network, the origin has to be supported for the data retrieval to function, some examples of what will be supported are Arweave, Filecoin and IPFS. For instance, the first supported storage is IPFS and a user of Fleek Network should have the data pinned for IPFS somewhere to have it cached by the Fleek Network CDN service on an HTTP PUT request.

+
info

A Client-side library can provide helpers to upload to some origin, such as IPFS and call the HTTP PUT for the origin.

+

Binary process

+

The Fleek Network binary process is the program that's been compiled down to machine code that the computer's processor can understand and execute. The project source code repository from which the binary is compiled is called Lightning. Most node operators set up the nodes by running the install wizard, others do it manually. When a node operator runs a node, it means that the binary process is launched in the node operator's computer. It runs as a separate instance in memory, with its own set of resources and permissions. The Fleek Network binary is an essential component that contributes to the network formation, distribution and decentralization. It runs on a supported Linux operating system, enabling users to run a wide variety of computing services and perform complex tasks.

+

Ports

+

Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully.

+

We reserve the following top level ranges:

+
    +
  • TCP: 4200-4299
  • +
  • UDP: 4300-4399
  • +
+

Each service in the node has 10 ports reserved within each range.

+
note

For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node.

+
tip

For the Node Operators who opt to run the get.fleek.network assisted installer, the ports are verified if in use.

+

The Node process requires the following ports:

+

Connection Pool (4x00-4x09)

+
    +
  • Netkit QUIC: 4300 (UDP)
  • +
+

Consensus (4x10-4x19)

+
    +
  • Mempool: 4210 (TCP)
  • +
  • Primary: 4310 (UDP)
  • +
  • Worker: 4311 (UDP)
  • +
+

Handshake (4x20-4x29)

+
    +
  • HTTP: 4220 (TCP)
  • +
  • TCP: 4221 (TCP)
  • +
  • WebRTC: 4320 (UDP)
  • +
  • WebTransport: 4321 (UDP)
  • +
+

RPC (4x30-4x39)

+
    +
  • HTTP: 4230 (TCP)
  • +
  • WebSocket / WebTransport?
  • +
+

DHT (4x40-4x49)

+
    +
  • UDP: 4340 (UDP)
  • +
+

Broadcast

+
    +
  • Uses connection pool
  • +
+

Blockstore Server

+
    +
  • Uses connection pool
  • +
+
required

The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports.

+

JSON-RPC Interface

+

A JSON-RPC (JavaScript Object Notation Remote Procedure Call) is a protocol that enables communication between client and server applications. The Fleek Network JSON-RPC API enables JSON-RPC interaction with Fleek Network Node.

+

Fleek Network JSON-RPC API reference documentation is available at https://fleek-network.github.io/lightning/api-documentation.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/learn/token-and-economics/index.html b/docs/learn/token-and-economics/index.html index 38b652d7a..cad9b5b5b 100644 --- a/docs/learn/token-and-economics/index.html +++ b/docs/learn/token-and-economics/index.html @@ -1,9 +1,9 @@ - + - -Token and economics | Fleek Network Docs | Decentralized Edge Platform + +Token and economics | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,95 @@ - - - + + + - + -
-

Overview

The Fleek Network runs on an incentivized economy model that rewards node operators who provide resources that form the network. Currently, the economic model is to be considered a first draft, subject to change based on the data and feedback collected throughout all phases of testnet. The purpose of sharing a first draft is to provide clarity to prospective node operators and developers interested in participating in any pre-mainnet activities. You can find the complete breakdown of this information in this article

The Utility Token

Fleek Network has a utility token named FLK, an ERC-20 token issued on Ethereum (L1). The Fleek Network interacts with it as native to the protocol, given that the token intent is user accessibility and familiarity, making the interactions in the system as frictionless as possible. To accomplish this, the network has a Proof-of-Consensus bridge that facilitates entry and exit from Fleek Network—a Zero Knowledge Proof (ZKP) bridge that enables token retrieval.

Stable token for payments

The primary income for Account Holders is derived from a set of stable cryptocurrencies, which are easily tradable and highly liquid. For example, node operators receive rewards from stable coins (USD rate), ensuring a stable and predictable income stream. Note, that the network employs an inflationary mechanism, providing additional rewards for stakeholders via the minting of FLK tokens.

Resource Pricing

To start, Fleek Network only plans to charge for bandwidth and CPU cycles consumed. Pricing will be set at the network level, and resources will be priced and paid for in USD-denominated stablecoins. The exact pricing methodology will be determined and finalized throughout the testnet phases based on different factors. Those factors include:

  • Cost data the Foundation collects from node operators during testnet
  • The final specs of the SDK (which will determine what data the protocol can verifiably collect from nodes and reliably charge for)

Please be aware, there will be no fees paid during any of the testnet phases, the above is solely for illustrative purposes to give nodes a better understanding of the current thinking and what the process to finalize resource pricing might look like. We will work collaboratively with node operators throughout testnet to fairly determine resource pricing to ensure appropriate node incentivization while offering competitive pricing to developers.

It’s also important to note that node operators are independent of the Foundation, the network, and each other. They are responsible for managing their own economics, including any taxes payable in any jurisdiction relevant to them due to their participation in the network.


The FLK Token:

FLK is a staking token that is an integral part of the Fleek Network. Nodes running the Fleek Network client software are required to obtain and stake FLK in order to participate in the network and to have the opportunity to earn fees for providing work. Below is some high-level information on the anticipated characteristics of the FLK token:

  • Stake amount per node is set/managed at the protocol level, and consistent across all nodes
  • Work is allocated based on location (latency) and reputation (performance)
  • Resources on the network are priced and paid by users in USD denominated stablecoins
    • Pricing of resources happens at the network level.
  • Nodes only receive rewards related to work they perform, based on resources used/consumed (including FLK rewards)
  • FLK rewards are paid out per epoch (~24 hours). The FLK reward pool for each epoch is split proportionally between nodes who performed work during that epoch, calculated by the amount of USD revenue each node earned compared to the total revenue earned during that epoch.
  • 20% of the total FLK token supply is set aside for staking/rewards. The actual rate of rewards/inflation will be algorithmically controlled and updated based on network usage and other factors such as the market price of FLK.

DISCLAIMER: All information in this post about the FLK token and other elements of the Fleek Network is being provided solely for informational purposes and does not constitute an offer to sell FLK tokens, or a request for such offers, in any jurisdiction. There are currently no plans to sell FLK tokens. If FLK tokens do become available, you should not rely on the information in this blog post in making purchasing decisions, as the blog post was not prepared for that purpose and there will be important additional information to consider. In addition, we will likely publish further blog posts with updated information about the platform launch.

ALTHOUGH THERE ARE NO PLANS TO SELL FLK TOKENS AT THIS TIME, FOR THE AVOIDANCE OF DOUBT, IF FLK TOKENS EVER WERE TO BE SOLD, THEY WOULD BE OFFERED FOR SALE ONLY OUTSIDE OF THE UNITED STATES TO NON‐U.S. PERSONS, PURSUANT TO THE PROVISIONS OF REGULATION S OF THE U.S. SECURITIES ACT OF 1933, AS AMENDED (THE “SECURITIES ACT”). THE OFFER AND SALE OF FLK TOKENS WILL NOT BE REGISTERED UNDER THE SECURITIES ACT, AND MAY NOT BE OFFERED OR SOLD IN THE UNITED STATES ABSENT REGISTRATION OR AN APPLICABLE EXEMPTION FROM THE REGISTRATION REQUIREMENTS.

Algorithmic Economic System

The TLDR of the current implementation being discussed is that the network will handle the economic system/inflation algorithmically, using a concept we are calling NME, which stands for [N]et present value (npv) [M]arket price [E]quillibrium.

The algorithmic economic system has several goals, listed below in order of priority:

  • Provide an opportunity for receiving consistent blended earnings to node operators based on their work in most market conditions
    • “Blended” means taking into account both the USD stable coin fees that nodes are earning, and the FLK rewards they are earning (including factoring in the time-weighted average market price of FLK).
    • This means if network usage/revenue increases, FLK rewards will likely decrease, and vice versa. This also means that if the time-weighted average market price of FLK increases, nodes should reasonably expect that the amount of FLK rewards will decrease, but the value of FLK rewards received (in USD terms) will remain approximately the same.
  • Don’t overcompensate nodes, especially in times of market volatility
    • If the market price of FLK deviates from the NPV calculated in-protocol based on time-weighted average protocol-level revenue, nodes should reasonably expect that FLK rewards by number would be reduced.
  • Keep the network economy in equilibrium in most market conditions
  • Provide better incentives to node operators that are long-term aligned

The algorithm driving the above system will run autonomously in-protocol. However, we anticipate that certain parameters of the algorithm may be treated as parameters that can be adjusted/updated with a network governance proposal, as needed. We currently anticipate that the parameters that can be adjusted will be:

  • Maximum FLK inflation/reward rate
  • Resource pricing (bandwidth, compute, etc.)
  • Average cost of running a node
  • Target node margin rate
  • Stake amount (# of FLK) per node
  • Discount rate
  • Time-weighted average market price of FLK
  • Maximum stake lock time
  • Stake lock multiplier

Protocol-Owned Liquidity

In addition to the in-protocol algorithmic network economic system, the DAO/protocol will also manage 5% of the FLK token supply, which we anticipate will be set aside specifically to allow the community to take certain actions intended to provide long-term benefits to the network’s ecosystem and to help maintain the intended balance in the network economy. It will behave based on predetermined conditions and rules that are publicly auditable. The high level function would be the following:

  • Set limit asks to sell tranches of FLK tokens at different price levels in the event of a market price increase that deviates from NPV
  • Set limit buys to buy FLK tokens in the event of a price decrease where market price is lower than the current NPV

Benefits:

  • Helps keep the economic system in equilibrium by using protocol-owned FLK inventory to absorb volatility
  • Generates additional revenue for the protocol by capturing fees related to these activities
  • Provides better liquidity for node operators who might want to liquidate a portion of their FLK rewards
  • Smooths out volatility/price changes in periods of extreme market fear/greed

FLK Token Distribution

The following is an initial rough draft of the potential FLK token distribution, subject to adjustments or revisions.

Overall Distribution

OverallPercentage (%)
Community66%
Core Contributors (current and future)17%
Backers/Node operators17%
Total100%

Community Distribution

Community memberPercentage (%)
Staking and rewards20%
Ecosystem funds (Airdrop, grants, etc)20%
DAO10%
Foundation10%
Protocol Owned Liquidity5%
Pre-Mainnet Community1%
Total66%
- - +

Overview

+

The Fleek Network runs on an incentivized economy model that rewards node operators who provide resources that form the network. Currently, the economic model is to be considered a first draft, subject to change based on the data and feedback collected throughout all phases of testnet. The purpose of sharing a first draft is to provide clarity to prospective node operators and developers interested in participating in any pre-mainnet activities. You can find the complete breakdown of this information in this article

+

The Utility Token

+

Fleek Network has a utility token named FLK, an ERC-20 token issued on Ethereum (L1). The Fleek Network interacts with it as native to the protocol, given that the token intent is user accessibility and familiarity, making the interactions in the system as frictionless as possible. To accomplish this, the network has a Proof-of-Consensus bridge that facilitates entry and exit from Fleek Network—a Zero Knowledge Proof (ZKP) bridge that enables token retrieval.

+

Stable token for payments

+

The primary income for Account Holders is derived from a set of stable cryptocurrencies, which are easily tradable and highly liquid. For example, node operators receive rewards from stable coins (USD rate), ensuring a stable and predictable income stream. Note, that the network employs an inflationary mechanism, providing additional rewards for stakeholders via the minting of FLK tokens.

+

Resource Pricing

+

To start, Fleek Network only plans to charge for bandwidth and CPU cycles consumed. Pricing will be set at the network level, and resources will be priced and paid for in USD-denominated stablecoins. The exact pricing methodology will be determined and finalized throughout the testnet phases based on different factors. Those factors include:

+
    +
  • Cost data the Foundation collects from node operators during testnet
  • +
  • The final specs of the SDK (which will determine what data the protocol can verifiably collect from nodes and reliably charge for)
  • +
+

Please be aware, there will be no fees paid during any of the testnet phases, the above is solely for illustrative purposes to give nodes a better understanding of the current thinking and what the process to finalize resource pricing might look like. We will work collaboratively with node operators throughout testnet to fairly determine resource pricing to ensure appropriate node incentivization while offering competitive pricing to developers.

+

It’s also important to note that node operators are independent of the Foundation, the network, and each other. They are responsible for managing their own economics, including any taxes payable in any jurisdiction relevant to them due to their participation in the network.

+
+

The FLK Token:

+

FLK is a staking token that is an integral part of the Fleek Network. Nodes running the Fleek Network client software are required to obtain and stake FLK in order to participate in the network and to have the opportunity to earn fees for providing work. Below is some high-level information on the anticipated characteristics of the FLK token:

+
    +
  • Stake amount per node is set/managed at the protocol level, and consistent across all nodes
  • +
  • Work is allocated based on location (latency) and reputation (performance)
  • +
  • Resources on the network are priced and paid by users in USD denominated stablecoins +
      +
    • Pricing of resources happens at the network level.
    • +
    +
  • +
  • Nodes only receive rewards related to work they perform, based on resources used/consumed (including FLK rewards)
  • +
  • FLK rewards are paid out per epoch (~24 hours). The FLK reward pool for each epoch is split proportionally between nodes who performed work during that epoch, calculated by the amount of USD revenue each node earned compared to the total revenue earned during that epoch.
  • +
  • 20% of the total FLK token supply is set aside for staking/rewards. The actual rate of rewards/inflation will be algorithmically controlled and updated based on network usage and other factors such as the market price of FLK.
  • +
+

DISCLAIMER: All information in this post about the FLK token and other elements of the Fleek Network is being provided solely for informational purposes and does not constitute an offer to sell FLK tokens, or a request for such offers, in any jurisdiction. There are currently no plans to sell FLK tokens. If FLK tokens do become available, you should not rely on the information in this blog post in making purchasing decisions, as the blog post was not prepared for that purpose and there will be important additional information to consider. In addition, we will likely publish further blog posts with updated information about the platform launch.

+ALTHOUGH THERE ARE NO PLANS TO SELL FLK TOKENS AT THIS TIME, FOR THE AVOIDANCE OF DOUBT, IF FLK TOKENS EVER WERE TO BE SOLD, THEY WOULD BE OFFERED FOR SALE ONLY OUTSIDE OF THE UNITED STATES TO NON‐U.S. PERSONS, PURSUANT TO THE PROVISIONS OF REGULATION S OF THE U.S. SECURITIES ACT OF 1933, AS AMENDED (THE “SECURITIES ACT”). THE OFFER AND SALE OF FLK TOKENS WILL NOT BE REGISTERED UNDER THE SECURITIES ACT, AND MAY NOT BE OFFERED OR SOLD IN THE UNITED STATES ABSENT REGISTRATION OR AN APPLICABLE EXEMPTION FROM THE REGISTRATION REQUIREMENTS. +
+

Algorithmic Economic System

+

The TLDR of the current implementation being discussed is that the network will handle the economic system/inflation algorithmically, using a concept we are calling NME, which stands for [N]et present value (npv) [M]arket price [E]quillibrium.

+

The algorithmic economic system has several goals, listed below in order of priority:

+
    +
  • Provide an opportunity for receiving consistent blended earnings to node operators based on their work in most market conditions +
      +
    • “Blended” means taking into account both the USD stable coin fees that nodes are earning, and the FLK rewards they are earning (including factoring in the time-weighted average market price of FLK).
    • +
    • This means if network usage/revenue increases, FLK rewards will likely decrease, and vice versa. This also means that if the time-weighted average market price of FLK increases, nodes should reasonably expect that the amount of FLK rewards will decrease, but the value of FLK rewards received (in USD terms) will remain approximately the same.
    • +
    +
  • +
  • Don’t overcompensate nodes, especially in times of market volatility +
      +
    • If the market price of FLK deviates from the NPV calculated in-protocol based on time-weighted average protocol-level revenue, nodes should reasonably expect that FLK rewards by number would be reduced.
    • +
    +
  • +
  • Keep the network economy in equilibrium in most market conditions
  • +
  • Provide better incentives to node operators that are long-term aligned
  • +
+

The algorithm driving the above system will run autonomously in-protocol. However, we anticipate that certain parameters of the algorithm may be treated as parameters that can be adjusted/updated with a network governance proposal, as needed. We currently anticipate that the parameters that can be adjusted will be:

+
    +
  • Maximum FLK inflation/reward rate
  • +
  • Resource pricing (bandwidth, compute, etc.)
  • +
  • Average cost of running a node
  • +
  • Target node margin rate
  • +
  • Stake amount (# of FLK) per node
  • +
  • Discount rate
  • +
  • Time-weighted average market price of FLK
  • +
  • Maximum stake lock time
  • +
  • Stake lock multiplier
  • +
+
+

Protocol-Owned Liquidity

+

In addition to the in-protocol algorithmic network economic system, the DAO/protocol will also manage 5% of the FLK token supply, which we anticipate will be set aside specifically to allow the community to take certain actions intended to provide long-term benefits to the network’s ecosystem and to help maintain the intended balance in the network economy. It will behave based on predetermined conditions and rules that are publicly auditable. The high level function would be the following:

+
    +
  • Set limit asks to sell tranches of FLK tokens at different price levels in the event of a market price increase that deviates from NPV
  • +
  • Set limit buys to buy FLK tokens in the event of a price decrease where market price is lower than the current NPV
  • +
+

Benefits:

+
    +
  • Helps keep the economic system in equilibrium by using protocol-owned FLK inventory to absorb volatility
  • +
  • Generates additional revenue for the protocol by capturing fees related to these activities
  • +
  • Provides better liquidity for node operators who might want to liquidate a portion of their FLK rewards
  • +
  • Smooths out volatility/price changes in periods of extreme market fear/greed
  • +
+
+

FLK Token Distribution

+

The following is an initial rough draft of the potential FLK token distribution, subject to adjustments or revisions.

+

Overall Distribution

+
OverallPercentage (%)
Community66%
Core Contributors (current and future)17%
Backers/Node operators17%
Total100%
+

Community Distribution

+
Community memberPercentage (%)
Staking and rewards20%
Ecosystem funds (Airdrop, grants, etc)20%
DAO10%
Foundation10%
Protocol Owned Liquidity5%
Pre-Mainnet Community1%
Total66%
\ No newline at end of file diff --git a/docs/node/analyzing-logs/index.html b/docs/node/analyzing-logs/index.html index 2248f311b..01f9a0502 100644 --- a/docs/node/analyzing-logs/index.html +++ b/docs/node/analyzing-logs/index.html @@ -1,9 +1,9 @@ - + - -Analyzing logs | Fleek Network Docs | Decentralized Edge Platform + +Analyzing logs | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,29 @@ - - - + + + - + -
-

Analyzing Logs

The service logs provide a timeline of events for the Lightning service that is valuable for troubleshooting when encountering issues–when issues arise, analyzing log files is the first thing a node operator needs to do.

If you've installed the Node via the assisted installer, the logs are set up for you automatically. Otherwise, you have to follow the instructions provided in the manual installation section.

Log types

Standard out and standard error are two data streams created when we launch the Lightning process, on Lightning process activity we redirect the data streams to files as follows:

Standard output - The text output from the service process is put in /var/log/lightning/output.log

Standard error - The error messages from the service process are put in /var/log/lightning/diagnostic.log

tip

By convention, most of the log files create on Linux are found under the directory /var/log/, a standard area where system messages are logged and recorded.

Because normal output and error messages have their own channel, they can be handled independently of one another. Thus, we keep this in separate files that aggregate the output messages emitted by the Lightning process.

Watch logs

The log files can be monitored in real-time for diagnosis and troubleshooting purposes and the tail command is the most basic way for this purpose.

You can watch the node standard output (stdout) by running the command:

tail -f /var/log/lightning/output.log

Or, watch the standard error (stderr) for node diagnostics by running the command:

tail -f /var/log/lightning/diagnostic.log
tip

If you are controlling the Docker Container as a Systemd Service (Systemctl to start, stop or check the status) then the standard out (stdout) and standard error (stderr) logs are available as /var/log/lightning/*.log.

In any case, you can use the Docker command to analyze the logs. If you have stick with the default naming conventions it'd look like:

sudo docker logs -f lightning-node
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Analyzing Logs

+

The service logs provide a timeline of events for the Lightning service that is valuable for troubleshooting when encountering issues–when issues arise, analyzing log files is the first thing a node operator needs to do.

+

If you've installed the Node via the assisted installer, the logs are set up for you automatically. Otherwise, you have to follow the instructions provided in the manual installation section.

+

Log types

+

Standard out and standard error are two data streams created when we launch the Lightning process, on Lightning process activity we redirect the data streams to files as follows:

+

Standard output - The text output from the service process is put in /var/log/lightning/output.log

+

Standard error - The error messages from the service process are put in /var/log/lightning/diagnostic.log

+
tip

By convention, most of the log files create on Linux are found under the directory /var/log/, a standard area where system messages are logged and recorded.

+

Because normal output and error messages have their own channel, they can be handled independently of one another. Thus, we keep this in separate files that aggregate the output messages emitted by the Lightning process.

+

Watch logs

+

The log files can be monitored in real-time for diagnosis and troubleshooting purposes and the tail command is the most basic way for this purpose.

+

You can watch the node standard output (stdout) by running the command:

+
tail -f /var/log/lightning/output.log
+

Or, watch the standard error (stderr) for node diagnostics by running the command:

+
tail -f /var/log/lightning/diagnostic.log
+
tip

If you are controlling the Docker Container as a Systemd Service (Systemctl to start, stop or check the status) then the standard out (stdout) and standard error (stderr) logs are available as /var/log/lightning/*.log.

In any case, you can use the Docker command to analyze the logs. If you have stick with the default naming conventions it'd look like:

sudo docker logs -f lightning-node
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/node/configuration/index.html b/docs/node/configuration/index.html index 4311a5172..5c56a4685 100644 --- a/docs/node/configuration/index.html +++ b/docs/node/configuration/index.html @@ -1,9 +1,9 @@ - + - -Configuration | Fleek Network Docs | Decentralized Edge Platform + +Configuration | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/node/diagnostics/index.html b/docs/node/diagnostics/index.html index 2a43867b3..5fbba17c4 100644 --- a/docs/node/diagnostics/index.html +++ b/docs/node/diagnostics/index.html @@ -1,9 +1,9 @@ - + - -Diagnostics | Fleek Network Docs | Decentralized Edge Platform + +Diagnostics | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/node/health-check/index.html b/docs/node/health-check/index.html index 40fa89f3a..ae05b6e90 100644 --- a/docs/node/health-check/index.html +++ b/docs/node/health-check/index.html @@ -1,9 +1,9 @@ - + - -Health check | Fleek Network Docs | Decentralized Edge Platform + +Health check | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,32 @@ - - - + + + - + -
-

TL;DR: Run the command

A script is available to do and provide a health check overview:

curl -sS https://get.fleek.network/healthcheck | bash

Overview

In network applications, a health check is a process of verifying the overall health and availability of a service. It usually involves sending a request to a specific endpoint of a service and receiving a response indicating the status. The response includes information about the status of the service, or any errors or warnings if not healthy. This helps developers, node operators, and system administrators identify and resolve issues that may affect the network, node performance and availability.

A Node operator or system administrator can communicate with the node to confirm the status at any time.

tip

We're using cURL, for the examples, thus make sure that you have it installed on your operating system.

Quick health check

Run a quick health check by sending a GET request to /health endpoint of RPC on port 4230.

curl -w "\n" localhost:4230/health

If successful, you should get the response running and staked, as follows:

running and staked

If you get an error, then it means that your node is not healthy.

JSON-RPC Health check

We'll send a request to the JSON RPC flk_ping method. Execute the following command:

curl -X POST -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0",
"method": "flk_ping",
"params": [],
"id": 1
}' localhost:4230/rpc/v0

If the request is successful, you should get the result pong as follows:

{
"jsonrpc": "2.0",
"result": "pong",
"id": 1
}

Any other response, such as errors determine that the node is not healthy.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

TL;DR: Run the command

+

A script is available to do and provide a health check overview:

+
curl -sS https://get.fleek.network/healthcheck | bash
+

Overview

+

In network applications, a health check is a process of verifying the overall health and availability of a service. It usually involves sending a request to a specific endpoint of a service and receiving a response indicating the status. The response includes information about the status of the service, or any errors or warnings if not healthy. This helps developers, node operators, and system administrators identify and resolve issues that may affect the network, node performance and availability.

+

A Node operator or system administrator can communicate with the node to confirm the status at any time.

+
tip

We're using cURL, for the examples, thus make sure that you have it installed on your operating system.

+

Quick health check

+

Run a quick health check by sending a GET request to /health endpoint of RPC on port 4230.

+
curl -w "\n" localhost:4230/health
+

If successful, you should get the response running and staked, as follows:

+
running and staked
+

If you get an error, then it means that your node is not healthy.

+

JSON-RPC Health check

+

We'll send a request to the JSON RPC flk_ping method. Execute the following command:

+
curl -X POST -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0",
"method": "flk_ping",
"params": [],
"id": 1
}' localhost:4230/rpc/v0
+

If the request is successful, you should get the result pong as follows:

+
{
"jsonrpc": "2.0",
"result": "pong",
"id": 1
}
+

Any other response, such as errors determine that the node is not healthy.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/node/install/index.html b/docs/node/install/index.html index 4da37cee7..46f94ea4c 100644 --- a/docs/node/install/index.html +++ b/docs/node/install/index.html @@ -1,9 +1,9 @@ - + - -Install | Fleek Network Docs | Decentralized Edge Platform + +Install | Fleek Network Docs | Decentralized Edge Platform @@ -12,20 +12,243 @@ - - - + + + - + -
-

This section describes how to install the Fleek Network Lightning on supported operating systems. The installation can be made quicker by running the assisted installer or by following the manual installation if you want a bit more control.

Warning

If you'd like to participate in the alpha Testnet, you have to go through the onboarding process. Check the requirements and find the onboarding instructions to enable you to proceed and install a network node successfully.

Assisted installer

The assisted installer is a script written in Bash (Unix shell) that is available as a curl command line.

Prerequesites

  • A basic knowledge of command line interface (CLI)
  • A supported Linux server

Connect to your server

Connect to the Linux server where the Node's going to be installed via SSH by opening a shell session there.

If you have set up a public SSH key for the machine, connecting to the server should be as simple as:

ssh <USERNAME>@<REMOTE_HOST>
info

Check the cloud provider for instructions to understand how to setup an ssh connection and connect to it remotely. Some other users might have local access to a supported Linux server. To keep this guide short, we'll assume you've rented a VPS from a cloud provider.

Create a user

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

You can create a new user and add to the sudo group by running:

tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

sudo adduser lgtn

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

sudo usermod -aG sudo lgtn

Switch to the new user by using the command:

su lgtn

Change the directory to the new user's home, as follows:

cd /home/lgtn

Run the script for a quick install

Copy and paste it to the server host terminal and execute it to launch the assisted installation process, as follows:

curl https://get.fleek.network | bash

On success, you should be greeted by the following welcome screen:

⭐️ Fleek Network Lightning CLI installer ⭐️

zeeeeee-
z$$$$$$"
d$$$$$$"
d$$$$$P
d$$$$$P
$$$$$$"
.$$$$$$"
.$$$$$$"
4$$$$$$$$$$$$$"
z$$$$$$$$$$$$$"
"""""""3$$$$$"
z$$$$P
d$$$$"
.$$$$$"
z$$$$$"
z$$$$P
d$$$$$$$$$$"
*******$$$"
.$$$"
.$$"
4$P"
z$"
zP
z"
/

★★★★★★★★★ 🌍 Website https://fleek.network
★★★★★★★★★ 📚 Documentation https://docs.fleek.network
★★★★★★★★★ 💾 Git repository https://github.com/fleek-network/lightning
★★★★★★★★★ 🤖 Discord https://discord.gg/fleekxyz
★★★★★★★★★ 🐤 Twitter https://twitter.com/fleek_net
★★★★★★★★★ 🎨 Ascii art by https://www.asciiart.eu

...

Remaining output omitted for brevity, you'll not see this text line

Follow the installation wizard to have the Fleek Network Lightning CLI and service installed on the supported server.

After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:

After creating the service, launch the service by executing the following command:

sudo systemctl start lightning.service
tip

To learn more about Systemctl commands, visit the section Use Systemctl to manage the Lightning Service

tip

Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section Log Messages.

Once the installation is complete, do a health check! Check the section Health Check to learn how to do a node health checkup.

About the process

The installation process is open source and transparent. The source is available in the get.fleek.network or the origin repository here.

info

"Get Fleek Network" is an attempt to make our software more accessible. By providing scripts to automate the installation process of our software, we believe that it can help improve the onboarding experience of our users.

The installer assists the node operator by automating the Lightning CLI build from the open-source code and setting up the system service. A node operator should use the assisted installer to ease onboarding, reduce repetition,

At a high level, the installer will:

  • Install required dependencies, e.g. rust toolchain
  • Pull the source code from the origin repository
  • Build the binary, e.g. a lightning CLI (lgtn) is compiled from source code
  • Setup a Systemd service named lightning
  • Provide instructions to launch, stop the Fleek network via the Systemd lightning service
tip

Remember that if you use the assisted installer, you won't have to do the manual installation process as described in the next section. On success, the assisted installer should provide the same result as following the manual instructions.

Manual installation

The following section will walk through the dependencies and Rust installation process for Linux. If you're on Windows, we recommend to setup Windows Subsystem Linux, reading the Ubuntu tutorial or picking another supported distro. The WSL will let you use Linux applications, utilities and bash command tools you'll find in the tutorial.

tip

We're only supporting Linux operating system (server edition). Find the list of supported OS here.

Prerequisites

To follow the guide, you will need the following:

  • Familiarity with the command-line interface
  • Git

You're required to have some experience with the command-line interface and have Git installed; Also, you should be happy to troubleshoot, since versions might differ from the time of writing and reading. Most times, a simple web search provides the best answers.

If you don't have Git installed, learn more about it and the instructions by reading the Git documentation.

Create a user

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

You can create a new user and add to the sudo group by running:

tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

sudo adduser lgtn

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

sudo usermod -aG sudo lgtn

Switch to the new user by using the command:

su lgtn

Change the directory to the new user's home, as follows:

cd /home/lgtn

Install Rust with Rustup tool

Visit the Rust website getting started guide, to find, copy and run the Rustup tool for installation and version management.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
tip

curl is an application that is generally available in most OS, if missing install it. Find more here.

Alternatively, if you have installed Rust in the past, you may want to update it 👌.

rustup update

During the installation process, if asked about preferences, select the default option!

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


default host triple: x86_64-unknown-linux-gnu
default toolchain: stable (default)
profile: default
modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
tip

Once complete, you'll have to restart your current shell or reload the "PATH" environment variable to include Cargo's bin directory $HOME/.cargo/bin. This is required to let you use "cargo" command globally.

To configure your current shell, run:

source "$HOME/.cargo/env"

From then on, the latest version of Cargo (Rust's build and package manager tool) should be installed. Learn more about Cargo, here.

Check the version to confirm's working correctly:

cargo --version

Here's the output we got (beware that our version might differ to yours, it's expected 😅).

cargo 1.65.0 (4bc8f24d3 2022-10-20)

Lightning installer rust dependencies

Rustup subcommands deal with toolchains, a collection of programs required to compile a Rust application.

rustup toolchain list

For example, on Linux Ubuntu we generally have it set to the default:

stable-x86_64-unknown-linux-gnu (default)

While on macOS:

stable-x86_64-apple-darwin (default)

Make sure you have Rustup set to the desired toolchain as default if required 💁‍♀️!

rustup default <TOOLCHAIN-LIST-NAME>
tip

Rust compilation is long and compiler caching can help speed things up immensely. The Lightning CLI project can be used to reduce the perceived compilation times.

Linux dependencies

On Linux (we'll stick with Ubuntu as the Linux distro example), start by updating the package information in the source list and then upgrade all the installed packages with the latest versions (do the equivalent for your Linux distro), as follows:

sudo apt-get update
sudo apt-get upgrade
tip

You can optionally pass the y flag to skip any user prompts e.g. sudo apt-get update -y to any remaining apt-get commands.

Install the build-essentials packages, necessary for compiling general software and for our use-case Lightning CLI.

sudo apt-get install build-essential

Followed by the required tools to compile the application (cmake, clang, pkg-config and libssl-dev ).

sudo apt-get install cmake clang pkg-config libssl-dev gcc-multilib
tip

For Debian, you should install gcc, as follows:

sudo apt-get update
sudo apt-get install gcc

Now install the Protobufer Compiler.

sudo apt-get install protobuf-compiler

Ensure the compiler version is 3+

protoc --version

Installing Lightning CLI

If you haven't already, clone the Fleek Network's Lightning repository to your machine.

tip

You have several ways of doing this:

  • Clone via HTTPS
  • Clone via SSH
  • Download via Github CLI
  • Download the zip package from the repository

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. -Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. -Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning

When git clone completes 👍, change directory to the project directory e.g. we cloned to the default name ~/fleek-network/lightning:

cd ~/fleek-network/lightning
note

The ~/fleek-network/lightning or $HOME/fleek-network/lightning directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation.

If you list (ls) the files in the directory, it should be similar to:

.
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── README.md
├── codecov.yml
├── core
├── docs
├── lib
├── lightning.toml
├── rust-toolchain
├── rustfmt.toml
├── services
└── target

At this point, you should be able to run the install command successfully.

caution

If you already had Rust installed, or the project before, and skipped instructions directly here, there might be case where you get errors. So, make sure to clear your work directory:

cargo clean
cargo update

Start the install process by running the command:

cargo +stable build --release

The installation process is long, as it compiles the application binary for us from the source code.

🌈 Here's the output when successful! Note, that the output might differ slightly from time of writing.

    Finished release [optimized] target(s) in 11m 22s
Installing /home/lgtn/.cargo/bin/lightning
Installed package `lightning v0.1.0 (/crates/lightning)` (executable `lightning`)
tip

Once Rust generates the binary lightning-node, you can find it in the project root target directory. Depending on the usage of +stable flag, the binary should be located at ~/fleek-network/lightning/target/debug/lightning-node or ~/fleek-network/lightning/target/release/lightning-node.

You can create an lgtn symbolic link to /usr/local/bin to make it available globally.

sudo ln -s "$HOME/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn

After completing, you'll have the ability to type lgtn to execute the binary anywhere for your user account. Other users might find it better to copy or create an alias instead.

Run the lgtn help sub-command as a checkup:

Usage: lightning-node [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: lightning.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version
caution

Beware that your output might differ a bit, as Lightning is in constant development. Note that you'll have to "re-install" every time you want to pull updates from the source repository, as the update at the time of writing is done manually and not automatically.

Key generator

Before starting the node, you should generate a public and private key.

lgtn keys generate

The keys will be generated and placed under the system directory ~/.lightning/keystore. The private key is the user's responsibility and no one else can generate or recover it for you, including Fleek Network or any team member. Your keys, your responsibility!

Set user path in config.toml

You should be following the create a user recommendation. For our example, we have the username lgtn.

tip

If you have chosen a different username, replace lgtn by the correct username you have selected.

In the config.toml you'll find some and more of the following:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"

Find and replace all instances of ~ in the config file /home/lgtn/.lightning/config.toml. Here's an example using sed:

sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
caution

The config.toml example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here.

Once changed, all the instances of ~/ should be replaced by your user path e.g. /home/lgtn/. For our example, the output would look like the following:

[BLANK]

[application]
db_path = "/home/lgtn/.lightning/data/app_db"

[consensus]
store_path = "/home/lgtn/.lightning/data/narwhal_store"

[fsstore]
root = "/home/lgtn/.lightning/blockstore"

[resolver]
store_path = "/home/lgtn/.lightning/data/resolver_store"

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"

Set testnet in config.toml

Set the testnet attribute to true in the config.toml located in the path ~/.lightning/config.toml.

[application]
db_path = "~/.lightning/data/app_data"
mode = "Prod"
storage = "RocksDb"
testnet = true

...
tip

The configuration file should have more content, which was omitted here to keep it short and to the point. You're interested in the testnet property name only.

Start the node

Warning

To participate in the alpha Testnet, you have to through the onboarding process. Make sure you request access by following the onboarding instructions. If you fail to enable your node for testnet, it'll not run!

To start the node, you should execute the sub-command run. Noteworthy that while it launches the node, you're recommended to set up a systemd service to run it for a long period.

lgtn run
WARNING

We recommend setting up the process as a systemd service, as it's a long-running process. Instructions to setup a systemd service are available in the section Systemd Service Setup.

Great! You have successfully installed all the required packages, and libraries and have compiled and installed lightning. Check the section Health Check to learn how to do a node health checkup.

Systemd Service Setup

Create a new Systemd service file:

sudo touch /etc/systemd/system/lightning.service

Open the file and put the following content:

[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run
ExecStop=killall -9 lgtn
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
caution

Notice that we're using lgnt as the username. If you have a different custom username change it accordingly. Beware that we've recommended using a non-root user, as described in the section create a user.

note

The flag -c in the lightning.service ExecStart, is to provide the toml configuration file path e.g. defaults to ~/.lightning/config.toml. This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a user or sudoer. For example, a sudoer would have the configuration set to /root/.lightning/config.toml or /home/username/.lightning/config.toml depending on using sudo which might cause some confusion to some users.

Change the file permissions for the service:

sudo chmod 644 /etc/systemd/system/lightning.service

After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:

sudo systemctl daemon-reload

To start the service at boot, use the enable command:

sudo systemctl enable lightning.service

Create the directory where the log message will be stored, as follows:

sudo mkdir -p /var/log/lightning

You may want to create empty placeholders for the stdout and stderr log files:

sudo touch /var/log/lightning/output.log
sudo touch /var/log/lightning/diagnostic.log
WARNING

We're assuming that you've created a new user and can start the service operating without sudo.

Start the service by:

sudo systemctl start lightning.service
tip

Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section Log Messages.

To learn more, visit the section Use Systemctl to manage the Lightning Service

Docker installation

In this section we'll describe how to run a Fleek Network Lightning Node as a Docker Service. We're going to assume that you have Docker installed and running. If you need help to install Docker, check the guide running a node in docker.

a) We can easily pull and run the Lightning Docker image from our registry to run the Docker Container quickly.

b) Build the Docker image from the repository source code

Optionally, wrap the Docker Container as a Systemd Service.

tip

The Docker images are built for particular CPU architectures (x64) and as declared in the requirements, we're mainly supporting GenuineIntel, as there has been reports of failure to build and run the binary on AMD. If you're running on a AuthenticAMD, provide us feedback on our Discord.

Quick pull and run

You can pull an run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:

sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it ghcr.io/fleek-network/lightning:latest
tip

The command has a list of ports -p values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ports to find the latest updates.

Build from source

Clone the repository located at https://github.com/fleek-network/lightning.

tip

You have several ways of doing this:

  • Clone via HTTPS
  • Clone via SSH
  • Download via Github CLI
  • Download the zip package from the repository

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. -Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. -Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning

Change directory to the project source code directory, e.g. the default ~/fleek-network/lightning.

cd ~/fleek-network/lightning

Build the image named as lightning from our Dockerfile:

sudo docker build -t lightning -f ./Dockerfile .
tip

Take note of the Docker image name lightning, as that's the name we'll use and pass to the Docker run to be successful. You can name it differently if that's your preference.

Once the image is built, you can launch the Docker Container with a --name such as lightning-node from the lightning image we just created by running:

sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it lightning
tip

The command has a list of ports -p values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ports to find the latest updates.

If a ~/.lightning directory or ~/.lightning/keystore doesn't exist, one is created for you on docker run. You'll need to have the directory populated with the config.toml and keystore if you want to use a particular identity. Learn more about managing the keystore here.

Docker Container as a Systemd Service

Create a unit configuration file:

sudo touch /etc/systemd/system/docker-lightning.service

Open the docker-lightning.service file in your favourite text editor and put the content:

[Unit]
Description=Fleek Network Node lightning service
After=docker.service
Requires=docker.service

[Service]
Restart=always
RestartSec=5
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill lightning-node
ExecStartPre=-/usr/bin/docker rm lightning-node
ExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest
ExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest
ExecStop=/usr/bin/docker stop lightning-node
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log

[Install]
WantedBy=multi-user.target

Change the file permissions by running the command:

sudo chmod 644 /etc/systemd/system/docker-lightning.service

Next, reload the Systemctl Daemon:

sudo systemctl daemon-reload

Enable the service on startup when the system boots:

sudo systemctl enable docker-lightning.service

Learn how to manage the Systemd Service by reading the section systemd service.

Frequently Used Commands (Quick Reference)

A quick reference of the most Frequently Used Commands are available for Native and Docker setups. If you'd like a more in depth explanation of the commands, check the health check, analyzing logs, systemd service and guides sections separately.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

This section describes how to install the Fleek Network Lightning on supported operating systems. The installation can be made quicker by running the assisted installer or by following the manual installation if you want a bit more control.

+
Warning

If you'd like to participate in the alpha Testnet, you have to go through the onboarding process. Check the requirements and find the onboarding instructions to enable you to proceed and install a network node successfully.

+

Assisted installer

+

The assisted installer is a script written in Bash (Unix shell) that is available as a curl command line.

+

Prerequesites

+
    +
  • A basic knowledge of command line interface (CLI)
  • +
  • A supported Linux server
  • +
+

Connect to your server

+

Connect to the Linux server where the Node's going to be installed via SSH by opening a shell session there.

+

If you have set up a public SSH key for the machine, connecting to the server should be as simple as:

+
ssh <USERNAME>@<REMOTE_HOST>
+
info

Check the cloud provider for instructions to understand how to setup an ssh connection and connect to it remotely. Some other users might have local access to a supported Linux server. To keep this guide short, we'll assume you've rented a VPS from a cloud provider.

+

Create a user

+

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

+

You can create a new user and add to the sudo group by running:

+
tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

+
sudo adduser lgtn
+

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

+
sudo usermod -aG sudo lgtn
+

Switch to the new user by using the command:

+
su lgtn
+

Change the directory to the new user's home, as follows:

+
cd /home/lgtn
+

Run the script for a quick install

+

Copy and paste it to the server host terminal and execute it to launch the assisted installation process, as follows:

+
curl https://get.fleek.network | bash
+

On success, you should be greeted by the following welcome screen:

+
⭐️ Fleek Network Lightning CLI installer ⭐️

zeeeeee-
z$$$$$$"
d$$$$$$"
d$$$$$P
d$$$$$P
$$$$$$"
.$$$$$$"
.$$$$$$"
4$$$$$$$$$$$$$"
z$$$$$$$$$$$$$"
"""""""3$$$$$"
z$$$$P
d$$$$"
.$$$$$"
z$$$$$"
z$$$$P
d$$$$$$$$$$"
*******$$$"
.$$$"
.$$"
4$P"
z$"
zP
z"
/

★★★★★★★★★ 🌍 Website https://fleek.network
★★★★★★★★★ 📚 Documentation https://docs.fleek.network
★★★★★★★★★ 💾 Git repository https://github.com/fleek-network/lightning
★★★★★★★★★ 🤖 Discord https://discord.gg/fleekxyz
★★★★★★★★★ 🐤 Twitter https://twitter.com/fleek_net
★★★★★★★★★ 🎨 Ascii art by https://www.asciiart.eu

...

Remaining output omitted for brevity, you'll not see this text line
+

Follow the installation wizard to have the Fleek Network Lightning CLI and service installed on the supported server.

+

After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:

+

After creating the service, launch the service by executing the following command:

+
sudo systemctl start lightning.service
+
tip

To learn more about Systemctl commands, visit the section Use Systemctl to manage the Lightning Service

+
tip

Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section Log Messages.

+

Once the installation is complete, do a health check! Check the section Health Check to learn how to do a node health checkup.

+

About the process

+

The installation process is open source and transparent. The source is available in the get.fleek.network or the origin repository here.

+
info

"Get Fleek Network" is an attempt to make our software more accessible. By providing scripts to automate the installation process of our software, we believe that it can help improve the onboarding experience of our users.

+

The installer assists the node operator by automating the Lightning CLI build from the open-source code and setting up the system service. A node operator should use the assisted installer to ease onboarding, reduce repetition,

+

At a high level, the installer will:

+
    +
  • Install required dependencies, e.g. rust toolchain
  • +
  • Pull the source code from the origin repository
  • +
  • Build the binary, e.g. a lightning CLI (lgtn) is compiled from source code
  • +
  • Setup a Systemd service named lightning
  • +
  • Provide instructions to launch, stop the Fleek network via the Systemd lightning service
  • +
+
tip

Remember that if you use the assisted installer, you won't have to do the manual installation process as described in the next section. On success, the assisted installer should provide the same result as following the manual instructions.

+

Manual installation

+

The following section will walk through the dependencies and Rust installation process for Linux. If you're on Windows, we recommend to setup Windows Subsystem Linux, reading the Ubuntu tutorial or picking another supported distro. The WSL will let you use Linux applications, utilities and bash command tools you'll find in the tutorial.

+
tip

We're only supporting Linux operating system (server edition). Find the list of supported OS here.

+

Prerequisites

+

To follow the guide, you will need the following:

+
    +
  • Familiarity with the command-line interface
  • +
  • Git
  • +
+

You're required to have some experience with the command-line interface and have Git installed; Also, you should be happy to troubleshoot, since versions might differ from the time of writing and reading. Most times, a simple web search provides the best answers.

+

If you don't have Git installed, learn more about it and the instructions by reading the Git documentation.

+

Create a user

+

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

+

You can create a new user and add to the sudo group by running:

+
tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

+
sudo adduser lgtn
+

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

+
sudo usermod -aG sudo lgtn
+

Switch to the new user by using the command:

+
su lgtn
+

Change the directory to the new user's home, as follows:

+
cd /home/lgtn
+

Install Rust with Rustup tool

+

Visit the Rust website getting started guide, to find, copy and run the Rustup tool for installation and version management.

+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
+
tip

curl is an application that is generally available in most OS, if missing install it. Find more here.

+

Alternatively, if you have installed Rust in the past, you may want to update it 👌.

+
rustup update
+

During the installation process, if asked about preferences, select the default option!

+
You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


default host triple: x86_64-unknown-linux-gnu
default toolchain: stable (default)
profile: default
modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
+
tip

Once complete, you'll have to restart your current shell or reload the "PATH" environment variable to include Cargo's bin directory $HOME/.cargo/bin. This is required to let you use "cargo" command globally.

+

To configure your current shell, run:

+
source "$HOME/.cargo/env"
+

From then on, the latest version of Cargo (Rust's build and package manager tool) should be installed. Learn more about Cargo, here.

+

Check the version to confirm's working correctly:

+
cargo --version
+

Here's the output we got (beware that our version might differ to yours, it's expected 😅).

+
cargo 1.65.0 (4bc8f24d3 2022-10-20)
+

Lightning installer rust dependencies

+

Rustup subcommands deal with toolchains, a collection of programs required to compile a Rust application.

+
rustup toolchain list
+

For example, on Linux Ubuntu we generally have it set to the default:

+
stable-x86_64-unknown-linux-gnu (default)
+

While on macOS:

+
stable-x86_64-apple-darwin (default)
+

Make sure you have Rustup set to the desired toolchain as default if required 💁‍♀️!

+
rustup default <TOOLCHAIN-LIST-NAME>
+
tip

Rust compilation is long and compiler caching can help speed things up immensely. The Lightning CLI project can be used to reduce the perceived compilation times.

+

Linux dependencies

+

On Linux (we'll stick with Ubuntu as the Linux distro example), start by updating the package information in the source list and then upgrade all the installed packages with the latest versions (do the equivalent for your Linux distro), as follows:

+
sudo apt-get update
sudo apt-get upgrade
+
tip

You can optionally pass the y flag to skip any user prompts e.g. sudo apt-get update -y to any remaining apt-get commands.

+

Install the build-essentials packages, necessary for compiling general software and for our use-case Lightning CLI.

+
sudo apt-get install build-essential
+

Followed by the required tools to compile the application (cmake, clang, pkg-config and libssl-dev ).

+
sudo apt-get install cmake clang pkg-config libssl-dev gcc-multilib
+
tip

For Debian, you should install gcc, as follows:

sudo apt-get update
sudo apt-get install gcc
+

Now install the Protobufer Compiler.

+
sudo apt-get install protobuf-compiler
+

Ensure the compiler version is 3+

+
protoc --version
+

Installing Lightning CLI

+

If you haven't already, clone the Fleek Network's Lightning repository to your machine.

+
tip

You have several ways of doing this:

    +
  • Clone via HTTPS
  • +
  • Clone via SSH
  • +
  • Download via Github CLI
  • +
  • Download the zip package from the repository
  • +

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. +Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. +Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning
+

When git clone completes 👍, change directory to the project directory e.g. we cloned to the default name ~/fleek-network/lightning:

+
cd ~/fleek-network/lightning
+
note

The ~/fleek-network/lightning or $HOME/fleek-network/lightning directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation.

+

If you list (ls) the files in the directory, it should be similar to:

+
.
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── README.md
├── codecov.yml
├── core
├── docs
├── lib
├── lightning.toml
├── rust-toolchain
├── rustfmt.toml
├── services
└── target
+

At this point, you should be able to run the install command successfully.

+
caution

If you already had Rust installed, or the project before, and skipped instructions directly here, there might be case where you get errors. So, make sure to clear your work directory:

+
cargo clean
cargo update
+

Start the install process by running the command:

+
cargo +stable build --release
+

The installation process is long, as it compiles the application binary for us from the source code.

+

🌈 Here's the output when successful! Note, that the output might differ slightly from time of writing.

+
    Finished release [optimized] target(s) in 11m 22s
Installing /home/lgtn/.cargo/bin/lightning
Installed package `lightning v0.1.0 (/crates/lightning)` (executable `lightning`)
+
tip

Once Rust generates the binary lightning-node, you can find it in the project root target directory. Depending on the usage of +stable flag, the binary should be located at ~/fleek-network/lightning/target/debug/lightning-node or ~/fleek-network/lightning/target/release/lightning-node.

+

You can create an lgtn symbolic link to /usr/local/bin to make it available globally.

+
sudo ln -s "$HOME/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn
+

After completing, you'll have the ability to type lgtn to execute the binary anywhere for your user account. Other users might find it better to copy or create an alias instead.

+

Run the lgtn help sub-command as a checkup:

+
Usage: lightning-node [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: lightning.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version
+
caution

Beware that your output might differ a bit, as Lightning is in constant development. Note that you'll have to "re-install" every time you want to pull updates from the source repository, as the update at the time of writing is done manually and not automatically.

+

Key generator

+

Before starting the node, you should generate a public and private key.

+
lgtn keys generate
+

The keys will be generated and placed under the system directory ~/.lightning/keystore. The private key is the user's responsibility and no one else can generate or recover it for you, including Fleek Network or any team member. Your keys, your responsibility!

+

Set user path in config.toml

+

You should be following the create a user recommendation. For our example, we have the username lgtn.

+
tip

If you have chosen a different username, replace lgtn by the correct username you have selected.

+

In the config.toml you'll find some and more of the following:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+

Find and replace all instances of ~ in the config file /home/lgtn/.lightning/config.toml. Here's an example using sed:

+
sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
+
caution

The config.toml example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here.

+

Once changed, all the instances of ~/ should be replaced by your user path e.g. /home/lgtn/. For our example, the output would look like the following:

+
[BLANK]

[application]
db_path = "/home/lgtn/.lightning/data/app_db"

[consensus]
store_path = "/home/lgtn/.lightning/data/narwhal_store"

[fsstore]
root = "/home/lgtn/.lightning/blockstore"

[resolver]
store_path = "/home/lgtn/.lightning/data/resolver_store"

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"
+

Set testnet in config.toml

+

Set the testnet attribute to true in the config.toml located in the path ~/.lightning/config.toml.

+
[application]
db_path = "~/.lightning/data/app_data"
mode = "Prod"
storage = "RocksDb"
testnet = true

...
+
tip

The configuration file should have more content, which was omitted here to keep it short and to the point. You're interested in the testnet property name only.

+

Start the node

+
Warning

To participate in the alpha Testnet, you have to through the onboarding process. Make sure you request access by following the onboarding instructions. If you fail to enable your node for testnet, it'll not run!

+

To start the node, you should execute the sub-command run. Noteworthy that while it launches the node, you're recommended to set up a systemd service to run it for a long period.

+
lgtn run
+
WARNING

We recommend setting up the process as a systemd service, as it's a long-running process. Instructions to setup a systemd service are available in the section Systemd Service Setup.

+

Great! You have successfully installed all the required packages, and libraries and have compiled and installed lightning. Check the section Health Check to learn how to do a node health checkup.

+

Systemd Service Setup

+

Create a new Systemd service file:

+
sudo touch /etc/systemd/system/lightning.service
+

Open the file and put the following content:

+
[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run
ExecStop=killall -9 lgtn
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
+
caution

Notice that we're using lgnt as the username. If you have a different custom username change it accordingly. Beware that we've recommended using a non-root user, as described in the section create a user.

+
note

The flag -c in the lightning.service ExecStart, is to provide the toml configuration file path e.g. defaults to ~/.lightning/config.toml. This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a user or sudoer. For example, a sudoer would have the configuration set to /root/.lightning/config.toml or /home/username/.lightning/config.toml depending on using sudo which might cause some confusion to some users.

+

Change the file permissions for the service:

+
sudo chmod 644 /etc/systemd/system/lightning.service
+

After creating the service file, you should reload the Systemd process, to apply the newly created service. You can do this by executing:

+
sudo systemctl daemon-reload
+

To start the service at boot, use the enable command:

+
sudo systemctl enable lightning.service
+

Create the directory where the log message will be stored, as follows:

+
sudo mkdir -p /var/log/lightning
+

You may want to create empty placeholders for the stdout and stderr log files:

+
sudo touch /var/log/lightning/output.log
sudo touch /var/log/lightning/diagnostic.log
+
WARNING

We're assuming that you've created a new user and can start the service operating without sudo.

+

Start the service by:

+
sudo systemctl start lightning.service
+
tip

Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section Log Messages.

+

To learn more, visit the section Use Systemctl to manage the Lightning Service

+

Docker installation

+

In this section we'll describe how to run a Fleek Network Lightning Node as a Docker Service. We're going to assume that you have Docker installed and running. If you need help to install Docker, check the guide running a node in docker.

+

a) We can easily pull and run the Lightning Docker image from our registry to run the Docker Container quickly.

+

b) Build the Docker image from the repository source code

+

Optionally, wrap the Docker Container as a Systemd Service.

+
tip

The Docker images are built for particular CPU architectures (x64) and as declared in the requirements, we're mainly supporting GenuineIntel, as there has been reports of failure to build and run the binary on AMD. If you're running on a AuthenticAMD, provide us feedback on our Discord.

+

Quick pull and run

+

You can pull an run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:

+
sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it ghcr.io/fleek-network/lightning:latest
+
tip

The command has a list of ports -p values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ports to find the latest updates.

+

Build from source

+

Clone the repository located at https://github.com/fleek-network/lightning.

+
tip

You have several ways of doing this:

    +
  • Clone via HTTPS
  • +
  • Clone via SSH
  • +
  • Download via Github CLI
  • +
  • Download the zip package from the repository
  • +

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. +Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. +Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning
+

Change directory to the project source code directory, e.g. the default ~/fleek-network/lightning.

+
cd ~/fleek-network/lightning
+

Build the image named as lightning from our Dockerfile:

+
sudo docker build -t lightning -f ./Dockerfile .
+
tip

Take note of the Docker image name lightning, as that's the name we'll use and pass to the Docker run to be successful. You can name it differently if that's your preference.

+

Once the image is built, you can launch the Docker Container with a --name such as lightning-node from the lightning image we just created by running:

+
sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it lightning
+
tip

The command has a list of ports -p values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ports to find the latest updates.

+

If a ~/.lightning directory or ~/.lightning/keystore doesn't exist, one is created for you on docker run. You'll need to have the directory populated with the config.toml and keystore if you want to use a particular identity. Learn more about managing the keystore here.

+

Docker Container as a Systemd Service

+

Create a unit configuration file:

+
sudo touch /etc/systemd/system/docker-lightning.service
+

Open the docker-lightning.service file in your favourite text editor and put the content:

+
[Unit]
Description=Fleek Network Node lightning service
After=docker.service
Requires=docker.service

[Service]
Restart=always
RestartSec=5
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill lightning-node
ExecStartPre=-/usr/bin/docker rm lightning-node
ExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest
ExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest
ExecStop=/usr/bin/docker stop lightning-node
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log

[Install]
WantedBy=multi-user.target
+

Change the file permissions by running the command:

+
sudo chmod 644 /etc/systemd/system/docker-lightning.service
+

Next, reload the Systemctl Daemon:

+
sudo systemctl daemon-reload
+

Enable the service on startup when the system boots:

+
sudo systemctl enable docker-lightning.service
+

Learn how to manage the Systemd Service by reading the section systemd service.

+

Frequently Used Commands (Quick Reference)

+

A quick reference of the most Frequently Used Commands are available for Native and Docker setups. If you'd like a more in depth explanation of the commands, check the health check, analyzing logs, systemd service and guides sections separately.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/node/lightning-cli/index.html b/docs/node/lightning-cli/index.html index 9d5c92af2..4ba45ef89 100644 --- a/docs/node/lightning-cli/index.html +++ b/docs/node/lightning-cli/index.html @@ -1,9 +1,9 @@ - + - -Lightning CLI | Fleek Network Docs | Decentralized Edge Platform + +Lightning CLI | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,21 @@ - - - + + + - + -
-

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

tip

A quick reference of frequently used commands are available for native and docker setups.

Show the Lightning CLI help

lgtn help
Usage: lgtn [OPTIONS] <COMMAND>

Commands:
run Run the full node
keys Key management utilities
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
--with-console Enable the Tokio Console asynchronous debugger
--with-log-locations Enable code locations when printing logs
-v... Increases the level of verbosity (the max level is -vvv)
-h, --help Print help
-V, --version Print version

Finding help for a specific option

lgtn keys help
Key management utilities

Usage: lgtn keys [OPTIONS] <COMMAND>

Commands:
show Print the node's public keys
generate Generate new private keys. This command will fail if the keys already exist
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
--with-console Enable the Tokio Console asynchronous debugger
--with-log-locations Enable code locations when printing logs
-v... Increases the level of verbosity (the max level is -vvv)
-h, --help Print help
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

+
tip

A quick reference of frequently used commands are available for native and docker setups.

+

Show the Lightning CLI help

+
lgtn help
+
Usage: lgtn [OPTIONS] <COMMAND>

Commands:
run Run the full node
keys Key management utilities
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
--with-console Enable the Tokio Console asynchronous debugger
--with-log-locations Enable code locations when printing logs
-v... Increases the level of verbosity (the max level is -vvv)
-h, --help Print help
-V, --version Print version
+

Finding help for a specific option

+
lgtn keys help
+
Key management utilities

Usage: lgtn keys [OPTIONS] <COMMAND>

Commands:
show Print the node's public keys
generate Generate new private keys. This command will fail if the keys already exist
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
--with-console Enable the Tokio Console asynchronous debugger
--with-log-locations Enable code locations when printing logs
-v... Increases the level of verbosity (the max level is -vvv)
-h, --help Print help
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/node/overview/index.html b/docs/node/overview/index.html index 9d20e2a88..382e101eb 100644 --- a/docs/node/overview/index.html +++ b/docs/node/overview/index.html @@ -1,9 +1,9 @@ - + - -Overview | Fleek Network Docs | Decentralized Edge Platform + +Overview | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,33 @@ - - - + + + - + -
-

Overview

This section provides instructions to help you build a Fleek Network Node, it's aimed at everybody willing to learn and cultivate knowledge as a node operator.

tip

To participate in the alpha Testnet, you can begin by setting up and running nodes. Check the requirements and find the onboarding instructions to enable you to install a network node successfully.

Node operator


A Node Operator is represented as a system administrator who builds, installs or maintains one or many nodes in a server or more.

Anyone willing to learn can become a Node operator, which will be enabled to set up and run a Node on their own at any time without the need for anyone's permission.

Amongst others, the use cases we try to cover are:

  • Server requirements
  • Installing the Node easily with the installation wizard
  • Building a Node binary from source code
  • Configuring the Node
  • Securing the server and identity
  • Updating the Node
  • Learning to troubleshoot
  • Learning how to analyze the node process log messages
tip

While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our discord or by opening a PR in any of our repositories.

Ready? Start by checking the server requirements

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Overview

+

This section provides instructions to help you build a Fleek Network Node, it's aimed at everybody willing to learn and cultivate knowledge as a node operator.

+
tip

To participate in the alpha Testnet, you can begin by setting up and running nodes. Check the requirements and find the onboarding instructions to enable you to install a network node successfully.

+

Node operator

+
+

A Node Operator is represented as a system administrator who builds, installs or maintains one or many nodes in a server or more.

+

Anyone willing to learn can become a Node operator, which will be enabled to set up and run a Node on their own at any time without the need for anyone's permission.

+

Amongst others, the use cases we try to cover are:

+
    +
  • Server requirements
  • +
  • Installing the Node easily with the installation wizard
  • +
  • Building a Node binary from source code
  • +
  • Configuring the Node
  • +
  • Securing the server and identity
  • +
  • Updating the Node
  • +
  • Learning to troubleshoot
  • +
  • Learning how to analyze the node process log messages
  • +
+
tip

While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our discord or by opening a PR in any of our repositories.

+

Ready? Start by checking the server requirements

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/node/requirements/index.html b/docs/node/requirements/index.html index 5490cab66..fff886a94 100644 --- a/docs/node/requirements/index.html +++ b/docs/node/requirements/index.html @@ -1,9 +1,9 @@ - + - -Requirements | Fleek Network Docs | Decentralized Edge Platform + +Requirements | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,77 @@ - - - + + + - + -
-

Requirements

This section provides the requirements for the server specifications on which the Fleek Network Node can be installed and run.

warning

Only 64-bits distributions are supported. Do not try to install it on a 32-bits operating system!

Server


The Fleek Network node binary is only supported by a Linux server. Currently, we are only providing support for the following distros:

  • Debian (>= 11)
  • Ubuntu (>= 22.04 LTS)
tip

Support for other OS will be made available soon, e.g. CentOS and Fedora. Feel free to test running on older versions, but we reduce the number of versions to ease support and keep instructions less verbose, which should be easily translatable to your preferred OS Distro and Version. Any contributions to provide support for your favorite distro are welcomed! Feel free to open a PR in our repositories.

Because of the use of Linux containerization technology, other operating systems, such as FreeBSD, OpenBSD, MacOS, Windows and others are not supported.

If you don’t have a server or a spare machine, keep reading as we'll give you some hints on how to rent one, although we are not affiliated with any provider.

Ports

Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully.

We reserve the following top level ranges:

  • TCP: 4200-4299
  • UDP: 4300-4399

Each service in the node has 10 ports reserved within each range.

note

For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node.

tip

For the Node Operators who opt to run the get.fleek.network assisted installer, the ports are verified if in use.

The Node process requires the following ports:

Connection Pool (4x00-4x09)

  • Netkit QUIC: 4300 (UDP)

Consensus (4x10-4x19)

  • Mempool: 4210 (TCP)
  • Primary: 4310 (UDP)
  • Worker: 4311 (UDP)

Handshake (4x20-4x29)

  • HTTP: 4220 (TCP)
  • TCP: 4221 (TCP)
  • WebRTC: 4320 (UDP)
  • WebTransport: 4321 (UDP)

RPC (4x30-4x39)

  • HTTP: 4230 (TCP)
  • WebSocket / WebTransport?

DHT (4x40-4x49)

  • UDP: 4340 (UDP)

Broadcast

  • Uses connection pool

Blockstore Server

  • Uses connection pool
required

The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports.

Specs


The recommended number of CPU cores is a minimum of 4 with a minimum CPU speed of 2.0 GHz. The Fleek Network node binary is only supported on CPUs that adhere to the x86_64 architecture (64-bit).

A minimum of 32 GB of memory (RAM) is required and a reasonable amount of disk space for the installation and running processes, which at the minimum should be around 20 GB.

note

We're mainly supporting GenuineIntel and there have been reports of failure to build the binary on AMD. The ARM64 is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference error building on ARM64.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Requirements

+

This section provides the requirements for the server specifications on which the Fleek Network Node can be installed and run.

+
warning

Only 64-bits distributions are supported. Do not try to install it on a 32-bits operating system!

+

Server

+
+

The Fleek Network node binary is only supported by a Linux server. Currently, we are only providing support for the following distros:

+
    +
  • Debian (>= 11)
  • +
  • Ubuntu (>= 22.04 LTS)
  • +
+
tip

Support for other OS will be made available soon, e.g. CentOS and Fedora. Feel free to test running on older versions, but we reduce the number of versions to ease support and keep instructions less verbose, which should be easily translatable to your preferred OS Distro and Version. Any contributions to provide support for your favorite distro are welcomed! Feel free to open a PR in our repositories.

+

Because of the use of Linux containerization technology, other operating systems, such as FreeBSD, OpenBSD, MacOS, Windows and others are not supported.

+

If you don’t have a server or a spare machine, keep reading as we'll give you some hints on how to rent one, although we are not affiliated with any provider.

+

Ports

+

Amongst other resources, ports play the role of managing and organizing network traffic. The ports initiate and terminate network connections crucial for the node to operate in the Fleek Network. The operating system should have the ports enabled and open for the node to run successfully.

+

We reserve the following top level ranges:

+
    +
  • TCP: 4200-4299
  • +
  • UDP: 4300-4399
  • +
+

Each service in the node has 10 ports reserved within each range.

+
note

For node operators, they can either choose to individually open up the assigned ports, or just open the top level ranges, at their discretion. But we reserve the full ranges for future use, so they should avoid any port conflicts with other software running on the node.

+
tip

For the Node Operators who opt to run the get.fleek.network assisted installer, the ports are verified if in use.

+

The Node process requires the following ports:

+

Connection Pool (4x00-4x09)

+
    +
  • Netkit QUIC: 4300 (UDP)
  • +
+

Consensus (4x10-4x19)

+
    +
  • Mempool: 4210 (TCP)
  • +
  • Primary: 4310 (UDP)
  • +
  • Worker: 4311 (UDP)
  • +
+

Handshake (4x20-4x29)

+
    +
  • HTTP: 4220 (TCP)
  • +
  • TCP: 4221 (TCP)
  • +
  • WebRTC: 4320 (UDP)
  • +
  • WebTransport: 4321 (UDP)
  • +
+

RPC (4x30-4x39)

+
    +
  • HTTP: 4230 (TCP)
  • +
  • WebSocket / WebTransport?
  • +
+

DHT (4x40-4x49)

+
    +
  • UDP: 4340 (UDP)
  • +
+

Broadcast

+
    +
  • Uses connection pool
  • +
+

Blockstore Server

+
    +
  • Uses connection pool
  • +
+
required

The ports should be freed before launching the node process. Any blockers or firewalls should be configured to enable the ports.

+

Specs

+
+

The recommended number of CPU cores is a minimum of 4 with a minimum CPU speed of 2.0 GHz. The Fleek Network node binary is only supported on CPUs that adhere to the x86_64 architecture (64-bit).

+

A minimum of 32 GB of memory (RAM) is required and a reasonable amount of disk space for the installation and running processes, which at the minimum should be around 20 GB.

+
note

We're mainly supporting GenuineIntel and there have been reports of failure to build the binary on AMD. The ARM64 is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference error building on ARM64.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/node/systemd-service/index.html b/docs/node/systemd-service/index.html index 581b832f3..4f5dced00 100644 --- a/docs/node/systemd-service/index.html +++ b/docs/node/systemd-service/index.html @@ -1,9 +1,9 @@ - + - -Systemd Service | Fleek Network Docs | Decentralized Edge Platform + +Systemd Service | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,45 @@ - - - + + + - + -
-

Systemd Service

In this section we describe how to enable, disable, start, stop the Systemd Service.

The service is set up by the assisted installer automatically, or manually as described in the manual installation and docker install.

Reload the daemon

Reload the Systemctl daemon by executing the command:

sudo systemctl daemon-reload

Enable

Enable the service for starting up on system boot:

sudo systemctl enable lightning.service
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl enable docker-lightning
caution

You shouldn't have prefixed the systemctl command with sudo when start/stop/status the service. Due to some VPS providers modifying the operating system, we had to present the examples prefixed with sudo for the wider audience. If you'd like to learn more about controlling Systemd services as a user check the reference Systemd user-service.

Disable

Disable the service for starting up on system boot:

sudo systemctl disable lightning.service
tip

If you have installed or setup the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl disable docker-lightning

Start

Start the service by:

sudo systemctl start lightning.service
tip

When naming the service, the *.service can be omitted. For this reason the command can be typed as follows:

sudo systemctl start lightning
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl start docker-lightning

Stop

Stop the service by:

sudo systemctl stop lightning
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl stop docker-lightning

Restart

Restart the service by:

sudo systemctl restart lightning
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl restart docker-lightning

Status

Check the service status by:

sudo systemctl status lightning.service
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl status docker-lightning
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Systemd Service

+

In this section we describe how to enable, disable, start, stop the Systemd Service.

+

The service is set up by the assisted installer automatically, or manually as described in the manual installation and docker install.

+

Reload the daemon

+

Reload the Systemctl daemon by executing the command:

+
sudo systemctl daemon-reload
+

Enable

+

Enable the service for starting up on system boot:

+
sudo systemctl enable lightning.service
+
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl enable docker-lightning
+
caution

You shouldn't have prefixed the systemctl command with sudo when start/stop/status the service. Due to some VPS providers modifying the operating system, we had to present the examples prefixed with sudo for the wider audience. If you'd like to learn more about controlling Systemd services as a user check the reference Systemd user-service.

+

Disable

+

Disable the service for starting up on system boot:

+
sudo systemctl disable lightning.service
+
tip

If you have installed or setup the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl disable docker-lightning
+

Start

+

Start the service by:

+
sudo systemctl start lightning.service
+
tip

When naming the service, the *.service can be omitted. For this reason the command can be typed as follows:

sudo systemctl start lightning
+
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl start docker-lightning
+

Stop

+

Stop the service by:

+
sudo systemctl stop lightning
+
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl stop docker-lightning
+

Restart

+

Restart the service by:

+
sudo systemctl restart lightning
+
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl restart docker-lightning
+

Status

+

Check the service status by:

+
sudo systemctl status lightning.service
+
tip

If you have installed or set up the Service as a Docker Container, prefix the service name with docker-.

sudo systemctl status docker-lightning
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/node/testnet-onboarding/index.html b/docs/node/testnet-onboarding/index.html index f396519d1..75d4bf24b 100644 --- a/docs/node/testnet-onboarding/index.html +++ b/docs/node/testnet-onboarding/index.html @@ -1,9 +1,9 @@ - + - -Testnet onboarding | Fleek Network Docs | Decentralized Edge Platform + +Testnet onboarding | Fleek Network Docs | Decentralized Edge Platform @@ -12,17 +12,84 @@ - - - + + + - + -
-
Important

The Testnet Phase {1} has finished on Thursday, Oct. 26th. Expect to see a detailed blog on all the results and findings from Phase {1} the following week, as well as some info on what comes next for Fleek Network on the Road to Mainnet.

Testnet Phase {1}:

Following the successful completion of Fleek Network Testnet Phase {0}, the core development team has been actively implementing the next set of core protocol functionalities, which include services, the reward's system, the broadcaster/synchronizer, as well as all identified improvements and fixes found during that phase.

Prerequesites

The Testnet Phase {1} is open to everybody. Everyone's free to join the Testnet Phase {1}, regardless of whether they have participated in any prior testnet phase, filled any forms or whitelisting.

The Fleek team cares about user experience and provides documentation and tools (whichever's your preference) to onboard easily and quickly. However, the Node operator's server should have the minimum requirements to set up and run a Fleek Network node.

To join, you will have to follow the steps below:

1) Install the Fleek Network Lightning CLI latest version

Once Fleek launches the Testnet Phase {1}, you have to install or update the Lightning CLI binary to the latest version. The instructions are available here where you can use an assisted installer or install it manually by following the documentation. If you already have it installed, use the update reference provided here or if you prefer a more step-by-step approach use the provided guide.

Warning

The Testnet Phase {1} version should only be available after the Testnet Phase {1} is ready and announced. Since we work transparently (open-source) some users rush to install things on their own assumptions, misaligned, which causes them confusion. The Fleek Network core team is required to provide all the changes, features and tests before announcing publicly that the testnet phase is ready. Otherwise, you'll be running the process prematurely, be patient to avoid disappointment please!

2) Set up the Metamask browser extension

Open the Metamask settings, located in the drop-down (top-right menu options). Set the following property values:

  • Network Name: Fleek Network Testnet
  • RPC URL: https://rpc.testnet.fleek.network/rpc/v0
  • Chain ID: 59330
  • Currency symbol: tFLK
note

Testnet FLK on testnets are supposed to have no real value. Since you need Testnet FLK to actually interact with Fleek Network, users get Testnet FLK for free from the faucet. For clarity and simplicity we'll refer to Testnet FLK as tFLK.

3) Visit the faucet website

Before proceeding, make sure to have the Fleek Network selected as the metamask network. Once confirmed, visit the Faucet website

4) Connect wallet

In the Faucet website, you have to click the Connect Wallet.

5) Mint tFLK

Once Connect Wallet is ready, proceed to Mint tFLK and wait until the balance of the account in your Metamask increases. You need to have tFLK before proceeding. Be patient.

6) Stake tFLK

Once tFLK balance is available, click in the Stake button. You'll be required to provided the following details from your node:

  • Node Public Key
  • Consensus Public Key
  • Server IP Address

You can get the details quickly by running the node details script in the terminal connected to your machine or server where the node is set up and running, as follows:

curl https://get.fleek.network/node_details | bash

The response should include the following details:

🤖 Your server details are the following

The Node Public Key is <NODE PUBLIC KEY>
The Consensus Public Key is <CONSENSUS PUBLIC KEY>
The Node Server IP address is <SERVER IP ADDRESS>
warning

The output above is an example, you'll not find the actual text <NODE PUBLIC KEY>, <CONSENSUS PUBLIC KEY> but the text values (string of bits), or <SERVER IP ADDRESS> where instead you'll find a numerical ip address. -Make sure that you copy and paste the correct values otherwise the transaction will fail!

7) Confirm the transaction on metamask

It is important to note that when transacting through Metamask, a warning message might pop up regarding gas costs, but rest assured that there won't be any deductions from your wallet balance.

You'll have to wait for Metamask to confirm the transaction, which Metamask should take about 10 seconds to confirm. Although, the transaction takes under a second.

Important to note that in Testnet Phase {1} the Epoch is set to about 30 minutes. This is the average period you'll have to wait to see any meaningful logs.

8) Start the Node

Visit the section Systemd Service to learn how to enable, disable, start, stop the Systemd Service.

note

The Systemd Service is setup automatically by the assisted installer, manually if you have followed the instructions provided, or the docker install. If you have a custom set up, you'll have to do the equivalent to start the node as described in the section Systemd Service.

Make sure you do a quick healthcheck:

curl https://get.fleek.network/healthcheck | bash

To learn more about healchecks read the section here.

9) Confirm Node Stake

To confirm the Node Staked amount, you can run the node details script to get the information. The node details output will only show staked information if available, if it doesn't show staked information it means that your Node is not properly staked.

Check the Node stake by running the following command in the machine or server where the node is set up:

curl https://get.fleek.network/node_details | bash

Alternatively, the Stake amount can be verified by querying the RPC-JSON API method flk_get_node_info.

Troubleshooting

The Node fails to run after successfully stake and run? Or the Core team network restart announcement?

The Fleek Network core team might have to restart the network, for any development purposes or required updates during the Testnet Phase {1}. If you've done this process before and is running into issues, you'll have to go into the Metamask advance settings (Metamask → Settings → Advanced) and click Clear activity and nonce data or Clear Local data. After doing this Metamask will clear the cache.

Node details don't show staked amount?

If you have staked successfully and the transaction details in the Metamask wallet is confirmed, but the node details script or the RPC-JSON API method flk_get_node_info shows an empty result, do the following:

Metamask:

  • Copy the Account address at the very top of your Metamask home
  • Copy the Transaction ID by clicking in the tFLK transaction → Copy Transaction ID at the very top
  • Copy the Activity log details of the transaction

Server where the Node is set up:

  • Copy the Node Public Key
  • Copy the Server IP Address
tip

You can get the Node Public Key and Server IP Address quick by using the node details script described in the section.

Report to us by sharing the details about via our discord troubleshooting channel.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +
Important

The Testnet Phase 1 has finished on Thursday, Oct. 26th. Expect to see a detailed blog on all the results and findings from Phase 1 the following week, as well as some info on what comes next for Fleek Network on the Road to Mainnet.

+

Testnet Phase 1:

+

Following the successful completion of Fleek Network Testnet Phase 0, the core development team has been actively implementing the next set of core protocol functionalities, which include services, the reward's system, the broadcaster/synchronizer, as well as all identified improvements and fixes found during that phase.

+

Prerequesites

+

The Testnet Phase 1 is open to everybody. Everyone's free to join the Testnet Phase 1, regardless of whether they have participated in any prior testnet phase, filled any forms or whitelisting.

+

The Fleek team cares about user experience and provides documentation and tools (whichever's your preference) to onboard easily and quickly. However, the Node operator's server should have the minimum requirements to set up and run a Fleek Network node.

+

To join, you will have to follow the steps below:

+

1) Install the Fleek Network Lightning CLI latest version

+

Once Fleek launches the Testnet Phase 1, you have to install or update the Lightning CLI binary to the latest version. The instructions are available here where you can use an assisted installer or install it manually by following the documentation. If you already have it installed, use the update reference provided here or if you prefer a more step-by-step approach use the provided guide.

+
Warning

The Testnet Phase 1 version should only be available after the Testnet Phase 1 is ready and announced. Since we work transparently (open-source) some users rush to install things on their own assumptions, misaligned, which causes them confusion. The Fleek Network core team is required to provide all the changes, features and tests before announcing publicly that the testnet phase is ready. Otherwise, you'll be running the process prematurely, be patient to avoid disappointment please!

+

2) Set up the Metamask browser extension

+

Open the Metamask settings, located in the drop-down (top-right menu options). Set the following property values:

+
    +
  • Network Name: Fleek Network Testnet
  • +
  • RPC URL: https://rpc.testnet.fleek.network/rpc/v0
  • +
  • Chain ID: 59330
  • +
  • Currency symbol: tFLK
  • +
+
note

Testnet FLK on testnets are supposed to have no real value. Since you need Testnet FLK to actually interact with Fleek Network, users get Testnet FLK for free from the faucet. For clarity and simplicity we'll refer to Testnet FLK as tFLK.

+

3) Visit the faucet website

+

Before proceeding, make sure to have the Fleek Network selected as the metamask network. Once confirmed, visit the Faucet website

+

4) Connect wallet

+

In the Faucet website, you have to click the Connect Wallet.

+

5) Mint tFLK

+

Once Connect Wallet is ready, proceed to Mint tFLK and wait until the balance of the account in your Metamask increases. You need to have tFLK before proceeding. Be patient.

+

6) Stake tFLK

+

Once tFLK balance is available, click in the Stake button. You'll be required to provided the following details from your node:

+
    +
  • Node Public Key
  • +
  • Consensus Public Key
  • +
  • Server IP Address
  • +
+

You can get the details quickly by running the node details script in the terminal connected to your machine or server where the node is set up and running, as follows:

+
curl https://get.fleek.network/node_details | bash
+

The response should include the following details:

+
🤖 Your server details are the following

The Node Public Key is <NODE PUBLIC KEY>
The Consensus Public Key is <CONSENSUS PUBLIC KEY>
The Node Server IP address is <SERVER IP ADDRESS>
+
warning

The output above is an example, you'll not find the actual text <NODE PUBLIC KEY>, <CONSENSUS PUBLIC KEY> but the text values (string of bits), or <SERVER IP ADDRESS> where instead you'll find a numerical ip address. +Make sure that you copy and paste the correct values otherwise the transaction will fail!

+

7) Confirm the transaction on metamask

+

It is important to note that when transacting through Metamask, a warning message might pop up regarding gas costs, but rest assured that there won't be any deductions from your wallet balance.

+

You'll have to wait for Metamask to confirm the transaction, which Metamask should take about 10 seconds to confirm. Although, the transaction takes under a second.

+

Important to note that in Testnet Phase 1 the Epoch is set to about 30 minutes. This is the average period you'll have to wait to see any meaningful logs.

+

8) Start the Node

+

Visit the section Systemd Service to learn how to enable, disable, start, stop the Systemd Service.

+
note

The Systemd Service is setup automatically by the assisted installer, manually if you have followed the instructions provided, or the docker install. If you have a custom set up, you'll have to do the equivalent to start the node as described in the section Systemd Service.

+

Make sure you do a quick healthcheck:

+
curl https://get.fleek.network/healthcheck | bash
+

To learn more about healchecks read the section here.

+

9) Confirm Node Stake

+

To confirm the Node Staked amount, you can run the node details script to get the information. The node details output will only show staked information if available, if it doesn't show staked information it means that your Node is not properly staked.

+

Check the Node stake by running the following command in the machine or server where the node is set up:

+
curl https://get.fleek.network/node_details | bash
+

Alternatively, the Stake amount can be verified by querying the RPC-JSON API method flk_get_node_info.

+

Troubleshooting

+

The Node fails to run after successfully stake and run? Or the Core team network restart announcement?

+

The Fleek Network core team might have to restart the network, for any development purposes or required updates during the Testnet Phase 1. If you've done this process before and is running into issues, you'll have to go into the Metamask advance settings (Metamask → Settings → Advanced) and click Clear activity and nonce data or Clear Local data. After doing this Metamask will clear the cache.

+

Node details don't show staked amount?

+

If you have staked successfully and the transaction details in the Metamask wallet is confirmed, but the node details script or the RPC-JSON API method flk_get_node_info shows an empty result, do the following:

+

Metamask:

+
    +
  • Copy the Account address at the very top of your Metamask home
  • +
  • Copy the Transaction ID by clicking in the tFLK transaction → Copy Transaction ID at the very top
  • +
  • Copy the Activity log details of the transaction
  • +
+

Server where the Node is set up:

+
    +
  • Copy the Node Public Key
  • +
  • Copy the Server IP Address
  • +
+
tip

You can get the Node Public Key and Server IP Address quick by using the node details script described in the section.

+

Report to us by sharing the details about via our discord troubleshooting channel.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/docs/roadmap/index.html b/docs/roadmap/index.html index 51b35ae81..a68f62980 100644 --- a/docs/roadmap/index.html +++ b/docs/roadmap/index.html @@ -1,9 +1,9 @@ - + - -Roadmap | Fleek Network Docs | Decentralized Edge Platform + +Roadmap | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,61 @@ - - - + + + - + -
-

Roadmap

Introduction

Instead of restricting our network architecture/capabilities to a CDN service, Fleek Network's core was redesigned to support a fully decentralized edge platform upon which many edge services e.g. CDN, serverless functions, amongst others, can be built. The new architecture separates each aspect of the network (blockchain - edge infrastructure - services) so that anyone can build new edge services on Fleek Network.

Several milestones were completed toward our next early Testnet goal: the whitepaper was launched, and the Github repo was published.

For a complete description of our testnet plans, road to mainnet, and testnet participation initiatives, read the following blog post.

Current state: Road to Testnet

Our current roadmap on the road to an early testnet stands as follows, currently in *Phase {0}:

Phases 0 to 5

Fleek Network will utilize a multi-phase approach to rolling out mainnet. The current high-level plan, set out below, depends on a variety of factors and may change in response to development timelines and/or data/feedback collected throughout the different phases.

  • Phase 0 (September 5th): Node Rollout
    • Initial network and node testing (performance, hardware specs, clustering, costs, metrics, etc.)
  • Phase 1 (mid-late September): SDK/Service Rollout
    • Introduce the SDK and test the building and utilizing of services on the network, as well as some optimizations based on Phase 0.
  • Phase 2 (October): Initial Economics Rollout
    • Introduce and test a more concrete version of the economic algorithm, including staking, pricing, and other elements/situations using test (valueless) tokens, as well as some optimizations based on Phase 1.
  • Phase 3 (November): Layer 2 Contracts Rollout
    • Introduce a test version of the aspects of the protocol that will live on an Ethereum L2 (staking, deposit and token contracts, communication between L2/FN, etc).
  • Phase 4 (December): Final Rollout
    • Introduce the final form of the first generation of the network, based on all data/feedback and optimizations throughout all the phases, and allow testing of what a realistic mainnet environment will be like.
  • Phase 5 (Q1 2024): Mainnet Launch

The goals for all stages involve completing and revising the following:

  • Network performance
  • Hardware/node specs
  • Sandboxing of services
  • Packaging and pricing of initial network resources/commodities
  • Parameters related to the FLK token
  • Security testing/auditing
  • Criteria for allocation of pre-mainnet community tokens

Mainnet

The mainnet release of Fleek Network will come with the arrival of a stable and end-to-end tested version of the protocol. Details on the transition to mainnet will be discussed later in the future.

We will continue to update this roadmap in the short and long term to reflect the different stages the network goes through.

- - +

Roadmap

Introduction

+

Instead of restricting our network architecture/capabilities to a CDN service, Fleek Network's core was redesigned to support a fully decentralized edge platform upon which many edge services e.g. CDN, serverless functions, amongst others, can be built. The new architecture separates each aspect of the network (blockchain - edge infrastructure - services) so that anyone can build new edge services on Fleek Network.

+

Several milestones were completed toward our next early Testnet goal: the whitepaper was launched, and the Github repo was published.

+

For a complete description of our testnet plans, road to mainnet, and testnet participation initiatives, read the following blog post.

+

Current state: Road to Testnet

+

Our current roadmap on the road to an early testnet stands as follows, currently in **Phase 0*:

+

Phases 0 to 5

+

Fleek Network will utilize a multi-phase approach to rolling out mainnet. The current high-level plan, set out below, depends on a variety of factors and may change in response to development timelines and/or data/feedback collected throughout the different phases.

+
    +
  • Phase 0 (September 5th): Node Rollout +
      +
    • Initial network and node testing (performance, hardware specs, clustering, costs, metrics, etc.)
    • +
    +
  • +
  • Phase 1 (mid-late September): SDK/Service Rollout +
      +
    • Introduce the SDK and test the building and utilizing of services on the network, as well as some optimizations based on Phase 0.
    • +
    +
  • +
  • Phase 2 (October): Initial Economics Rollout +
      +
    • Introduce and test a more concrete version of the economic algorithm, including staking, pricing, and other elements/situations using test (valueless) tokens, as well as some optimizations based on Phase 1.
    • +
    +
  • +
  • Phase 3 (November): Layer 2 Contracts Rollout +
      +
    • Introduce a test version of the aspects of the protocol that will live on an Ethereum L2 (staking, deposit and token contracts, communication between L2/FN, etc).
    • +
    +
  • +
  • Phase 4 (December): Final Rollout +
      +
    • Introduce the final form of the first generation of the network, based on all data/feedback and optimizations throughout all the phases, and allow testing of what a realistic mainnet environment will be like.
    • +
    +
  • +
  • Phase 5 (Q1 2024): Mainnet Launch
  • +
+

The goals for all stages involve completing and revising the following:

+
    +
  • Network performance
  • +
  • Hardware/node specs
  • +
  • Sandboxing of services
  • +
  • Packaging and pricing of initial network resources/commodities
  • +
  • Parameters related to the FLK token
  • +
  • Security testing/auditing
  • +
  • Criteria for allocation of pre-mainnet community tokens
  • +
+

Mainnet

+

The mainnet release of Fleek Network will come with the arrival of a stable and end-to-end tested version of the protocol. Details on the transition to mainnet will be discussed later in the future.

+

We will continue to update this roadmap in the short and long term to reflect the different stages the network goes through.

\ No newline at end of file diff --git a/docs/tags/about/index.html b/docs/tags/about/index.html index a1f353281..c53ea3c2e 100644 --- a/docs/tags/about/index.html +++ b/docs/tags/about/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "about" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "about" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "about"

View All Tags

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

- - +

One doc tagged with "about"

View All Tags

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

\ No newline at end of file diff --git a/docs/tags/algorithms/index.html b/docs/tags/algorithms/index.html index 0a596bb77..b18556896 100644 --- a/docs/tags/algorithms/index.html +++ b/docs/tags/algorithms/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "algorithms" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "algorithms" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "algorithms"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "algorithms"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/architecture/index.html b/docs/tags/architecture/index.html index 54ad5695f..be70098bc 100644 --- a/docs/tags/architecture/index.html +++ b/docs/tags/architecture/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "architecture" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "architecture" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "architecture"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "architecture"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/awards/index.html b/docs/tags/awards/index.html index 9e1cdaf5f..2e1065366 100644 --- a/docs/tags/awards/index.html +++ b/docs/tags/awards/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "awards" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "awards" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "awards"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

- - +

One doc tagged with "awards"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

\ No newline at end of file diff --git a/docs/tags/build/index.html b/docs/tags/build/index.html index 4981d0f43..e539c9849 100644 --- a/docs/tags/build/index.html +++ b/docs/tags/build/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "build" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "build" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "build"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

Overview

Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.

- - +

2 docs tagged with "build"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

Overview

Learn about server requirements, installation, configuration, and more. Become a Node Operator and contribute to the network's growth.

\ No newline at end of file diff --git a/docs/tags/cdn/index.html b/docs/tags/cdn/index.html index 60a21b4e6..da3c710db 100644 --- a/docs/tags/cdn/index.html +++ b/docs/tags/cdn/index.html @@ -1,9 +1,9 @@ - + - -4 docs tagged with "CDN" | Fleek Network Docs | Decentralized Edge Platform + +4 docs tagged with "CDN" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

4 docs tagged with "CDN"

View All Tags

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Install

The Fleek Network Lightning CLI installation walkthrough

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

Whitepaper

Fleek Network's whitepaper and codebase.

- - +

4 docs tagged with "CDN"

View All Tags

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Install

The Fleek Network Lightning CLI installation walkthrough

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

Whitepaper

Fleek Network's whitepaper and codebase.

\ No newline at end of file diff --git a/docs/tags/cli/index.html b/docs/tags/cli/index.html index 71564afc8..56f7835a4 100644 --- a/docs/tags/cli/index.html +++ b/docs/tags/cli/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "cli" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "cli" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "cli"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

- - +

One doc tagged with "cli"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

\ No newline at end of file diff --git a/docs/tags/client/index.html b/docs/tags/client/index.html index e52d464ea..80fdb2de8 100644 --- a/docs/tags/client/index.html +++ b/docs/tags/client/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "client" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "client" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/code-of-conduct/index.html b/docs/tags/code-of-conduct/index.html index 640e92ac2..d43f5cb67 100644 --- a/docs/tags/code-of-conduct/index.html +++ b/docs/tags/code-of-conduct/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "code of conduct" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "code of conduct" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/codebase/index.html b/docs/tags/codebase/index.html index c1e6e680c..65c6d5626 100644 --- a/docs/tags/codebase/index.html +++ b/docs/tags/codebase/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Codebase" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Codebase" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/command-line-interface/index.html b/docs/tags/command-line-interface/index.html index b38209459..75b16bd35 100644 --- a/docs/tags/command-line-interface/index.html +++ b/docs/tags/command-line-interface/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "command line interface" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "command line interface" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "command line interface"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

- - +

One doc tagged with "command line interface"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

\ No newline at end of file diff --git a/docs/tags/compile/index.html b/docs/tags/compile/index.html index bfbce2050..089cf2294 100644 --- a/docs/tags/compile/index.html +++ b/docs/tags/compile/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "compile" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "compile" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "compile"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

- - +

One doc tagged with "compile"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

\ No newline at end of file diff --git a/docs/tags/configuration/index.html b/docs/tags/configuration/index.html index 5a54ddb8a..005cb86d4 100644 --- a/docs/tags/configuration/index.html +++ b/docs/tags/configuration/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Configuration" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Configuration" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/consensus/index.html b/docs/tags/consensus/index.html index 4a0b99db0..38d48aa5e 100644 --- a/docs/tags/consensus/index.html +++ b/docs/tags/consensus/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "consensus" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "consensus" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "consensus"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "consensus"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/contribute/index.html b/docs/tags/contribute/index.html index 67f599b4a..ec80cd4b7 100644 --- a/docs/tags/contribute/index.html +++ b/docs/tags/contribute/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "contribute" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "contribute" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/control/index.html b/docs/tags/control/index.html index 84f9ac61c..dea40a673 100644 --- a/docs/tags/control/index.html +++ b/docs/tags/control/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "control" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "control" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/decentralization/index.html b/docs/tags/decentralization/index.html index 49f619e31..c60be4aa6 100644 --- a/docs/tags/decentralization/index.html +++ b/docs/tags/decentralization/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "decentralization" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "decentralization" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "decentralization"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "decentralization"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/develop/index.html b/docs/tags/develop/index.html index 49e87e844..a1841ec68 100644 --- a/docs/tags/develop/index.html +++ b/docs/tags/develop/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "develop" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "develop" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "develop"

View All Tags

Overview

Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

- - +

2 docs tagged with "develop"

View All Tags

Overview

Developers can create and utilize a multitude of Edge Services that inherit cryptographic and economically secured infrastructure. On top of geographic coverage guarantees, predictable costs and performance across all services running on the network.

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

\ No newline at end of file diff --git a/docs/tags/diagnostic/index.html b/docs/tags/diagnostic/index.html index b2ea58d96..6a96c851d 100644 --- a/docs/tags/diagnostic/index.html +++ b/docs/tags/diagnostic/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "diagnostic" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "diagnostic" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/diagnostics/index.html b/docs/tags/diagnostics/index.html index 0fdc6d5b4..357485cbc 100644 --- a/docs/tags/diagnostics/index.html +++ b/docs/tags/diagnostics/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Diagnostics" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Diagnostics" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/economics/index.html b/docs/tags/economics/index.html index 8438eca6a..8d2352cfd 100644 --- a/docs/tags/economics/index.html +++ b/docs/tags/economics/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "economics" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "economics" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "economics"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

- - +

One doc tagged with "economics"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

\ No newline at end of file diff --git a/docs/tags/edge-network/index.html b/docs/tags/edge-network/index.html index bf7205559..52d94e9ed 100644 --- a/docs/tags/edge-network/index.html +++ b/docs/tags/edge-network/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Edge Network" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Edge Network" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/edge-platform/index.html b/docs/tags/edge-platform/index.html index 620b9d67a..e62b645e0 100644 --- a/docs/tags/edge-platform/index.html +++ b/docs/tags/edge-platform/index.html @@ -1,9 +1,9 @@ - + - -4 docs tagged with "Edge Platform" | Fleek Network Docs | Decentralized Edge Platform + +4 docs tagged with "Edge Platform" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

4 docs tagged with "Edge Platform"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

Whitepaper

Fleek Network's whitepaper and codebase.

- - +

4 docs tagged with "Edge Platform"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

Whitepaper

Fleek Network's whitepaper and codebase.

\ No newline at end of file diff --git a/docs/tags/fleek-network/index.html b/docs/tags/fleek-network/index.html index 3cba1be59..afc89d130 100644 --- a/docs/tags/fleek-network/index.html +++ b/docs/tags/fleek-network/index.html @@ -1,9 +1,9 @@ - + - -7 docs tagged with "Fleek Network" | Fleek Network Docs | Decentralized Edge Platform + +7 docs tagged with "Fleek Network" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

7 docs tagged with "Fleek Network"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Install

The Fleek Network Lightning CLI installation walkthrough

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

Roadmap

Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.

Whitepaper

Fleek Network's whitepaper and codebase.

- - +

7 docs tagged with "Fleek Network"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Install

The Fleek Network Lightning CLI installation walkthrough

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

Roadmap

Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.

Whitepaper

Fleek Network's whitepaper and codebase.

\ No newline at end of file diff --git a/docs/tags/getting-started/index.html b/docs/tags/getting-started/index.html index a17b06533..e55668eba 100644 --- a/docs/tags/getting-started/index.html +++ b/docs/tags/getting-started/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "Getting Started" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "Getting Started" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "Getting Started"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

- - +

2 docs tagged with "Getting Started"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

\ No newline at end of file diff --git a/docs/tags/git/index.html b/docs/tags/git/index.html index ecefa04dd..b09950c7d 100644 --- a/docs/tags/git/index.html +++ b/docs/tags/git/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "git" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "git" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/guide/index.html b/docs/tags/guide/index.html index 10ae0767b..285e69cf3 100644 --- a/docs/tags/guide/index.html +++ b/docs/tags/guide/index.html @@ -1,9 +1,9 @@ - + - -4 docs tagged with "Guide" | Fleek Network Docs | Decentralized Edge Platform + +4 docs tagged with "Guide" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

4 docs tagged with "Guide"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Install

The Fleek Network Lightning CLI installation walkthrough

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

- - +

4 docs tagged with "Guide"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Install

The Fleek Network Lightning CLI installation walkthrough

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

\ No newline at end of file diff --git a/docs/tags/healthcheck/index.html b/docs/tags/healthcheck/index.html index 2240461ef..b0aba57c6 100644 --- a/docs/tags/healthcheck/index.html +++ b/docs/tags/healthcheck/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "healthcheck" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "healthcheck" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/incentives/index.html b/docs/tags/incentives/index.html index 370afb7de..b54edeab7 100644 --- a/docs/tags/incentives/index.html +++ b/docs/tags/incentives/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "incentives" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "incentives" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "incentives"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

- - +

One doc tagged with "incentives"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

\ No newline at end of file diff --git a/docs/tags/index.html b/docs/tags/index.html index 7edc0506f..13f6e18ea 100644 --- a/docs/tags/index.html +++ b/docs/tags/index.html @@ -1,9 +1,9 @@ - + - -Tags | Fleek Network Docs | Decentralized Edge Platform + +Tags | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/learn/index.html b/docs/tags/learn/index.html index 5e1c11a1c..33723d176 100644 --- a/docs/tags/learn/index.html +++ b/docs/tags/learn/index.html @@ -1,9 +1,9 @@ - + - -4 docs tagged with "Learn" | Fleek Network Docs | Decentralized Edge Platform + +4 docs tagged with "Learn" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

4 docs tagged with "Learn"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

- - +

4 docs tagged with "Learn"

View All Tags

About

Welcome to the documentation site for Fleek Network, the decentralized content and application layer built on established decentralized storage protocols combined with high-speed caching and an effective delivery layer.

Developers

Join Fleek Network as a developer. Dive into our Whitepaper, Github, and SDK details. Stay updated with our newsletter and Discord community.

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

\ No newline at end of file diff --git a/docs/tags/lgtn/index.html b/docs/tags/lgtn/index.html index 8ff1043aa..4aaf015f1 100644 --- a/docs/tags/lgtn/index.html +++ b/docs/tags/lgtn/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "lgtn" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "lgtn" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "lgtn"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

- - +

One doc tagged with "lgtn"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

\ No newline at end of file diff --git a/docs/tags/lightning/index.html b/docs/tags/lightning/index.html index c95e6b957..b4b6b7c63 100644 --- a/docs/tags/lightning/index.html +++ b/docs/tags/lightning/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "lightning" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "lightning" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "lightning"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

- - +

One doc tagged with "lightning"

View All Tags

Lightning CLI

With the Lightning CLI, you can execute various tasks such as running the node, accessing key management utilities, and printing the loaded configuration. The interface is user-friendly and provides detailed information about each sub-command through the help command.

\ No newline at end of file diff --git a/docs/tags/logs/index.html b/docs/tags/logs/index.html index fdad86223..ec95294ad 100644 --- a/docs/tags/logs/index.html +++ b/docs/tags/logs/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "logs" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "logs" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/manage/index.html b/docs/tags/manage/index.html index e680e9d21..2b54e7a52 100644 --- a/docs/tags/manage/index.html +++ b/docs/tags/manage/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "manage" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "manage" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/manual/index.html b/docs/tags/manual/index.html index 876e62cac..1fbf2ed5f 100644 --- a/docs/tags/manual/index.html +++ b/docs/tags/manual/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "manual" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "manual" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "manual"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

- - +

One doc tagged with "manual"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

\ No newline at end of file diff --git a/docs/tags/node-status/index.html b/docs/tags/node-status/index.html index f4b1c5d52..78346711a 100644 --- a/docs/tags/node-status/index.html +++ b/docs/tags/node-status/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "node status" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "node status" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/onboarding/index.html b/docs/tags/onboarding/index.html index f6292588d..42fa7fd58 100644 --- a/docs/tags/onboarding/index.html +++ b/docs/tags/onboarding/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "onboarding" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "onboarding" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "onboarding"

View All Tags

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

- - +

One doc tagged with "onboarding"

View All Tags

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

\ No newline at end of file diff --git a/docs/tags/open-source/index.html b/docs/tags/open-source/index.html index 69c285bf8..b2b616a9f 100644 --- a/docs/tags/open-source/index.html +++ b/docs/tags/open-source/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "Open source" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "Open source" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/permissionless/index.html b/docs/tags/permissionless/index.html index dd269940d..4cc45c87a 100644 --- a/docs/tags/permissionless/index.html +++ b/docs/tags/permissionless/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "permissionless" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "permissionless" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "permissionless"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "permissionless"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/phases/index.html b/docs/tags/phases/index.html index 794d1f0dc..54d985830 100644 --- a/docs/tags/phases/index.html +++ b/docs/tags/phases/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "phases" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "phases" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "phases"

View All Tags

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

- - +

One doc tagged with "phases"

View All Tags

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

\ No newline at end of file diff --git a/docs/tags/pledge/index.html b/docs/tags/pledge/index.html index e8aea4c4e..b7220fe8f 100644 --- a/docs/tags/pledge/index.html +++ b/docs/tags/pledge/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "pledge" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "pledge" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/ports/index.html b/docs/tags/ports/index.html index 9215032d5..0464a2b22 100644 --- a/docs/tags/ports/index.html +++ b/docs/tags/ports/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "ports" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "ports" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "ports"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "ports"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/protocol/index.html b/docs/tags/protocol/index.html index 58a1c3897..c8f644585 100644 --- a/docs/tags/protocol/index.html +++ b/docs/tags/protocol/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "protocol" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "protocol" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "protocol"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "protocol"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/repository/index.html b/docs/tags/repository/index.html index 3f2eb3e8a..8abf52a16 100644 --- a/docs/tags/repository/index.html +++ b/docs/tags/repository/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "repository" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "repository" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/reputation/index.html b/docs/tags/reputation/index.html index d179b93c9..c5b293c7c 100644 --- a/docs/tags/reputation/index.html +++ b/docs/tags/reputation/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "reputation" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "reputation" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "reputation"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "reputation"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/requirements/index.html b/docs/tags/requirements/index.html index 874a82dde..26ce2dc52 100644 --- a/docs/tags/requirements/index.html +++ b/docs/tags/requirements/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "requirements" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "requirements" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "requirements"

View All Tags

Requirements

The requirements for the server specifications on which the Fleek Network Node can be installed and run.

- - +

One doc tagged with "requirements"

View All Tags

Requirements

The requirements for the server specifications on which the Fleek Network Node can be installed and run.

\ No newline at end of file diff --git a/docs/tags/rewards/index.html b/docs/tags/rewards/index.html index a8a2a2af1..6b47f3941 100644 --- a/docs/tags/rewards/index.html +++ b/docs/tags/rewards/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "rewards" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "rewards" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "rewards"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

- - +

One doc tagged with "rewards"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

\ No newline at end of file diff --git a/docs/tags/roadmap/index.html b/docs/tags/roadmap/index.html index d19a59cd9..80d3b167f 100644 --- a/docs/tags/roadmap/index.html +++ b/docs/tags/roadmap/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Roadmap" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Roadmap" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "Roadmap"

View All Tags

Roadmap

Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.

- - +

One doc tagged with "Roadmap"

View All Tags

Roadmap

Fleek Network's high-level roadmap per stage. Devnet, Testnet, and Mainnet.

\ No newline at end of file diff --git a/docs/tags/rpc/index.html b/docs/tags/rpc/index.html index 1657bd18c..54bd1372b 100644 --- a/docs/tags/rpc/index.html +++ b/docs/tags/rpc/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "rpc" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "rpc" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "rpc"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

One doc tagged with "rpc"

View All Tags

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/rust-dependencies/index.html b/docs/tags/rust-dependencies/index.html index 8e805f3a8..e743daf04 100644 --- a/docs/tags/rust-dependencies/index.html +++ b/docs/tags/rust-dependencies/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Rust dependencies" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Rust dependencies" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "Rust dependencies"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

- - +

One doc tagged with "Rust dependencies"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

\ No newline at end of file diff --git a/docs/tags/sdk/index.html b/docs/tags/sdk/index.html index cdb2ba216..e075a3a64 100644 --- a/docs/tags/sdk/index.html +++ b/docs/tags/sdk/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "sdk" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "sdk" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "sdk"

View All Tags

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

- - +

One doc tagged with "sdk"

View All Tags

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

\ No newline at end of file diff --git a/docs/tags/server/index.html b/docs/tags/server/index.html index 4a109f0bd..6f995465a 100644 --- a/docs/tags/server/index.html +++ b/docs/tags/server/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "server" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "server" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "server"

View All Tags

Requirements

The requirements for the server specifications on which the Fleek Network Node can be installed and run.

- - +

One doc tagged with "server"

View All Tags

Requirements

The requirements for the server specifications on which the Fleek Network Node can be installed and run.

\ No newline at end of file diff --git a/docs/tags/services/index.html b/docs/tags/services/index.html index 424d800da..9eca0dde6 100644 --- a/docs/tags/services/index.html +++ b/docs/tags/services/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "services" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "services" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "services"

View All Tags

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

- - +

One doc tagged with "services"

View All Tags

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

\ No newline at end of file diff --git a/docs/tags/snarks/index.html b/docs/tags/snarks/index.html index 8f95fff6c..f321bae2d 100644 --- a/docs/tags/snarks/index.html +++ b/docs/tags/snarks/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "snarks" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "snarks" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "snarks"

View All Tags

Delivery Acknowledgements

Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

- - +

2 docs tagged with "snarks"

View All Tags

Delivery Acknowledgements

Dive into Fleek Network's Delivery Acknowledgements, immutable proofs of service delivery, and understand the role of SNARKs in them.

The Network

Explore Fleek Network’s core protocol, its architecture, and unique characteristics as a decentralized edge network.

\ No newline at end of file diff --git a/docs/tags/standards/index.html b/docs/tags/standards/index.html index 0d28f2f50..41a3c2ee8 100644 --- a/docs/tags/standards/index.html +++ b/docs/tags/standards/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "standards" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "standards" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/systemctl/index.html b/docs/tags/systemctl/index.html index 9f99d2b7b..7a1490b16 100644 --- a/docs/tags/systemctl/index.html +++ b/docs/tags/systemctl/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "systemctl" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "systemctl" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/systemd/index.html b/docs/tags/systemd/index.html index 6df2fcbb5..8d36975e3 100644 --- a/docs/tags/systemd/index.html +++ b/docs/tags/systemd/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "systemd" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "systemd" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/testnet/index.html b/docs/tags/testnet/index.html index 283fb95cb..60365d52b 100644 --- a/docs/tags/testnet/index.html +++ b/docs/tags/testnet/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "testnet" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "testnet" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "testnet"

View All Tags

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

- - +

One doc tagged with "testnet"

View All Tags

Testnet onboarding

Join Fleek's Testnet onboarding, follow Discord instructions to install and verify your node. Check live updates, attend community calls, and ensure node is setup correctly.

\ No newline at end of file diff --git a/docs/tags/token/index.html b/docs/tags/token/index.html index 33d3c83e1..7264a0ab9 100644 --- a/docs/tags/token/index.html +++ b/docs/tags/token/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "token" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "token" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "token"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

- - +

One doc tagged with "token"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

\ No newline at end of file diff --git a/docs/tags/tokenomics/index.html b/docs/tags/tokenomics/index.html index ffeef4af7..460cbf3be 100644 --- a/docs/tags/tokenomics/index.html +++ b/docs/tags/tokenomics/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "tokenomics" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "tokenomics" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "tokenomics"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

- - +

One doc tagged with "tokenomics"

View All Tags

Token and economics

Explore the preliminary breakdown of the Fleek Network's FLK token distribution, its integral role in node operations, the balance of economic incentives, and potential adjustments in pre-mainnet phases.

\ No newline at end of file diff --git a/docs/tags/toolkit/index.html b/docs/tags/toolkit/index.html index 1939b5053..f9cf0a702 100644 --- a/docs/tags/toolkit/index.html +++ b/docs/tags/toolkit/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "toolkit" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "toolkit" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "toolkit"

View All Tags

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

- - +

One doc tagged with "toolkit"

View All Tags

Services

Discover Fleek Network Services, modular software powered with the enhanced scalability and performance of edge networks.

\ No newline at end of file diff --git a/docs/tags/verification/index.html b/docs/tags/verification/index.html index fd30fc292..4e881d2e9 100644 --- a/docs/tags/verification/index.html +++ b/docs/tags/verification/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "verification" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "verification" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/docs/tags/whitepaper/index.html b/docs/tags/whitepaper/index.html index 1f47bbb3f..efbc259e7 100644 --- a/docs/tags/whitepaper/index.html +++ b/docs/tags/whitepaper/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "whitepaper" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "whitepaper" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "whitepaper"

View All Tags

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

Whitepaper

Fleek Network's whitepaper and codebase.

- - +

2 docs tagged with "whitepaper"

View All Tags

Introduction

Introduction to Fleek Network, a decentralized edge network. Learn its purpose, operation, and approach towards a decentralized infrastructure layer.

Whitepaper

Fleek Network's whitepaper and codebase.

\ No newline at end of file diff --git a/docs/tags/wizard/index.html b/docs/tags/wizard/index.html index 0f552818d..67d003dd4 100644 --- a/docs/tags/wizard/index.html +++ b/docs/tags/wizard/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "wizard" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "wizard" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "wizard"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

- - +

One doc tagged with "wizard"

View All Tags

Install

The Fleek Network Lightning CLI installation walkthrough

\ No newline at end of file diff --git a/docs/whitepaper/index.html b/docs/whitepaper/index.html index cbea7541c..6a34b3d4c 100644 --- a/docs/whitepaper/index.html +++ b/docs/whitepaper/index.html @@ -1,9 +1,9 @@ - + - -Whitepaper | Fleek Network Docs | Decentralized Edge Platform + +Whitepaper | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,19 @@ - - - + + + - + -
-

This section provides in-depth documentation and materials about the Fleek Network technology stack.

Whitepaper

The whitepaper outlines the technology that makes the Fleek Network Edge Computing Platform possible. It illustrates the foundation that makes it possible to reimagine the user experience for Decentralized Web Services and how to develop a fairer economy and ecosystem in collaboration with humans.

The latest whitepaper is available on this page, and it describes the protocol architecture, general operation, and characteristics.

- - +

This section provides in-depth documentation and materials about the Fleek Network technology stack.

+

Whitepaper

+

The whitepaper outlines the technology that makes the Fleek Network Edge Computing Platform possible. It illustrates the foundation that makes it possible to reimagine the user experience for Decentralized Web Services and how to develop a fairer economy and ecosystem in collaboration with humans.

+

The latest whitepaper is available on this page, and it describes the protocol architecture, general operation, and characteristics.

+
\ No newline at end of file diff --git a/guides/Node Operators/getting-started/index.html b/guides/Node Operators/getting-started/index.html index 7b729d44b..716f1ee54 100644 --- a/guides/Node Operators/getting-started/index.html +++ b/guides/Node Operators/getting-started/index.html @@ -1,9 +1,9 @@ - + - -Getting Started | Fleek Network Docs | Decentralized Edge Platform + +Getting Started | Fleek Network Docs | Decentralized Edge Platform @@ -12,18 +12,105 @@ - - - + + + - + -
-

Getting started guide

Introduction

For this guide, we’ll have a simple look into how Fleek Network works in its current development phase and briefly share some of the core concepts like spinning up a node.

For those seeking advanced knowledge:

tip

If you find any typos in our documentation, feel free to provide us feedback or contribute by opening a PR in our repository here.

Pre-requisites

To follow the guide, you will need the following:

  • Familiarity with the command-line interface
  • Git

Need a quick Fleek Network TL;DR?

Fleek Network is an open-source edge computing platform to accelerate the development and execution of the next generation of web services.

The system is built on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators. It relies on blockchain technology at its core, allowing governance and token rewards as incentives for participation in serving the network.

Made by an open community that's free to operate nodes or build services without the need for approvals, permissions, or intermediaries. Or simply, consume Fleek Network resources on demand, from anywhere, provided by services running on the edge.

Applications, platforms and protocols build and utilize decentralized services on the Fleek Network to optimize performance and reduce dependency on typical centralized cloud providers and corporate infrastructure.

Developers can build faster and launch better products by offloading parts of the development stack to the edge to focus on core features for the value proposition of the services being developed.

To get started, install a Network Node in a supported Linux server, such as Debian or Ubuntu (latest) by utilizing our simple assisted installer to help onboard as quickly as possible.

tip

Our network is open to everyone, so you're more than welcome to join us anytime without any restrictions, permission or formalities. We'd be happy to have you as part of our community!

Once connected to the server, open a terminal window and execute the following command:

curl https://get.fleek.network | bash

Follow the install assistant recommendations to have the node ready without hassle and as quickly as possible.

Why is Fleek Network needed?

Web3 products typically rely on centralized cloud infrastructure, which is vulnerable to attacks as computation and data can be easily manipulated to suit business goals. However, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage. The Fleek Network offers a sustainable alternative to traditional centralized architectures, providing a secure, transparent, and accessible decentralized edge computing future for everyone.

How Does Fleek Network Work?

When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated.

Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed.

The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the Epoch. This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly.

Running a Node

A Fleek Network node can be built and run on your machine. It’s an open-source project and is open for contributions.

The project is written with Rust, a general-purpose programming language that you need to have installed in advance to be able to follow the current guide.

tip

To set up Rust, packages and library dependencies can be tricky. The quickest is to visit the rustup.rs. Alternatively, if you haven't already, the build section has a manual installation document to help.

Clone the source code

We’ll clone the repository locally, build it and interact with the node through the binary or the HTTP JSON-RPC API with a client like cURL, but you can use a GUI (Postman, Insomnia, amongst others) if you prefer.

note

The ~/fleek-network/lightning or $HOME/fleek-network/lightning directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation.

Start by cloning the repository located at https://github.com/fleek-network/lightning

tip

You have several ways of doing this:

  • Clone via HTTPS
  • Clone via SSH
  • Download via Github CLI
  • Download the zip package from the repository

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. -Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. -Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning

Once the git clone completes, you’ll have the latest version at the time of cloning. You should use git to fetch or pull the latest versions consequently.

Dependencies

Install the required dependencies necessary for compiling general software and for our use-case Lightning CLI.

sudo apt-get install \
build-essential \
clang \
pkg-config \
libssl-dev \
gcc-multilib \
protobuf-compiler

Build

Start by changing the directory to the project directory where the source code is stored. If you have followed the recommended location that'll be ~/fleek-network/lightning, as follows:

cd ~/fleek-network/lightning

Run the Rust package manager clean and update commands.

cargo clean
cargo update

Next, execute the build command to compile the Fleek Network Lightning CLI binary.

cargo +stable build --release
tip

The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable.

Once the Rust compiler completes, the generated binary will be available in the source code project directory. If you stick with the default, that'll look like ~/fleek-network/lightning/target/debug/lightning-node.

To avoid having to specify the pathname every time, create a symbolic link to keep it short. Here we'll name the process as the global lgtn:

sudo ln -s "~/fleek-network/lightning/target/debug/lightning-node" /usr/local/bin/lgtn

Run the CLI with the flag version to confirm it's available globally.

lgtn --version

The output should look like:

Usage: lgtn [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
dev-init-only Initialize the node without starting it
dev-dump-graph Dump the infusion graph of the node instance
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version

Node Launch

After building, the node can be launched by running the subcommand run:

lgtn run
tip

It's highly recommend to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions.

Learn how to create a new Systemd service in the manual installation document.

Health check

It's important for Node operators to regularly check on the health of their resources to make sure everything is running smoothly. By doing this, they can get helpful feedback and know for sure if their Node is up and running. Some experienced node operators even automate this process using cronjobs and get reports sent to them via email or other custom methods.

curl -w "\n" localhost:4230/health

If everything goes well, the response should be:

OK

Alternatively, use the JSON-RPC method flk_ping:

curl -s \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "flk_ping",
"params": [],
"id": 1
}' \
localhost:4230/rpc/v0

Which response should return the key result with value pong:

{
"jsonrpc": "2.0",
"result": "pong",
"id": 1
}

Next steps

While you can run the Network Node as described here, it's required to set up the Network Node correctly and securely! It requires some degree of patience, knowledge and time to go through our guides, but we'll provide some guides and references to help you manage your network node server!

To avoid having to go through all the steps manually, we recommend reading our assisted installer document for quick onboarding.

Conclusion

We introduced Fleek Network as an open-source edge computing platform to help us accelerate the development and execution of the next generation of web services.

We have learned a bit about the importance of a decentralized edge computing network to reach and fulfill the future of computation and how the Fleek Network protocol works succinctly.

Furthermore, we guide you through a step-by-step installation of the network node process, where we pull the source code, build the binary and launch the service.

Finally, we do a quick health check to confirm the status of our node.

Discover more about the project by watching/contributing on GitHub, following us on Twitter, and joining our community Discord for any updates.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Getting started guide

+ + +

Introduction

+

For this guide, we’ll have a simple look into how Fleek Network works in its current development phase and briefly share some of the core concepts like spinning up a node.

+

For those seeking advanced knowledge:

+ +
tip

If you find any typos in our documentation, feel free to provide us feedback or contribute by opening a PR in our repository here.

+

Pre-requisites

+

To follow the guide, you will need the following:

+
    +
  • Familiarity with the command-line interface
  • +
  • Git
  • +
+

Need a quick Fleek Network TL;DR?

+

Fleek Network is an open-source edge computing platform to accelerate the development and execution of the next generation of web services.

+

The system is built on a distributed network of nodes, where services run within a fair and incentivized ecosystem constituted by an open community of developers and operators. It relies on blockchain technology at its core, allowing governance and token rewards as incentives for participation in serving the network.

+

Made by an open community that's free to operate nodes or build services without the need for approvals, permissions, or intermediaries. Or simply, consume Fleek Network resources on demand, from anywhere, provided by services running on the edge.

+

Applications, platforms and protocols build and utilize decentralized services on the Fleek Network to optimize performance and reduce dependency on typical centralized cloud providers and corporate infrastructure.

+

Developers can build faster and launch better products by offloading parts of the development stack to the edge to focus on core features for the value proposition of the services being developed.

+

To get started, install a Network Node in a supported Linux server, such as Debian or Ubuntu (latest) by utilizing our simple assisted installer to help onboard as quickly as possible.

+
tip

Our network is open to everyone, so you're more than welcome to join us anytime without any restrictions, permission or formalities. We'd be happy to have you as part of our community!

+

Once connected to the server, open a terminal window and execute the following command:

+
curl https://get.fleek.network | bash
+

Follow the install assistant recommendations to have the node ready without hassle and as quickly as possible.

+

Why is Fleek Network needed?

+

Web3 products typically rely on centralized cloud infrastructure, which is vulnerable to attacks as computation and data can be easily manipulated to suit business goals. However, blockchain technology has paved the way for a new era of decentralized cloud computing and data storage. The Fleek Network offers a sustainable alternative to traditional centralized architectures, providing a secure, transparent, and accessible decentralized edge computing future for everyone.

+

How Does Fleek Network Work?

+

When a client requests a service, the protocol determines the best route to the nodes where the service replicas and workload are allocated.

+

Once the computation is successful, the data streaming routes to the client. On-client request fulfillment, a proof of delivery is generated containing cryptographically secured metadata about the original request, any parts involved and the resources consumed.

+

The Delivery Acknowledgements are stored locally in the participating node memory pools, rolled up to the protocol consensus consistently throughout the Epoch. This agreement is formed by a random committee of any healthy Nodes that use the information provided to reward the Nodes fairly.

+

Running a Node

+

A Fleek Network node can be built and run on your machine. It’s an open-source project and is open for contributions.

+

The project is written with Rust, a general-purpose programming language that you need to have installed in advance to be able to follow the current guide.

+
tip

To set up Rust, packages and library dependencies can be tricky. The quickest is to visit the rustup.rs. Alternatively, if you haven't already, the build section has a manual installation document to help.

+

Clone the source code

+

We’ll clone the repository locally, build it and interact with the node through the binary or the HTTP JSON-RPC API with a client like cURL, but you can use a GUI (Postman, Insomnia, amongst others) if you prefer.

+
note

The ~/fleek-network/lightning or $HOME/fleek-network/lightning directory is the default or recommended location to store the repository. If you like to follow conventions, then is best to stick with the recommendation, to avoid confusion and make it easier to follow our documentation.

+

Start by cloning the repository located at https://github.com/fleek-network/lightning

+
tip

You have several ways of doing this:

    +
  • Clone via HTTPS
  • +
  • Clone via SSH
  • +
  • Download via Github CLI
  • +
  • Download the zip package from the repository
  • +

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. +Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. +Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning
+

Once the git clone completes, you’ll have the latest version at the time of cloning. You should use git to fetch or pull the latest versions consequently.

+

Dependencies

+

Install the required dependencies necessary for compiling general software and for our use-case Lightning CLI.

+
sudo apt-get install \
build-essential \
clang \
pkg-config \
libssl-dev \
gcc-multilib \
protobuf-compiler
+

Build

+

Start by changing the directory to the project directory where the source code is stored. If you have followed the recommended location that'll be ~/fleek-network/lightning, as follows:

+
cd ~/fleek-network/lightning
+

Run the Rust package manager clean and update commands.

+
cargo clean
cargo update
+

Next, execute the build command to compile the Fleek Network Lightning CLI binary.

+
cargo +stable build --release
+
tip

The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable.

+

Once the Rust compiler completes, the generated binary will be available in the source code project directory. If you stick with the default, that'll look like ~/fleek-network/lightning/target/debug/lightning-node.

+

To avoid having to specify the pathname every time, create a symbolic link to keep it short. Here we'll name the process as the global lgtn:

+
sudo ln -s "~/fleek-network/lightning/target/debug/lightning-node" /usr/local/bin/lgtn
+

Run the CLI with the flag version to confirm it's available globally.

+
lgtn --version
+

The output should look like:

+
Usage: lgtn [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
dev-init-only Initialize the node without starting it
dev-dump-graph Dump the infusion graph of the node instance
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version
+

Node Launch

+

After building, the node can be launched by running the subcommand run:

+
lgtn run
+
tip

It's highly recommend to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions.

+

Learn how to create a new Systemd service in the manual installation document.

+

Health check

+

It's important for Node operators to regularly check on the health of their resources to make sure everything is running smoothly. By doing this, they can get helpful feedback and know for sure if their Node is up and running. Some experienced node operators even automate this process using cronjobs and get reports sent to them via email or other custom methods.

+
curl -w "\n" localhost:4230/health
+

If everything goes well, the response should be:

+
OK
+

Alternatively, use the JSON-RPC method flk_ping:

+
curl -s \
-X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "flk_ping",
"params": [],
"id": 1
}' \
localhost:4230/rpc/v0
+

Which response should return the key result with value pong:

+
{
"jsonrpc": "2.0",
"result": "pong",
"id": 1
}
+

Next steps

+

While you can run the Network Node as described here, it's required to set up the Network Node correctly and securely! It requires some degree of patience, knowledge and time to go through our guides, but we'll provide some guides and references to help you manage your network node server!

+

To avoid having to go through all the steps manually, we recommend reading our assisted installer document for quick onboarding.

+

Conclusion

+

We introduced Fleek Network as an open-source edge computing platform to help us accelerate the development and execution of the next generation of web services.

+

We have learned a bit about the importance of a decentralized edge computing network to reach and fulfill the future of computation and how the Fleek Network protocol works succinctly.

+

Furthermore, we guide you through a step-by-step installation of the network node process, where we pull the source code, build the binary and launch the service.

+

Finally, we do a quick health check to confirm the status of our node.

+

Discover more about the project by watching/contributing on GitHub, following us on Twitter, and joining our community Discord for any updates.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/guides/Node Operators/how-to-manage-log-files/index.html b/guides/Node Operators/how-to-manage-log-files/index.html index 183b80cd2..7c153c818 100644 --- a/guides/Node Operators/how-to-manage-log-files/index.html +++ b/guides/Node Operators/how-to-manage-log-files/index.html @@ -1,9 +1,9 @@ - + - -How to manage log files | Fleek Network Docs | Decentralized Edge Platform + +How to manage log files | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,120 @@ - - - + + + - + -
-

How to manage log files

Introduction

The Fleek Network node streams text messages to the standard output and error in Linux. Given that disk space is a limited resource for most systems, the number of text data can be a cause of concern. Managing the file sizes by means of rotation and compression can help.

A conventional Fleek Network Service setup (as per the documentation and tool recommendations), have the text data stored in a special directory for storing logs called /var/log. The /var/log directory contains logs from various applications running on the operating system, the operating system itself, and others.

For the purpose of storing network node operation logs, it defaults to the /var/log/lightning directory where the files output.log (stdout) and diagnostic.log (stderr) is located and accumulated. As the node runs, the size of the files increase, as it aggregates all the output generated by the Fleek Network service operations, such as info, errors, etc.

A Node Operator can configure the system to rotate, compress, and set maximum size of these files to safeguard any concerns or issues that can get out of control, such as causing disk space to become full quickly.

In this guide, we'll look into some options available to manage the logs. First, we'll look into journald.conf which controls where to store journal data (the journal is a component of systemd that handles all the messages in a Systemd enabled system). Afterwards, we'll look into Logrotate an application to help us manage automatic rotation and compression of log files.

In essence, the journal and the logs duplicate the same information, and we want to make sure that we set measures to control it.

Journal

Journal is a component of Systemd, a centralized location for all messages logged by different components in a systemd-enabled Linux system. The systemd journal will happily run in parallel with the standard type log files in /var/log/* where the Fleek Network Systemd Unit Service outputs Standard Output and Standard Error in the location /var/log/lightning/*.log.

Here, we are going to learn how to configure the journald.conf service configuration file for the system-wide settings (meaning that it applies to all services), but firstly we're going to learn some commands to help us troubleshoot when necessary.

Commands

Disk utilization checkup

To check how much disk space is used by Systemd log files, run the command below:

sudo journalctl --disk-usage

It provides information of how much disk space is utilized by the log files in your system.

Clearing logs manually

The best way to clear log files is done automatically by the journald.conf configuration file, discussed in Configuration file. In the ideal world, you shouldn't have to manually delete the log files, but this can be useful to know about when troubleshooting.

To flush the log files run the command below:

sudo journalctl --flush --rotate
sudo journalctl --vacuum-time=1s
tip

The flush and rotate flag is used, as vaccum-time only clears archived logs and not active ones. It'll flush:

  • Move /run/log/journal to /var/log/journal
  • Rotate (this flag archives logs and retains it)

Since it'll only keep the past 1-second-long files, it'll effectively clear everything.

Follow or tail logs of service

sudo journalctl -u <SERVICE-NAME>.service -f

For example, for a conventional native install (if you haven't followed the conventions, make the appropriate tweaks to fit your needs).

sudo journalctl -u lightning.service -f

The Docker service

sudo journalctl -u docker-lightning.service -f

Show all service entries

Show all journal entries, which can be fairly long:

sudo journalctl

Configuration file

The default configuration file is located at /etc/systemd/journald.conf. This is the main file that journal reads the configuration from, for the system instances that are controlled by root.

In addition to the main configuration file there are a few other locations that take higher precedence and override the main configuration file. To learn more about journald read here.

To keep the guide short we are going to use the main location /etc/systemd/journald.conf.

Create the directory and config file

If the /etc/systemd/journald.conf file doesn't exist, create it by:

Create the journald.conf file:

sudo touch /etc/systemd/journald.conf

Configuration settings

The Systemd provides many options for you to manage the log files and by combining these parameters you can limit the disk space used by the journal files.

A list of the available options are here.

Here is a quick description of the options we're going to use for our example:

  • Storage, controls where to store journal data
  • SystemMaxUse, specifies the maximum disk space that can be used by the journal in persistent storage
  • SystemMaxFileSize, controls how large individual journal files can grow to in persistent storage before being rotated
  • RuntimeMaxUse, control how much disk space the journal may use up at most

You should open the /etc/systemd/journald.conf file in your favorite text editor and put:

[Journal]
Storage=persistent
SystemMaxUse=1G
SystemMaxFileSize=100M
RuntimeMaxUse=100M

Here, we set 1G and 100M, which means 1 Gigabyte and 100 Megabytes. You can also use K for Kbytes, amongst others.

After the changes, you have to restart the journald after updating the file. To restart use the command:

sudo systemctl restart systemd-journald

You can verify the integrity of the log files by running:

sudo journalctl --verify

Logrotate

Logrotate is a tool to manage the log files created by a system processes. It can automatically compress, rename, remove logs and more for your convenience and save your system's resources. Log files can be handled timely, or when it grows too large.

Prerequesite

The logrotate tools is available by default on Ubuntu.

tip

We're using Ubuntu for our guide to keep it simple. If you are using a different and support operating system make sure you install Logrotate before proceeding.

You can check if logrotate is installed by executing:

logrotate --version

At the time this guide was written, we got the following output:

logrotate 3.21.0

Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default uncompress command: /bin/gunzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
ACL support: yes
SELinux support: yes

If you run an earlier or older version, changes or tweaks might apply.

Explore the Configuration files

The configuration files we'll be exploring today are found in the following locations in Ubuntu:

  • /etc/logrotate.conf, is the main configuration settings file. It includes the statement to pull in configuration files from other directories, e.g. the /etc/logrotate.d

  • /etc/logrotate.d/, a directory where packages drop log rotation information

tip

We use Ubuntu for our guide, if you are on a different distro, you have to determine the file configuration file locations

The content of the file /etc/logrotate.conf should be similar to:

# see "man logrotate" for details

# global options do not affect preceding include directives

# rotate log files weekly
weekly

# use the adm group by default, since this is the owning group
# of /var/log/.
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may also be configured here.

The configuration settings if anything like the above, tell us that the rotation happens weekly, keeping 4 weeks worth of backlogs, etc.

To learn more about other configuration options consult the logrotate manual page.

Create the Lightning logrotate configuration file

Let's create a Logrotate configuration file for Fleek Network Lightning Service. Create the file by running the command:

sudo touch /etc/logrotate.d/lightning

Lightning Configuration Settings

Open the recently created file /etc/logrotate.d/lightning in your favorite text editor.

Add the following lines to the file:

/var/log/lightning/*.log {
rotate 5
daily
size 50M
notifempty
compress
}

Remember to save the file before exiting the text editor. You can test the configuration file by running the command:

sudo logrotate /etc/logrotate.conf --debug

The configuration file above declares that for the log files in the /var/log/lightning directory, the log files are rotated 5 times daily before being removed, as long they grow bigger than 50 megabytes in file size or empty. Old versions of log files are compressed with gzip.

tip

Bear in mind that this configuration file also inherit the default behavior, e.g. the create as set in the main configuration file /etc/logrotate.conf.

Feel free to customize the settings to your liking by checking the documentation in the logrotate manual page.

Cron job

note

Depending on the operating system, you have to set up a cron job to execute logrotate with the configuration file daily. Since we are using Ubuntu for our example, a daily cron job runner is already set up for us. If you are on a different Distro/OS make the required amends.

Verify that the /etc/cron.daily/logrotate exists and includes the execution of logrotate with the configuration argument /etc/logrotate.conf.

/usr/sbin/logrotate /etc/logrotate.conf
tip

If you have modified the location of the binary or main configuration file, make sure this is set correctly to your custom locations.

To summarize, the logrotate /etc/logrotate.conf is executed and as logrotate.conf goes through its list of commands, it calls include /etc/logrotate.d. It means that any scripts in /etc/logrotate.d are executed, such as the Lightning Configuration Settings.

Conclusion

The guide starts by warning us about the stream text messages that the Fleek Network emits by default. As the text data is aggregated and stored in the file system it can lead to fill up the limited available disk space quickly, causing issues to the operation of the system.

To help control it, the journald is introduced, by explaining its role as a centralized message system, that runs alongside the application logs. Then, have it configured to limit the maximum file size, amongst other system-wide settings.

Finally, logrotate is discussed in helping us manage the Fleek Network Lightning application log files by setting it to automatically compress, rename, remove logs for the system admin convenience and saving system's resources.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

How to manage log files

+ + +

Introduction

+

The Fleek Network node streams text messages to the standard output and error in Linux. Given that disk space is a limited resource for most systems, the number of text data can be a cause of concern. Managing the file sizes by means of rotation and compression can help.

+

A conventional Fleek Network Service setup (as per the documentation and tool recommendations), have the text data stored in a special directory for storing logs called /var/log. The /var/log directory contains logs from various applications running on the operating system, the operating system itself, and others.

+

For the purpose of storing network node operation logs, it defaults to the /var/log/lightning directory where the files output.log (stdout) and diagnostic.log (stderr) is located and accumulated. As the node runs, the size of the files increase, as it aggregates all the output generated by the Fleek Network service operations, such as info, errors, etc.

+

A Node Operator can configure the system to rotate, compress, and set maximum size of these files to safeguard any concerns or issues that can get out of control, such as causing disk space to become full quickly.

+

In this guide, we'll look into some options available to manage the logs. First, we'll look into journald.conf which controls where to store journal data (the journal is a component of systemd that handles all the messages in a Systemd enabled system). Afterwards, we'll look into Logrotate an application to help us manage automatic rotation and compression of log files.

+

In essence, the journal and the logs duplicate the same information, and we want to make sure that we set measures to control it.

+

Journal

+

Journal is a component of Systemd, a centralized location for all messages logged by different components in a systemd-enabled Linux system. The systemd journal will happily run in parallel with the standard type log files in /var/log/* where the Fleek Network Systemd Unit Service outputs Standard Output and Standard Error in the location /var/log/lightning/*.log.

+

Here, we are going to learn how to configure the journald.conf service configuration file for the system-wide settings (meaning that it applies to all services), but firstly we're going to learn some commands to help us troubleshoot when necessary.

+

Commands

+

Disk utilization checkup

+

To check how much disk space is used by Systemd log files, run the command below:

+
sudo journalctl --disk-usage
+

It provides information of how much disk space is utilized by the log files in your system.

+

Clearing logs manually

+

The best way to clear log files is done automatically by the journald.conf configuration file, discussed in Configuration file. In the ideal world, you shouldn't have to manually delete the log files, but this can be useful to know about when troubleshooting.

+

To flush the log files run the command below:

+
sudo journalctl --flush --rotate
sudo journalctl --vacuum-time=1s
+
tip

The flush and rotate flag is used, as vaccum-time only clears archived logs and not active ones. It'll flush:

    +
  • Move /run/log/journal to /var/log/journal
  • +
  • Rotate (this flag archives logs and retains it)
  • +

Since it'll only keep the past 1-second-long files, it'll effectively clear everything.

+

Follow or tail logs of service

+
sudo journalctl -u <SERVICE-NAME>.service -f
+

For example, for a conventional native install (if you haven't followed the conventions, make the appropriate tweaks to fit your needs).

+
sudo journalctl -u lightning.service -f
+

The Docker service

+
sudo journalctl -u docker-lightning.service -f
+

Show all service entries

+

Show all journal entries, which can be fairly long:

+
sudo journalctl
+

Configuration file

+

The default configuration file is located at /etc/systemd/journald.conf. This is the main file that journal reads the configuration from, for the system instances that are controlled by root.

+

In addition to the main configuration file there are a few other locations that take higher precedence and override the main configuration file. To learn more about journald read here.

+

To keep the guide short we are going to use the main location /etc/systemd/journald.conf.

+

Create the directory and config file

+

If the /etc/systemd/journald.conf file doesn't exist, create it by:

+

Create the journald.conf file:

+
sudo touch /etc/systemd/journald.conf
+

Configuration settings

+

The Systemd provides many options for you to manage the log files and by combining these parameters you can limit the disk space used by the journal files.

+

A list of the available options are here.

+

Here is a quick description of the options we're going to use for our example:

+
    +
  • Storage, controls where to store journal data
  • +
  • SystemMaxUse, specifies the maximum disk space that can be used by the journal in persistent storage
  • +
  • SystemMaxFileSize, controls how large individual journal files can grow to in persistent storage before being rotated
  • +
  • RuntimeMaxUse, control how much disk space the journal may use up at most
  • +
+

You should open the /etc/systemd/journald.conf file in your favorite text editor and put:

+
[Journal]
Storage=persistent
SystemMaxUse=1G
SystemMaxFileSize=100M
RuntimeMaxUse=100M
+

Here, we set 1G and 100M, which means 1 Gigabyte and 100 Megabytes. You can also use K for Kbytes, amongst others.

+

After the changes, you have to restart the journald after updating the file. To restart use the command:

+
sudo systemctl restart systemd-journald
+

You can verify the integrity of the log files by running:

+
sudo journalctl --verify
+

Logrotate

+

Logrotate is a tool to manage the log files created by a system processes. It can automatically compress, rename, remove logs and more for your convenience and save your system's resources. Log files can be handled timely, or when it grows too large.

+

Prerequesite

+

The logrotate tools is available by default on Ubuntu.

+
tip

We're using Ubuntu for our guide to keep it simple. If you are using a different and support operating system make sure you install Logrotate before proceeding.

+

You can check if logrotate is installed by executing:

+
logrotate --version
+

At the time this guide was written, we got the following output:

+
logrotate 3.21.0

Default mail command: /usr/bin/mail
Default compress command: /bin/gzip
Default uncompress command: /bin/gunzip
Default compress extension: .gz
Default state file path: /var/lib/logrotate/status
ACL support: yes
SELinux support: yes
+

If you run an earlier or older version, changes or tweaks might apply.

+

Explore the Configuration files

+

The configuration files we'll be exploring today are found in the following locations in Ubuntu:

+
    +
  • +

    /etc/logrotate.conf, is the main configuration settings file. It includes the statement to pull in configuration files from other directories, e.g. the /etc/logrotate.d

    +
  • +
  • +

    /etc/logrotate.d/, a directory where packages drop log rotation information

    +
  • +
+
tip

We use Ubuntu for our guide, if you are on a different distro, you have to determine the file configuration file locations

+

The content of the file /etc/logrotate.conf should be similar to:

+
# see "man logrotate" for details

# global options do not affect preceding include directives

# rotate log files weekly
weekly

# use the adm group by default, since this is the owning group
# of /var/log/.
su root adm

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may also be configured here.
+

The configuration settings if anything like the above, tell us that the rotation happens weekly, keeping 4 weeks worth of backlogs, etc.

+

To learn more about other configuration options consult the logrotate manual page.

+

Create the Lightning logrotate configuration file

+

Let's create a Logrotate configuration file for Fleek Network Lightning Service. Create the file by running the command:

+
sudo touch /etc/logrotate.d/lightning
+

Lightning Configuration Settings

+

Open the recently created file /etc/logrotate.d/lightning in your favorite text editor.

+

Add the following lines to the file:

+
/var/log/lightning/*.log {
rotate 5
daily
size 50M
notifempty
compress
}
+

Remember to save the file before exiting the text editor. You can test the configuration file by running the command:

+
sudo logrotate /etc/logrotate.conf --debug
+

The configuration file above declares that for the log files in the /var/log/lightning directory, the log files are rotated 5 times daily before being removed, as long they grow bigger than 50 megabytes in file size or empty. Old versions of log files are compressed with gzip.

+
tip

Bear in mind that this configuration file also inherit the default behavior, e.g. the create as set in the main configuration file /etc/logrotate.conf.

+

Feel free to customize the settings to your liking by checking the documentation in the logrotate manual page.

+

Cron job

+
note

Depending on the operating system, you have to set up a cron job to execute logrotate with the configuration file daily. Since we are using Ubuntu for our example, a daily cron job runner is already set up for us. If you are on a different Distro/OS make the required amends.

+

Verify that the /etc/cron.daily/logrotate exists and includes the execution of logrotate with the configuration argument /etc/logrotate.conf.

+
/usr/sbin/logrotate /etc/logrotate.conf
+
tip

If you have modified the location of the binary or main configuration file, make sure this is set correctly to your custom locations.

+

To summarize, the logrotate /etc/logrotate.conf is executed and as logrotate.conf goes through its list of commands, it calls include /etc/logrotate.d. It means that any scripts in /etc/logrotate.d are executed, such as the Lightning Configuration Settings.

+

Conclusion

+

The guide starts by warning us about the stream text messages that the Fleek Network emits by default. As the text data is aggregated and stored in the file system it can lead to fill up the limited available disk space quickly, causing issues to the operation of the system.

+

To help control it, the journald is introduced, by explaining its role as a centralized message system, that runs alongside the application logs. Then, have it configured to limit the maximum file size, amongst other system-wide settings.

+

Finally, logrotate is discussed in helping us manage the Fleek Network Lightning application log files by setting it to automatically compress, rename, remove logs for the system admin convenience and saving system's resources.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/guides/Node Operators/managing-the-keystore/index.html b/guides/Node Operators/managing-the-keystore/index.html index b3ee8fd8d..ba91caf63 100644 --- a/guides/Node Operators/managing-the-keystore/index.html +++ b/guides/Node Operators/managing-the-keystore/index.html @@ -1,9 +1,9 @@ - + - -Managing the keystore | Fleek Network Docs | Decentralized Edge Platform + +Managing the keystore | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,172 @@ - - - + + + - + -
-

Managing the keystore

Introduction

Fleek Network incentivizes participation by rewarding its node providers. A node is identifiable by an identity, which the reward mechanism uses to identify the node to reward it.

info

At time of writing the rewards mechanism hasn't yet been introduced, read the testnet plans to get a high level perspective over the plans. A token and economics paper should be released in the future.

We'll use the term identity to describe the key store declared in the configuration, in our case PEM files. The content of the PEM files and the file itself should be kept secret.

The key store is in the file system and the location is defined in the Fleek Network ~/.lightning/config.toml, as a private key stored in an identity named PEM file (by default consensus.pem and node.pem). It's essential to understand this, as you may want to copy the identity to a new server setup, to persist the identity accross to the new server setup.

caution

Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility.

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you're migrating to.

Pre-requisites

To follow the guide, you will need the following:

Configuration file

Locating the file

The Lightning CLI has a configuration file in the home directory of the user, which by default is located in the path $HOME/.lightning or ~/.lightning under the name config.toml. It's generally described as ~/.lightning/config.toml.

tip

The tilde in ~/.lightning represents $HOME which is simpler, but we'll use $HOME to make it easy to follow.

If you're following the install recommendations you should be logged in with a sudoer account. For our guide, let's imagine that the sudoer username we are logged in with is lgtn.

tip

The word sudo is the abbreviation of the term "super user do". As the name suggests, it is the privilege that a super user, such as an administrator has to do whatever it wants in the system. A super user can be an administrator, like the root or what we described here as a user in the group sudo aka sudoer.

If you are logged in with a username, that'd be:

/home/<USERNAME>/.lightning/config.toml

For our example for user lgtn that is:

/home/lgtn/.lightning/config.toml

If you log in with another user, let's say fleek it'd be:

/home/fleek/.lightning/config.toml

At any time, you can check which user you are logged in with by running the command:

whoami

Here's an example of our user lgtn, which for the command above outputs:

lgtn
tip

To switch to a particular user, you can run the command su <USERNAME> e.g. for the user lgtn we would execute the command su lgtn.

Now that you know where to locate the configuration file for any given user you are logged in with, learn about the Configuration sections.

Configuration sections

The Fleek Network node configuration settings are located in the path $HOME/.lightning/config.toml, and it's organized by configuration sections.

At the time of writing, we have a TOML file with sections. Here are some examples amongst others:

  • application
  • origin-ipfs
  • rpc
  • signer

Each of the sections holds several property names and values. If you are accustomed to the JSON or YAML formats, you'll find the TOML format a bit similar (if you'd like to learn more about the TOML file format, read about it here).

By default, and at time of writing the Lightning CLI configuration file (config.toml) is similar to:

[BLANK]

[application]
db_path = "/home/lgtn/.lightning/data/app_db"
mode = "Prod"
storage = "RocksDb"
testnet = true

[blockserver]
address = "0.0.0.0:4211"

[broadcast]
address = "0.0.0.0:4200"

[consensus]
store_path = "/home/lgtn/.lightning/data/narwhal_store"

[dht]
address = "0.0.0.0:8101"
bootstrappers = []

[fetcher]

[fsstore]
root = "/home/lgtn/.lightning/blockstore"

[[handshake.transport]]
signal_address = "0.0.0.0:4210"
type = "WebRTC"

[[handshake.worker]]
type = "AsyncWorker"

[[handshake.worker]]
type = "AsyncWorker"

[[handshake.worker]]
type = "AsyncWorker"

[[handshake.worker]]
type = "AsyncWorker"

[[origin-ipfs.gateways]]
authority = "ipfs.io"
protocol = "Https"

[[origin-ipfs.gateways]]
authority = "fleek.ipfs.io"
protocol = "Https"

[[origin-ipfs.gateways]]
authority = "ipfs.runfission.com"
protocol = "Https"

[rep-collector]
reporter_buffer_size = 5

[resolver]
store_path = "/home/lgtn/.lightning/data/resolver_store"

[rpc]
addr = "0.0.0.0"
port = 4230

[service-executor]
services = [0, 1]

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"

[topology]
testing_min_nodes = 9
testing_target_k = 8
tip

Beware that the configuration file might look a bit different depending on the version you're running and the current development features in place by the Fleek Network core team. You shouldn't copy the example above and replace with yours, as this only servers for illustrative purposes.

Some advanced use cases might require dealing with the host and port number binding, depending on the service provider's needs and customization. We'll keep things simple and assume the default settings.

In this guide, we are interested in the [signer] section settings for the consensus_key_path and node_key_path which by default is set to ~/.lightning/keystore.

tip

The identity is a text description for the Keystore and at the time of writing we have not yet implemented multiple identity management via the CLI. Thereupon, the identity value serves to find the filename match in the keystore_path. This might change as we progress with development. Check the Identity selection to learn more about it!

Type of keys

There are three types of keys related to the identity of a node and the account ownership. The keys are based in public-key cryptography, or asymmetric cryptography where each key pair consists of a public key and a corresponding private key. The keys are described in the section identity on the Fleek Network as follows:

  • A Node key (ConsensusPublicKey) is BLS12-381 which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates

  • A Node Networking key (NodePublicKey) is Ed25519 used for the speed and performance of the network communications

  • Account Owner keys are based on secp256k1, which corresponds to an Ethereum Address

For instance, a public key is open to anybody to see, and it represents a unique node identifier in the Fleek Network, a bit like a passport number. On the other hand, the private key is secret, and the operator is responsible to store it privately.

The Fleek Network relies on cryptography, thus the Fleek Network team and anybody can access, compromise or manipulate the secrets of an identity. On the other hand, the public key can be used by anyone, Fleek Network included, to identify a node or send rewards to the address without jeopardizing identity security.

To learn more about the identities on the Fleek Network here.

Key privacy

If you don’t keep your private keys secret, you'll have your node compromised.

Here are a few examples of what you should not do:

  • Share the $HOME/.lightning/keystore directory file content publicly
  • Track the $HOME/.lightning/keystore directory files in a version control repository e.g. git
  • Have poor "rights" permissions in UNIX systems e.g. everyone can read, delete, modify $HOME/.lightning
  • Allow anyone to access the node provider physically without any access control to the operating and file systems e.g. a VPS provider
  • Get rid of a hard drive unformatted or blind erased by selling to somebody or dumping in the bin, which contains $HOME/.lightning/keystore

There are many other ways of getting compromised, but hopefully, the ones put above give you a good starter into the subject.

Remember, the node provider is the only one responsible when managing the key store. Neither Fleek Network nor the most sophisticated AI system presently can compromise the cryptography in use to help you out. You are fully responsible for securing and retaining your private keys.

Identity selection

Multiple identity management is yet to be implemented but in any case, some users might find it trivial to keep multiple identities and switch between them referencing them by name. The following section is not advocating this approach but sharing some approaches that can help certain use-cases.

Let's suppose that we've recently moved to a new server setup and copied our previous server keystore keys as consensus.pem and node.pem and renamed the $HOME/.lightning/keystore/*.pem to $HOME/.lightning/keystore/new-*.pem.

tip

We are using a wildcard * to reduce verbosity. The wildcard means as replacement for all the filenames encountered in the path and extension without having to name them individually as we know they are consensus.pem and node.pem.

To illustrate this scenario, here's an example of how our $HOME/.lightning/keystore directory could look like:

.
├── new-consensus.pem
├── new-node.pem
└── old-consensus.pem
└── old-node.pem

0 directories, 4 file

The old-*.pem files are the original key store and new-*.pem could correspond to the new identity created while setting up the node in the new server.

Since we have [signer] set to the default values, in particular:

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"

We'd be required to change and switch to the preferred keys. The identity is switch to the provided values once the node is restarted. Thus, we can switch to any identity by changing the [signer] consensus_key_path and node_key_path pathname values anytime as long we restart the server successfully.

To verify which keys are loaded by the Lightning CLI run the command:

lgtn keys show

You'd find the public keys in the output, which can be used for comparision and should be different everytime the configuration changes and reloaded. Here's an example of the output:

Node Public Key: RwPpr35H5AAfWwSDFxwYuJv5TA8PWUd2pdBg+UKsORc=
Consensus Public Key: s36g09qQzaaOJxi0UZDRCXj3HUUWjaGiYrQV6Ylo9Ih6jMvrnxM5s1OpBnsEj5R1AVYcuxlnVR+oyEjgJ3WpI5LOHSN1Q6Zur33vka3IachBEIKIbsiXMJW16vu4n4bG
tip

The PEM files can be named as you wish, but by default we like to keep it sound to avoid confusion and make it as clear as possible.

Backing up the keystore

When dealing with Fleek Network it's crucial to always be aware of the identity. You should backup private keys in case the unexpected happens, as it's impossible to recover the identity in any other way, including the core team, any other person or system.

Backing up your keystore pem files are crucial to ensure the safety and accessibility of your identity on the Fleek Network. For example, if your $HOME/.lightning is deleted you'll still be able to restore it if you have backed it up properly.

There are many ways to make identity backups, each with its own benefits and drawbacks. At risk of oversimplifying, we'll focus on a simple manual approach to expose some principles you should have awareness.

caution

The security is never stronger than its weakest link, and it is very likely that the weakest link is not the method itself. It's pointless to encrypt the backup archive with sophisticated methods when the passphrase is weak or of an easy guess.

None of the methods described here are being endorsed by the Fleek Network team use the knowledge provided here for educational purposes only and at your own risk.

Lower security

If you opt for the lowest level of security, you can use zip and unzip. The man page of zip described the encryption algorithm used to be weaker than PGP.

To zip and encrypto the $HOME/.lightning/keystore directory run:

# It'll prompt for password (remember)
zip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore

To unzip and decrypt the keystore.zip.enc, you'd run:

# It'll prompt for password (recall)
unzip keystore.zip.enc -d $HOME/.lightning/keystore
tip

We provide the unzip destiny target to the flag -d. The unzip process outputs the files onto the desired location $HOME/.lightning/keystore, thus overriding any contents. If you have any files in the destiny target directory it'll be overriden, effectively replacing with the output of the unzipped directory content, so make sure you backup any files as required.

Higher security

Create a Tar archive, which will contain the target directory, files and the Tar stores all of the relative paths in the tarball itself.

Create a tarbar by executing:

tar -cf "keystore.tar" $HOME/.lightning/keystore

The keystore.tar should be in the current work directory.

Use gpg with the symmetric option, it creates the keys for that file and request a password to protect them. If you are familiar with asymmetric gpg, it's similar, but it's not signed with your public key or such.

The encryption command is:

sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar

The keystore.tar.asc should be in the current work directory.

To decrypt the keystore.tar.asc file, enter:

sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc

To extract the keystore.tar is simple, but be aware that it unarchives with the original directory structure, which might be a bit confusing. So, we'll create a new temporary directory for our example that will use to extract to.

mkdir $HOME/tar_keystore_extract

Now, run the command to extract to the target directory, as follows:

tar -xf keystore.tar -C $HOME/tar_keystore_extract

The /home/<username>/.lightning/keystore should be in the tar_keystore_extract directory where you'll find the PEM files.

Storage

The backup archive should only be accessible by yourself. If you decided to store it in a cloud storage provider, be aware of increased security risks. Cloud storage is convenient, but it ultimately puts data into the hands of others. If you're not particularly concerned, or have confidence about the encryption of the files, then that's at your own risk. But it's recommended to store in a physical hard drive that remains disconnected from computers and network devices.

caution

If you use cloud storage to store your sensitive data, encryption should be your first line of defense. Encrypting files before uploading them to the cloud is crucial to reduce others from accessing information without your permissions and knowledge.

Remember that the security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Loading keys on runtime

As described in the section configuration files the default location of the .lightning system configuration directory is $HOME/.lightning.

The $HOME/.lightning/config.toml holds the information of where the Lightning CLI node process should pull the keystore pem files. The location of the pem files can be placed anywhere the node process has permissions to read.

When unarchiving the backup files, the keystore directory or pem files should be placed in the directory declared in the $HOME/.lightning/config.toml. That is if the location is the one specified on the runtime–the command declared to launch and run the lightning service, that has the optional -c configuration flag that takes any custom location which overrides the default $HOME/.lightning/config.toml.

caution

On runtime, the Lightning service can have specified a configuration file in any readable location. If a configuration pathname isn't passed, it'll default to the $HOME/.lightning/config.toml. It's important to understand this to avoid confusion.

The service that starts with:

lgtn -c /root/custom-configuration.toml run

Can have complete different settings from any of the following:

lgtn -c /home/lgtn/.lightning/config.toml run
lgtn -c ~/.lightning/config.toml run
lgtn run

Due to the fact that any of the fails above might contain different settings declared in the file body.

For instance, we can imagine a scenario where our service is started with the command:

lgtn -c /home/lgtn/.lightning/config.toml run

Where the keystore is placed under the parent directory /home/lgtn/.lightning/. Resulting in the configuration file have the following settings for the hypothetical username lgtn:

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"
tip

On the install instructions provided by the documentation, a Systemd service unit is recommended to allow the user control the Lightning service via systemctl. The Systemd service unit file should contain the recommended usage of -c configuration. If you have followed the recommendations it should be familiar.

Restoring the keystore

You can restore the keystore (Public Keys) by copying the directory to the ~/.lightning directory.

Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:

1) The keystore and files are located under the hypothetical location /my-keystore-backup

2) The files in the /my-keystore-backup are the following:

/my-keystore-backup
├── consensus.pem
└── node.pem

1 directory, 2 files

Considering the above for our example, you would have to run the following command:

mv /my-keystore-backup /home/<YOUR-USERNAME>/.lightning/keystore
tip

Remember to replace the <YOUR-USERNAME> with the correct username for the setup. For example, if you have installed the Fleek Network with the username lgtn that would be /home/lgtn/.lightning/keystore.

Once moved, remember to start the service, you can learn how to manage the service by reading the section Systemd Service.

Conclusion

We've walked through most basics of where the configuration file is located, the configuration settings we use to set up and run the node, the different configuration sections we have, and most importantly the identity section.

Additionally, a brief guide on the identity, more specifically an introduction to the type of keys and key privacy, which we find important to understand for anyone seriously interested in running a node by hinting into some system administration and security principles.

Separately, at risk of oversimpliying provided a brief introduction into the backup of the keystore directory.

In the future, we'll introduce more advanced topics that will help you improve the knowledge you get from this, but we are glad that you followed this guide and got some comprehension to help you manage the key store.

While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our Discord or by opening a PR in any of our repositories.

Discover more about the project by watching/contributing on Github, following us on Twitter, and joining our community Discord for all the best updates!

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Managing the keystore

+ + +

Introduction

+

Fleek Network incentivizes participation by rewarding its node providers. A node is identifiable by an identity, which the reward mechanism uses to identify the node to reward it.

+
info

At time of writing the rewards mechanism hasn't yet been introduced, read the testnet plans to get a high level perspective over the plans. A token and economics paper should be released in the future.

+

We'll use the term identity to describe the key store declared in the configuration, in our case PEM files. The content of the PEM files and the file itself should be kept secret.

+

The key store is in the file system and the location is defined in the Fleek Network ~/.lightning/config.toml, as a private key stored in an identity named PEM file (by default consensus.pem and node.pem). It's essential to understand this, as you may want to copy the identity to a new server setup, to persist the identity accross to the new server setup.

+
caution

Security is achieved by issuing users private cryptographic keys. Only the holder of the private key has access to sensitive information, such as an identity, which relates to reputation, rewards, etc. The security of the private key is the responsibility of the user. Unfortunately, Fleek Network is unable to help you regain access to your private key if you've lost or failed to secure it. The private keys are your responsibility.

+

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you're migrating to.

+

Pre-requisites

+

To follow the guide, you will need the following:

+ +

Configuration file

+

Locating the file

+

The Lightning CLI has a configuration file in the home directory of the user, which by default is located in the path $HOME/.lightning or ~/.lightning under the name config.toml. It's generally described as ~/.lightning/config.toml.

+
tip

The tilde in ~/.lightning represents $HOME which is simpler, but we'll use $HOME to make it easy to follow.

+

If you're following the install recommendations you should be logged in with a sudoer account. For our guide, let's imagine that the sudoer username we are logged in with is lgtn.

+
tip

The word sudo is the abbreviation of the term "super user do". As the name suggests, it is the privilege that a super user, such as an administrator has to do whatever it wants in the system. A super user can be an administrator, like the root or what we described here as a user in the group sudo aka sudoer.

+

If you are logged in with a username, that'd be:

+
/home/<USERNAME>/.lightning/config.toml
+

For our example for user lgtn that is:

+
/home/lgtn/.lightning/config.toml
+

If you log in with another user, let's say fleek it'd be:

+
/home/fleek/.lightning/config.toml
+

At any time, you can check which user you are logged in with by running the command:

+
whoami
+

Here's an example of our user lgtn, which for the command above outputs:

+
lgtn
+
tip

To switch to a particular user, you can run the command su <USERNAME> e.g. for the user lgtn we would execute the command su lgtn.

+

Now that you know where to locate the configuration file for any given user you are logged in with, learn about the Configuration sections.

+

Configuration sections

+

The Fleek Network node configuration settings are located in the path $HOME/.lightning/config.toml, and it's organized by configuration sections.

+

At the time of writing, we have a TOML file with sections. Here are some examples amongst others:

+
    +
  • application
  • +
  • origin-ipfs
  • +
  • rpc
  • +
  • signer
  • +
+

Each of the sections holds several property names and values. If you are accustomed to the JSON or YAML formats, you'll find the TOML format a bit similar (if you'd like to learn more about the TOML file format, read about it here).

+

By default, and at time of writing the Lightning CLI configuration file (config.toml) is similar to:

+
[BLANK]

[application]
db_path = "/home/lgtn/.lightning/data/app_db"
mode = "Prod"
storage = "RocksDb"
testnet = true

[blockserver]
address = "0.0.0.0:4211"

[broadcast]
address = "0.0.0.0:4200"

[consensus]
store_path = "/home/lgtn/.lightning/data/narwhal_store"

[dht]
address = "0.0.0.0:8101"
bootstrappers = []

[fetcher]

[fsstore]
root = "/home/lgtn/.lightning/blockstore"

[[handshake.transport]]
signal_address = "0.0.0.0:4210"
type = "WebRTC"

[[handshake.worker]]
type = "AsyncWorker"

[[handshake.worker]]
type = "AsyncWorker"

[[handshake.worker]]
type = "AsyncWorker"

[[handshake.worker]]
type = "AsyncWorker"

[[origin-ipfs.gateways]]
authority = "ipfs.io"
protocol = "Https"

[[origin-ipfs.gateways]]
authority = "fleek.ipfs.io"
protocol = "Https"

[[origin-ipfs.gateways]]
authority = "ipfs.runfission.com"
protocol = "Https"

[rep-collector]
reporter_buffer_size = 5

[resolver]
store_path = "/home/lgtn/.lightning/data/resolver_store"

[rpc]
addr = "0.0.0.0"
port = 4230

[service-executor]
services = [0, 1]

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"

[topology]
testing_min_nodes = 9
testing_target_k = 8
+
tip

Beware that the configuration file might look a bit different depending on the version you're running and the current development features in place by the Fleek Network core team. You shouldn't copy the example above and replace with yours, as this only servers for illustrative purposes.

+

Some advanced use cases might require dealing with the host and port number binding, depending on the service provider's needs and customization. We'll keep things simple and assume the default settings.

+

In this guide, we are interested in the [signer] section settings for the consensus_key_path and node_key_path which by default is set to ~/.lightning/keystore.

+
tip

The identity is a text description for the Keystore and at the time of writing we have not yet implemented multiple identity management via the CLI. Thereupon, the identity value serves to find the filename match in the keystore_path. This might change as we progress with development. Check the Identity selection to learn more about it!

+

Type of keys

+

There are three types of keys related to the identity of a node and the account ownership. The keys are based in public-key cryptography, or asymmetric cryptography where each key pair consists of a public key and a corresponding private key. The keys are described in the section identity on the Fleek Network as follows:

+
    +
  • +

    A Node key (ConsensusPublicKey) is BLS12-381 which facilitates the consensus algorithm or persistence of state, resilience and fault tolerance. Has multi-signature support, the ability to aggregate many signatures into one used for consensus committee when signing certificates

    +
  • +
  • +

    A Node Networking key (NodePublicKey) is Ed25519 used for the speed and performance of the network communications

    +
  • +
  • +

    Account Owner keys are based on secp256k1, which corresponds to an Ethereum Address

    +
  • +
+

For instance, a public key is open to anybody to see, and it represents a unique node identifier in the Fleek Network, a bit like a passport number. On the other hand, the private key is secret, and the operator is responsible to store it privately.

+

The Fleek Network relies on cryptography, thus the Fleek Network team and anybody can access, compromise or manipulate the secrets of an identity. On the other hand, the public key can be used by anyone, Fleek Network included, to identify a node or send rewards to the address without jeopardizing identity security.

+

To learn more about the identities on the Fleek Network here.

+

Key privacy

+

If you don’t keep your private keys secret, you'll have your node compromised.

+

Here are a few examples of what you should not do:

+
    +
  • Share the $HOME/.lightning/keystore directory file content publicly
  • +
  • Track the $HOME/.lightning/keystore directory files in a version control repository e.g. git
  • +
  • Have poor "rights" permissions in UNIX systems e.g. everyone can read, delete, modify $HOME/.lightning
  • +
  • Allow anyone to access the node provider physically without any access control to the operating and file systems e.g. a VPS provider
  • +
  • Get rid of a hard drive unformatted or blind erased by selling to somebody or dumping in the bin, which contains $HOME/.lightning/keystore
  • +
+

There are many other ways of getting compromised, but hopefully, the ones put above give you a good starter into the subject.

+

Remember, the node provider is the only one responsible when managing the key store. Neither Fleek Network nor the most sophisticated AI system presently can compromise the cryptography in use to help you out. You are fully responsible for securing and retaining your private keys.

+

Identity selection

+

Multiple identity management is yet to be implemented but in any case, some users might find it trivial to keep multiple identities and switch between them referencing them by name. The following section is not advocating this approach but sharing some approaches that can help certain use-cases.

+

Let's suppose that we've recently moved to a new server setup and copied our previous server keystore keys as consensus.pem and node.pem and renamed the $HOME/.lightning/keystore/*.pem to $HOME/.lightning/keystore/new-*.pem.

+
tip

We are using a wildcard * to reduce verbosity. The wildcard means as replacement for all the filenames encountered in the path and extension without having to name them individually as we know they are consensus.pem and node.pem.

+

To illustrate this scenario, here's an example of how our $HOME/.lightning/keystore directory could look like:

+
.
├── new-consensus.pem
├── new-node.pem
└── old-consensus.pem
└── old-node.pem

0 directories, 4 file
+

The old-*.pem files are the original key store and new-*.pem could correspond to the new identity created while setting up the node in the new server.

+

Since we have [signer] set to the default values, in particular:

+
[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"
+

We'd be required to change and switch to the preferred keys. The identity is switch to the provided values once the node is restarted. Thus, we can switch to any identity by changing the [signer] consensus_key_path and node_key_path pathname values anytime as long we restart the server successfully.

+

To verify which keys are loaded by the Lightning CLI run the command:

+
lgtn keys show
+

You'd find the public keys in the output, which can be used for comparision and should be different everytime the configuration changes and reloaded. Here's an example of the output:

+
Node Public Key: RwPpr35H5AAfWwSDFxwYuJv5TA8PWUd2pdBg+UKsORc=
Consensus Public Key: s36g09qQzaaOJxi0UZDRCXj3HUUWjaGiYrQV6Ylo9Ih6jMvrnxM5s1OpBnsEj5R1AVYcuxlnVR+oyEjgJ3WpI5LOHSN1Q6Zur33vka3IachBEIKIbsiXMJW16vu4n4bG
+
tip

The PEM files can be named as you wish, but by default we like to keep it sound to avoid confusion and make it as clear as possible.

+

Backing up the keystore

+

When dealing with Fleek Network it's crucial to always be aware of the identity. You should backup private keys in case the unexpected happens, as it's impossible to recover the identity in any other way, including the core team, any other person or system.

+

Backing up your keystore pem files are crucial to ensure the safety and accessibility of your identity on the Fleek Network. For example, if your $HOME/.lightning is deleted you'll still be able to restore it if you have backed it up properly.

+

There are many ways to make identity backups, each with its own benefits and drawbacks. At risk of oversimplifying, we'll focus on a simple manual approach to expose some principles you should have awareness.

+
caution

The security is never stronger than its weakest link, and it is very likely that the weakest link is not the method itself. It's pointless to encrypt the backup archive with sophisticated methods when the passphrase is weak or of an easy guess.

+

None of the methods described here are being endorsed by the Fleek Network team use the knowledge provided here for educational purposes only and at your own risk.

+

Lower security

+

If you opt for the lowest level of security, you can use zip and unzip. The man page of zip described the encryption algorithm used to be weaker than PGP.

+

To zip and encrypto the $HOME/.lightning/keystore directory run:

+
# It'll prompt for password (remember)
zip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore
+

To unzip and decrypt the keystore.zip.enc, you'd run:

+
# It'll prompt for password (recall)
unzip keystore.zip.enc -d $HOME/.lightning/keystore
+
tip

We provide the unzip destiny target to the flag -d. The unzip process outputs the files onto the desired location $HOME/.lightning/keystore, thus overriding any contents. If you have any files in the destiny target directory it'll be overriden, effectively replacing with the output of the unzipped directory content, so make sure you backup any files as required.

+

Higher security

+

Create a Tar archive, which will contain the target directory, files and the Tar stores all of the relative paths in the tarball itself.

+

Create a tarbar by executing:

+
tar -cf "keystore.tar" $HOME/.lightning/keystore
+

The keystore.tar should be in the current work directory.

+

Use gpg with the symmetric option, it creates the keys for that file and request a password to protect them. If you are familiar with asymmetric gpg, it's similar, but it's not signed with your public key or such.

+

The encryption command is:

+
sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar
+

The keystore.tar.asc should be in the current work directory.

+

To decrypt the keystore.tar.asc file, enter:

+
sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc
+

To extract the keystore.tar is simple, but be aware that it unarchives with the original directory structure, which might be a bit confusing. So, we'll create a new temporary directory for our example that will use to extract to.

+
mkdir $HOME/tar_keystore_extract
+

Now, run the command to extract to the target directory, as follows:

+
tar -xf keystore.tar -C $HOME/tar_keystore_extract
+

The /home/<username>/.lightning/keystore should be in the tar_keystore_extract directory where you'll find the PEM files.

+

Storage

+

The backup archive should only be accessible by yourself. If you decided to store it in a cloud storage provider, be aware of increased security risks. Cloud storage is convenient, but it ultimately puts data into the hands of others. If you're not particularly concerned, or have confidence about the encryption of the files, then that's at your own risk. But it's recommended to store in a physical hard drive that remains disconnected from computers and network devices.

+
caution

If you use cloud storage to store your sensitive data, encryption should be your first line of defense. Encrypting files before uploading them to the cloud is crucial to reduce others from accessing information without your permissions and knowledge.

+

Remember that the security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

+

Loading keys on runtime

+

As described in the section configuration files the default location of the .lightning system configuration directory is $HOME/.lightning.

+

The $HOME/.lightning/config.toml holds the information of where the Lightning CLI node process should pull the keystore pem files. The location of the pem files can be placed anywhere the node process has permissions to read.

+

When unarchiving the backup files, the keystore directory or pem files should be placed in the directory declared in the $HOME/.lightning/config.toml. That is if the location is the one specified on the runtime–the command declared to launch and run the lightning service, that has the optional -c configuration flag that takes any custom location which overrides the default $HOME/.lightning/config.toml.

+
caution

On runtime, the Lightning service can have specified a configuration file in any readable location. If a configuration pathname isn't passed, it'll default to the $HOME/.lightning/config.toml. It's important to understand this to avoid confusion.

The service that starts with:

lgtn -c /root/custom-configuration.toml run

Can have complete different settings from any of the following:

lgtn -c /home/lgtn/.lightning/config.toml run
lgtn -c ~/.lightning/config.toml run
lgtn run

Due to the fact that any of the fails above might contain different settings declared in the file body.

+

For instance, we can imagine a scenario where our service is started with the command:

+
lgtn -c /home/lgtn/.lightning/config.toml run
+

Where the keystore is placed under the parent directory /home/lgtn/.lightning/. Resulting in the configuration file have the following settings for the hypothetical username lgtn:

+
[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"
+
tip

On the install instructions provided by the documentation, a Systemd service unit is recommended to allow the user control the Lightning service via systemctl. The Systemd service unit file should contain the recommended usage of -c configuration. If you have followed the recommendations it should be familiar.

+

Restoring the keystore

+

You can restore the keystore (Public Keys) by copying the directory to the ~/.lightning directory.

+

Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:

+
    +
  1. +

    The keystore and files are located under the hypothetical location /my-keystore-backup

    +
  2. +
  3. +

    The files in the /my-keystore-backup are the following:

    +
  4. +
+
/my-keystore-backup
├── consensus.pem
└── node.pem

1 directory, 2 files
+

Considering the above for our example, you would have to run the following command:

+
mv /my-keystore-backup /home/<YOUR-USERNAME>/.lightning/keystore
+
tip

Remember to replace the <YOUR-USERNAME> with the correct username for the setup. For example, if you have installed the Fleek Network with the username lgtn that would be /home/lgtn/.lightning/keystore.

+

Once moved, remember to start the service, you can learn how to manage the service by reading the section Systemd Service.

+

Conclusion

+

We've walked through most basics of where the configuration file is located, the configuration settings we use to set up and run the node, the different configuration sections we have, and most importantly the identity section.

+

Additionally, a brief guide on the identity, more specifically an introduction to the type of keys and key privacy, which we find important to understand for anyone seriously interested in running a node by hinting into some system administration and security principles.

+

Separately, at risk of oversimpliying provided a brief introduction into the backup of the keystore directory.

+

In the future, we'll introduce more advanced topics that will help you improve the knowledge you get from this, but we are glad that you followed this guide and got some comprehension to help you manage the key store.

+

While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our Discord or by opening a PR in any of our repositories.

+

Discover more about the project by watching/contributing on Github, following us on Twitter, and joining our community Discord for all the best updates!

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/guides/Node Operators/running-a-node-in-docker/index.html b/guides/Node Operators/running-a-node-in-docker/index.html index e64f52937..5feecfabc 100644 --- a/guides/Node Operators/running-a-node-in-docker/index.html +++ b/guides/Node Operators/running-a-node-in-docker/index.html @@ -1,9 +1,9 @@ - + - -Running a node in Docker | Fleek Network Docs | Decentralized Edge Platform + +Running a node in Docker | Fleek Network Docs | Decentralized Edge Platform @@ -12,18 +12,152 @@ - - - + + + - + -
-

Running a node in Docker

Introduction

Our Docker image provides all the requirements to have Fleek Network running quickly and the following guide will provide you a quick reference to get you started with Docker.

Alternatively, if you need a deep dive into Docker, check the official getting started here.

TL;DR If you have Docker experience then you'll find our for the impatient sufficient to get started.

Pre-requisites

To follow the guide, you will need the following:

  • Familiarity with the command-line interface
  • Git

For the impatient

Building a Docker image requires some effort and some of our users might find it easier to pull our latest image for quick access to Lightning CLI, which doesn't require them to build from source.

tip

The Docker Container image for Lightning is located at https://github.com/fleek-network/lightning/pkgs/container/lightning.

Pull and run image

You can pull and run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:

sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it ghcr.io/fleek-network/lightning:latest
note

Keys have to be generated when launching the service. On Docker run, if the keystore is not found, the keys are automatically generated and stored in the Docker host's $HOME/.lightning/keystore directory. To learn more about how to manage the keystore, visit the managing keystore section.

warning

The Docker image is tied to a CPU architecture, make sure that you have verified the required specifications to run the container successfully.

tip

The command has a list of ports -p values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ports to find the latest updates.

Setup

Requirements

To follow the guide successfully, a good amount of memory and disk space is necessary to run Docker. The main reason for our use-case is that your host machine requires a generous amount of memory and disk space, for the containers.

For this guide, we used a server with the 4vCPU, 32 GB ram memory and 20 GB disk space specifications. Learn more about the recommended specifications here.

Create a user

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

You can create a new user and add to the sudo group by running:

tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

sudo adduser lgtn

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

sudo usermod -aG sudo lgtn

Switch to the new user by using the command:

su lgtn

Change the directory to the new user's home, as follows:

cd /home/lgtn

Lightning CLI source code

Start by cloning the repository located at https://github.com/fleek-network/lightning.

tip

You have several ways of doing this:

  • Clone via HTTPS
  • Clone via SSH
  • Download via Github CLI
  • Download the zip package from the repository

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. -Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. -Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning

Change directory to Lightning source code

If you have cloned the project correctly, you should change directory to the project source code directory which by default is ~/fleek-network/lightning.

cd ~/fleek-network/lightning

At time of writing, this is how the project root looks like (e.g. use the ls to see the list):

.
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.lock
├── Cargo.toml
├── Dockerfile
├── LICENSE
├── README.md
├── codecov.yml
├── core
├── docs
├── etc
├── lib
├── rust-toolchain
├── rustfmt.toml
├── services
└── target

Install Docker

tip

To keep our guide short, we're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems here.

First, update the existing list of packages:

sudo apt update

Next, install the required packages to let apt use packages over HTTPS:

sudo apt install apt-transport-https ca-certificates software-properties-common

Add the GPG key for the official Docker repository to your system:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"

Set to install from the Docker repo instead of the default Ubuntu repo:

apt-cache policy docker-ce
docker-ce:
Installed: (none)
Candidate: 5:24.0.6-1~ubuntu.22.04~jammy
Version table:
5:24.0.6-1~ubuntu.22.04~jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
5:24.0.6-1~ubuntu.22.04~jammy 500

Finally, install Docker:

sudo apt install docker-ce

Once complete you should be able to run it via the CLI, as such:

docker -v

Here's the output (versions might differ a bit from the time of writing):

Docker version 24.0.6, build ed223bc

The following command's output will indicate if Docker's working correctly:

sudo docker run hello-world

Here's an example of the output you'll find us "Hello from Docker!":

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

Run all the commands above in your terminal, to confirm everything's working before proceeding to the next steps.

Create the Docker image

A Docker image is a read-only template with instructions for creating a Docker container, like a template. Docker images also act as a starting point when using Docker.

The starting point for our use-case is a Dockerfile, where all those "template instructions" are declared.

A Dockerfile should exist in the repository source code, so make sure you have change directory to the lightning source code to find it.

Build the Docker image

Build the image named as lightning from our Dockerfile:

sudo docker build -t lightning -f ./Dockerfile .

The build process takes awhile, and you have to wait for completion.

The output should be similar to:

[+] Building 1.2s (16/16) FINISHED                                                                                                     docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 990B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/debian:bullseye-slim 0.6s
=> [internal] load metadata for docker.io/library/rust:latest 0.9s
=> [stage-1 1/3] FROM docker.io/library/debian:bullseye-slim@sha256:3bc5e94a0e8329c102203c3f5f26fd67835f0c81633dd6949de0557867a87fac 0.0s
=> [builder 1/7] FROM docker.io/library/rust:latest@sha256:8a4ca3ca75afbc97bcf5362e9a694fe049d15734fbbaf82b8b7e224616c1254b 0.0s
=> [internal] load build context 0.3s
=> => transferring context: 948.93kB 0.3s
=> CACHED [stage-1 2/3] RUN DEBIAN_FRONTEND=noninteractive apt-get update -yq && DEBIAN_FRONTEND=noninteractive apt-get install -yq libs 0.0s
=> CACHED [builder 2/7] WORKDIR /lightning 0.0s
=> CACHED [builder 3/7] RUN apt-get update 0.0s
=> CACHED [builder 4/7] RUN apt-get install -y build-essential cmake clang pkg-config libssl-dev gcc protobuf-comp 0.0s
=> CACHED [builder 5/7] RUN --mount=type=cache,target=/usr/local/cargo/registry cargo install cargo-strip 0.0s
=> CACHED [builder 6/7] COPY . . 0.0s
=> CACHED [builder 7/7] RUN --mount=type=cache,target=/usr/local/cargo/registry --mount=type=cache,target=/lightning/target cargo buil 0.0s
=> CACHED [stage-1 3/3] COPY --from=builder /lightning/target/release/lightning-node /usr/local/bin/lgtn 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:e8e5ed19f59c3cc6a9add5bdb578c464904e9789d5f386cc4af81044c062d998 0.0s
=> => naming to docker.io/library/lightning
tip

The Docker image is only required to be built once and/or, when changes are pulled from the remote repository, or specific versions you might be interested in. Otherwise, you're not required to build it every time to run the node. If you'd like to learn how to update the Lightning CLI, find our references here.

caution

If you don't update your source code and binary build often, you won't have the latest changes, which should happen frequently to take advantage of all the ongoing development. This is quite important to understand, as it causes confusion to some users. The Lightning application at time of writing does not update automatically.

Docker Container

A container is what's originated from the image we discussed in the section build the docker image, it is a run-able instance of an image. We can create, start, stop, move, or delete a container using the Docker API or CLI.

Following up, we'll learn how to run the Docker container that includes our Lightning CLI program, built from our Dockerfile.

Once the Docker image is ready, run the container based on the image lightning. Effectively running the Fleek Network Lightning node process:

sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it ghcr.io/fleek-network/lightning:latest
tip

Notice that the command arguments we pass are for the flag's -p port numbers, -v to bind mount a location in your host to a container path (useful to persist your configuration files, e.g. keystore), --name to make it easier to identify, -it to make it interactive (e.g. presents output to the terminal), and the image name we built earlier.

The output would look as the following, showing the error message "Node is not whitelisted" (this error message is due to the testnet phase that requires nodes to be whitelisted to run successfully):

thread 'main' panicked at 'Node is not whitelisted. Please join the Fleek Discord to get invited.', core/cli/src/testnet_sync.rs:45:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
/root/init: line 7: 7 Aborted (core dumped) lgtn run

Keys have to be generated when launching the service. On Docker run, if the keystore is not found, the keys are automatically generated and stored in the Docker host's $HOME/.lightning/keystore directory.

tip

Have in mind that the $HOME/.lightning/config.toml is where the keystore location paths are configured, which default value is in the user $HOME path. The users who customize or modify the default location, need to apply the required customizations. To learn more about how to manage the keystore, visit the managing keystore section.

Generate keys

Execute the keys generate command on the container lightning-node:

sudo docker exec -it lightning-node lgtn keys generate

We've bound the host path ~/.lightning into the container /home/lgtn/.lightning.

You can list the contents of the ~/.lightning, where you should find the config.toml and keystore:

.
..
config.toml
keystore

You only have to run the keys generate once from your host.

Finally, you can start the Fleek Network node by running the command:

sudo docker start lightning-node
tip

The lightning-node is the name we provided on first run as described in docker container section. If you have set a different name, change accordingly.

Run the Docker Container as Systemd Service

In this section we’ll cover how to wrap a Docker Container as a Systemd Service without the need for third party tools or complex commands. Some reasons include, minimizing the dependency on the Docker Daemon as we can move to an OCI complaint solution other that Docker at anytime, or the fact we recommend Systemd Service Units and Systemctl to control the Service in our Native install that most users are familiar. Our goal is to provide guidance to the widest audience possible, if you have other preferences on managing your service that is more fitting to your needs that's fine.

tip

Docker recommends using their cross-platform built-in restart policy for running a Container as a Service. For that, configure your Docker service to start on system boot.

Systemd was specifically developed to serve the purpose of stopping services, dependency checking and recovery of failed services. You can have your host start, stop, enable, check the status, and generally manage a container as a Systemd Service.

Create the Systemd Service Unit

We are going to create the unit configuration file in the /etc/systemd/system/ directory. The Service Unit is going to be named as docker-lightning.service. To create the file run the following command:

sudo touch /etc/systemd/system/docker-lightning.service

Open the file in your favorite text editor and populate with the content found here:

[Unit]
Description=Fleek Network Node lightning service
After=docker.service
Requires=docker.service

[Service]
Restart=always
RestartSec=5
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill lightning-node
ExecStartPre=-/usr/bin/docker rm lightning-node
ExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest
ExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest
ExecStop=/usr/bin/docker stop lightning-node
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log

[Install]
WantedBy=multi-user.target

Once the file is saved, change the file permissions by running the command:

sudo chmod 644 /etc/systemd/system/docker-lightning.service

Next, reload the Systemctl Daemon:

sudo systemctl daemon-reload

Enable the service on startup when the system boots:

sudo systemctl enable docker-lightning.service

As a result, we are now able to run our containers as a Systemd service. For this, read the document manage systemd service to find more about how to control the service.

Viewing logs

To view the logs of a Docker container in real time, use the following command:

sudo docker logs -f lightning-node

If you have wrapped the docker container as a systemd service, you can use the same commands found when installed natively, such as:

For standard output:

tail -f /var/log/lightning/output.log

Or, the standard error:

tail -f /var/log/lightning/diagnostic.log

Learn more about how to analyze log messages.

Conclusion

Containers are a way to have a self-contained environment that includes all necessary dependencies, libraries, software, amongst others required to run an application.

Fleek Network's Lightning is developed with Rust, a general-purpose programming language, that requires several dependencies and libraries to compile the project. Some of these libraries are not installed by default and require some troubleshooting for the end user. Docker provides us with containers, self-containing all the required libraries for the purpose of running Lightning, our application.

We guided you through the initial installation steps, and how to build a Docker image, which then's used to Docker run a container. Plus, provided lower-level commands, to help you understand other present or advanced use-cases, and also at higher level, offerring simple utility methods.

While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our Discord or by opening a PR in any of our repositories.

Discover more about the project by watching/contributing on Github, following us on Twitter, and joining our community Discord for all the best updates!

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Running a node in Docker

+ + +

Introduction

+

Our Docker image provides all the requirements to have Fleek Network running quickly and the following guide will provide you a quick reference to get you started with Docker.

+

Alternatively, if you need a deep dive into Docker, check the official getting started here.

+

TL;DR If you have Docker experience then you'll find our for the impatient sufficient to get started.

+

Pre-requisites

+

To follow the guide, you will need the following:

+
    +
  • Familiarity with the command-line interface
  • +
  • Git
  • +
+

For the impatient

+

Building a Docker image requires some effort and some of our users might find it easier to pull our latest image for quick access to Lightning CLI, which doesn't require them to build from source.

+
tip

The Docker Container image for Lightning is located at https://github.com/fleek-network/lightning/pkgs/container/lightning.

+

Pull and run image

+

You can pull and run the Lightning pre-built Docker image from our GitHub and run the Docker container quickly by executing the following command:

+
sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it ghcr.io/fleek-network/lightning:latest
+
note

Keys have to be generated when launching the service. On Docker run, if the keystore is not found, the keys are automatically generated and stored in the Docker host's $HOME/.lightning/keystore directory. To learn more about how to manage the keystore, visit the managing keystore section.

+
warning

The Docker image is tied to a CPU architecture, make sure that you have verified the required specifications to run the container successfully.

+
tip

The command has a list of ports -p values that map ports in the container on the Docker host. While we try to keep the information across our documentation in sync with the latest changes or requirements e.g. port number changes, make sure that you check the section ports to find the latest updates.

+

Setup

+

Requirements

+

To follow the guide successfully, a good amount of memory and disk space is necessary to run Docker. The main reason for our use-case is that your host machine requires a generous amount of memory and disk space, for the containers.

+

For this guide, we used a server with the 4vCPU, 32 GB ram memory and 20 GB disk space specifications. Learn more about the recommended specifications here.

+

Create a user

+

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

+

You can create a new user and add to the sudo group by running:

+
tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

+
sudo adduser lgtn
+

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

+
sudo usermod -aG sudo lgtn
+

Switch to the new user by using the command:

+
su lgtn
+

Change the directory to the new user's home, as follows:

+
cd /home/lgtn
+

Lightning CLI source code

+

Start by cloning the repository located at https://github.com/fleek-network/lightning.

+
tip

You have several ways of doing this:

    +
  • Clone via HTTPS
  • +
  • Clone via SSH
  • +
  • Download via Github CLI
  • +
  • Download the zip package from the repository
  • +

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. +Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. +Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning
+

Change directory to Lightning source code

+

If you have cloned the project correctly, you should change directory to the project source code directory which by default is ~/fleek-network/lightning.

+
cd ~/fleek-network/lightning
+

At time of writing, this is how the project root looks like (e.g. use the ls to see the list):

+
.
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cargo.lock
├── Cargo.toml
├── Dockerfile
├── LICENSE
├── README.md
├── codecov.yml
├── core
├── docs
├── etc
├── lib
├── rust-toolchain
├── rustfmt.toml
├── services
└── target
+

Install Docker

+
tip

To keep our guide short, we're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems here.

+

First, update the existing list of packages:

+
sudo apt update
+

Next, install the required packages to let apt use packages over HTTPS:

+
sudo apt install apt-transport-https ca-certificates software-properties-common
+

Add the GPG key for the official Docker repository to your system:

+
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+

Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:

+
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"
+

Set to install from the Docker repo instead of the default Ubuntu repo:

+
apt-cache policy docker-ce
+
docker-ce:
Installed: (none)
Candidate: 5:24.0.6-1~ubuntu.22.04~jammy
Version table:
5:24.0.6-1~ubuntu.22.04~jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
5:24.0.6-1~ubuntu.22.04~jammy 500
+

Finally, install Docker:

+
sudo apt install docker-ce
+

Once complete you should be able to run it via the CLI, as such:

+
docker -v
+

Here's the output (versions might differ a bit from the time of writing):

+
Docker version 24.0.6, build ed223bc
+

The following command's output will indicate if Docker's working correctly:

+
sudo docker run hello-world
+

Here's an example of the output you'll find us "Hello from Docker!":

+
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/
+

Run all the commands above in your terminal, to confirm everything's working before proceeding to the next steps.

+

Create the Docker image

+

A Docker image is a read-only template with instructions for creating a Docker container, like a template. Docker images also act as a starting point when using Docker.

+

The starting point for our use-case is a Dockerfile, where all those "template instructions" are declared.

+

A Dockerfile should exist in the repository source code, so make sure you have change directory to the lightning source code to find it.

+

Build the Docker image

+

Build the image named as lightning from our Dockerfile:

+
sudo docker build -t lightning -f ./Dockerfile .
+

The build process takes awhile, and you have to wait for completion.

+

The output should be similar to:

+
[+] Building 1.2s (16/16) FINISHED                                                                                                     docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 990B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/debian:bullseye-slim 0.6s
=> [internal] load metadata for docker.io/library/rust:latest 0.9s
=> [stage-1 1/3] FROM docker.io/library/debian:bullseye-slim@sha256:3bc5e94a0e8329c102203c3f5f26fd67835f0c81633dd6949de0557867a87fac 0.0s
=> [builder 1/7] FROM docker.io/library/rust:latest@sha256:8a4ca3ca75afbc97bcf5362e9a694fe049d15734fbbaf82b8b7e224616c1254b 0.0s
=> [internal] load build context 0.3s
=> => transferring context: 948.93kB 0.3s
=> CACHED [stage-1 2/3] RUN DEBIAN_FRONTEND=noninteractive apt-get update -yq && DEBIAN_FRONTEND=noninteractive apt-get install -yq libs 0.0s
=> CACHED [builder 2/7] WORKDIR /lightning 0.0s
=> CACHED [builder 3/7] RUN apt-get update 0.0s
=> CACHED [builder 4/7] RUN apt-get install -y build-essential cmake clang pkg-config libssl-dev gcc protobuf-comp 0.0s
=> CACHED [builder 5/7] RUN --mount=type=cache,target=/usr/local/cargo/registry cargo install cargo-strip 0.0s
=> CACHED [builder 6/7] COPY . . 0.0s
=> CACHED [builder 7/7] RUN --mount=type=cache,target=/usr/local/cargo/registry --mount=type=cache,target=/lightning/target cargo buil 0.0s
=> CACHED [stage-1 3/3] COPY --from=builder /lightning/target/release/lightning-node /usr/local/bin/lgtn 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:e8e5ed19f59c3cc6a9add5bdb578c464904e9789d5f386cc4af81044c062d998 0.0s
=> => naming to docker.io/library/lightning
+
tip

The Docker image is only required to be built once and/or, when changes are pulled from the remote repository, or specific versions you might be interested in. Otherwise, you're not required to build it every time to run the node. If you'd like to learn how to update the Lightning CLI, find our references here.

+
caution

If you don't update your source code and binary build often, you won't have the latest changes, which should happen frequently to take advantage of all the ongoing development. This is quite important to understand, as it causes confusion to some users. The Lightning application at time of writing does not update automatically.

+

Docker Container

+

A container is what's originated from the image we discussed in the section build the docker image, it is a run-able instance of an image. We can create, start, stop, move, or delete a container using the Docker API or CLI.

+

Following up, we'll learn how to run the Docker container that includes our Lightning CLI program, built from our Dockerfile.

+

Once the Docker image is ready, run the container based on the image lightning. Effectively running the Fleek Network Lightning node process:

+
sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it ghcr.io/fleek-network/lightning:latest
+
tip

Notice that the command arguments we pass are for the flag's -p port numbers, -v to bind mount a location in your host to a container path (useful to persist your configuration files, e.g. keystore), --name to make it easier to identify, -it to make it interactive (e.g. presents output to the terminal), and the image name we built earlier.

+

The output would look as the following, showing the error message "Node is not whitelisted" (this error message is due to the testnet phase that requires nodes to be whitelisted to run successfully):

+
thread 'main' panicked at 'Node is not whitelisted. Please join the Fleek Discord to get invited.', core/cli/src/testnet_sync.rs:45:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
/root/init: line 7: 7 Aborted (core dumped) lgtn run
+

Keys have to be generated when launching the service. On Docker run, if the keystore is not found, the keys are automatically generated and stored in the Docker host's $HOME/.lightning/keystore directory.

+
tip

Have in mind that the $HOME/.lightning/config.toml is where the keystore location paths are configured, which default value is in the user $HOME path. The users who customize or modify the default location, need to apply the required customizations. To learn more about how to manage the keystore, visit the managing keystore section.

+

Generate keys

+

Execute the keys generate command on the container lightning-node:

+
sudo docker exec -it lightning-node lgtn keys generate
+

We've bound the host path ~/.lightning into the container /home/lgtn/.lightning.

+

You can list the contents of the ~/.lightning, where you should find the config.toml and keystore:

+
.
..
config.toml
keystore
+

You only have to run the keys generate once from your host.

+

Finally, you can start the Fleek Network node by running the command:

+
sudo docker start lightning-node
+
tip

The lightning-node is the name we provided on first run as described in docker container section. If you have set a different name, change accordingly.

+

Run the Docker Container as Systemd Service

+

In this section we’ll cover how to wrap a Docker Container as a Systemd Service without the need for third party tools or complex commands. Some reasons include, minimizing the dependency on the Docker Daemon as we can move to an OCI complaint solution other that Docker at anytime, or the fact we recommend Systemd Service Units and Systemctl to control the Service in our Native install that most users are familiar. Our goal is to provide guidance to the widest audience possible, if you have other preferences on managing your service that is more fitting to your needs that's fine.

+
tip

Docker recommends using their cross-platform built-in restart policy for running a Container as a Service. For that, configure your Docker service to start on system boot.

+

Systemd was specifically developed to serve the purpose of stopping services, dependency checking and recovery of failed services. You can have your host start, stop, enable, check the status, and generally manage a container as a Systemd Service.

+

Create the Systemd Service Unit

+

We are going to create the unit configuration file in the /etc/systemd/system/ directory. The Service Unit is going to be named as docker-lightning.service. To create the file run the following command:

+
sudo touch /etc/systemd/system/docker-lightning.service
+

Open the file in your favorite text editor and populate with the content found here:

+
[Unit]
Description=Fleek Network Node lightning service
After=docker.service
Requires=docker.service

[Service]
Restart=always
RestartSec=5
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill lightning-node
ExecStartPre=-/usr/bin/docker rm lightning-node
ExecStartPre=/usr/bin/docker pull ghcr.io/fleek-network/lightning:latest
ExecStart=/usr/bin/docker run -p 4200-4299:4200-4299 -p 4300-4399:4300-4399 --mount type=bind,source=/home/skywalker/.lightning,target=/home/lgtn/.lightning --mount type=bind,source=/var/tmp,target=/var/tmp --name lightning-node ghcr.io/fleek-network/lightning:latest
ExecStop=/usr/bin/docker stop lightning-node
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log

[Install]
WantedBy=multi-user.target
+

Once the file is saved, change the file permissions by running the command:

+
sudo chmod 644 /etc/systemd/system/docker-lightning.service
+

Next, reload the Systemctl Daemon:

+
sudo systemctl daemon-reload
+

Enable the service on startup when the system boots:

+
sudo systemctl enable docker-lightning.service
+

As a result, we are now able to run our containers as a Systemd service. For this, read the document manage systemd service to find more about how to control the service.

+

Viewing logs

+

To view the logs of a Docker container in real time, use the following command:

+
sudo docker logs -f lightning-node
+

If you have wrapped the docker container as a systemd service, you can use the same commands found when installed natively, such as:

+

For standard output:

+
tail -f /var/log/lightning/output.log
+

Or, the standard error:

+
tail -f /var/log/lightning/diagnostic.log
+

Learn more about how to analyze log messages.

+

Conclusion

+

Containers are a way to have a self-contained environment that includes all necessary dependencies, libraries, software, amongst others required to run an application.

+

Fleek Network's Lightning is developed with Rust, a general-purpose programming language, that requires several dependencies and libraries to compile the project. Some of these libraries are not installed by default and require some troubleshooting for the end user. Docker provides us with containers, self-containing all the required libraries for the purpose of running Lightning, our application.

+

We guided you through the initial installation steps, and how to build a Docker image, which then's used to Docker run a container. Plus, provided lower-level commands, to help you understand other present or advanced use-cases, and also at higher level, offerring simple utility methods.

+

While we do our best to provide the clearest instructions, there's always space for improvement, therefore feel free to make any contributions by messaging us on our Discord or by opening a PR in any of our repositories.

+

Discover more about the project by watching/contributing on Github, following us on Twitter, and joining our community Discord for all the best updates!

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/guides/Node Operators/transfering-setup-ownership/index.html b/guides/Node Operators/transfering-setup-ownership/index.html index 8dba6bfd1..d660a70fd 100644 --- a/guides/Node Operators/transfering-setup-ownership/index.html +++ b/guides/Node Operators/transfering-setup-ownership/index.html @@ -1,9 +1,9 @@ - + - -Transfering setup ownership | Fleek Network Docs | Decentralized Edge Platform + +Transfering setup ownership | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,143 @@ - - - + + + - + -
-

Transfering setup ownership

TL;DR

tip

The step-by-step instructions provided in the guide should be simple to follow, but the process is also available as an automated script from our familiar get.fleek.network tool.

To use the automated script execute the following command in your server terminal and follow the instructions:

curl -sS https://get.fleek.network/transfer_system_user_setup_ownership | bash

We try to make the auomated scripts as useful as possible, but it's impossible to fit every single use-case. So, if you find any isses or have feedback to help us improve message us through our Discord.

Introduction

Our Lightning CLI and Node process is run by a user, that has some sort of permissions–some users run it as a super user (root) which is questionable as root privileges are not a necessary good. We'll look into how to create a user to manage and control the Fleek Network Lightning CLI and Systemd unit service. Also, presents the concept of file permissions and ownership which is crucial in preventing private or sensitive data from being exposed to dodgy actors.

Let's discuss the topic and open up a few ideas to help us improve the security of our server.

Pre-requisites

To follow the guide, you will need the following:

  • Familiarity with the command-line interface
  • Have installed and set up the Lightning CLI and service

Ownership of Lightning CLI files

The user who installs the Lightning CLI and sets the Service takes an important role that determines the location of the configuration files, the setup, and how the Systemd service is managed or controlled.

Our install document recommends creating a user and switching to the user to set up the service. You shouldn't want installed applications to run with elevated privileges. Applications are meant to be run with non-administrative privileges. If an application requires higher privileges, the administrator, such as a sudoer should be able to elevate it. An application that has full access and control of a system can modify it in harmful ways, e.g. compromise the private keys.

For our guide, we'll illustrate the process of migration from a super user (root) to another user (sudo). The knowledge should be easily appliable for any other user-to-user migration. We stick with root user for simplicity and because that's the most common use case.

tip

A reference document about File permissions and ownership is available that explains how it works practically, by showcasing how the process can be started, how the node process locates the Keystore, etc.

Systemd Service

In systemd, a unit refers to any resource that the system knows how to operate on and manage. This is the primary object that the systemd tools know how to deal with. These resources are defined using configuration files called unit files.

The recommended installation process features a systemd.service which is a resource that the system knows how to operate and manage by an administrator user.

tip

When using a Systemd service to run a process, it operates comparably to running it directly. The key difference is that Systemd keeps track of all the processes and threads that are spawned. This means that when a service is stopped using systemctl, such as the Fleek Network Lightning Node service, all the child processes that were started by the service are also terminated. Additionally, by utilizing Systemd, a user can run the process in the background and configure it to start automatically on system startup.

If you have followed the installation recommendations, find the systemd service unit in the location /etc/systemd/system/lightning.service (we are using Ubuntu Linux as an example to keep it short).

Make sure that you have set up a Systemd unit service, as recommended during the installation as this guide assumes you have one setup.

Stop the service

Before we proceed with any changes required for the migration, you'll have to stop the lightning.service.

systemctl stop lightning
note

For this guide, we are assuming that you are migrating ownership from root to a sudoer user. If not, you might be required to elevate privileges as sudo** where required. For example, sudo systemctl stop lightning.

Clear the .lightning data

Run the following command to clear the /root/.lightning/data, as it can be quite large, and we don't need to move it.

sudo rm -rf /root/.lightning/data

Create a user

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

You can create a new user and add to the sudo group by running:

tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

sudo adduser lgtn

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

sudo usermod -aG sudo lgtn

Switch to the new user by using the command:

su lgtn

Change the directory to the new user's home, as follows:

cd /home/lgtn

Move lightning system and source code directory to user's home

A user should've been created, added the user to the sudo group, switched to the user, and changed the directory to the user's home.

Run the command pwd:

pwd

The output would look like:

/home/<USERNAME>

Given the username lgtn:

/home/lgtn

You'll then move two directories:

  • The /root/.lightning
  • The source code under the parent /root/fleek-network

1) Move the /root/.lightning directory from one user to the other

For our demo, we have assumed root user to sudoer user named lgtn, thus that'll look like this:

sudo mv /root/.lightning /home/lgtn/

2) Move the /root/fleek-network directory from one user to the other

sudo mv /root/fleek-network /home/lgtn/

3) Confirm move by finding both directories

In the user $HOME directory, you should be able to list the content of the directory and find the .lightning and fleek-network directory.

ls -la

The output should be similar to the following.

drwxr-x--- 6 lgtn lgtn  4096 Sep 12 13:51 .
drwxr-xr-x 3 root root 4096 Sep 11 12:28 ..
drwxrwxr-x 5 root root 4096 Sep 11 15:25 .lightning
drwxrwxr-x 3 root root 4096 Sep 11 12:28 fleek-network

Change ownership of files

Once the directories and files are moved, they should have the wrong ownership, which should be set to root:root. We'll now have to change the ownership of the directories and files recursively.

Change the ownership of /home/lgtn/.lightning to the user lgtn as follows:

sudo chown -R lgtn:lgtn .lightning
tip

Make sure that you use the -R flag to have the ownership changes applied to the parent, the child directories and all the files.

Change the ownership of /home/lgtn/fleek-network to the user lgtn as follows:

sudo chown -R lgtn:lgtn fleek-network

Once completed, if you list the content of the directory the ownership should have changed from root:root to lgtn:lgtn.

ls -la

The output should be similar to the following.

drwxr-x--- 6 lgtn lgtn  4096 Sep 12 13:51 .
drwxr-xr-x 3 root root 4096 Sep 11 12:28 ..
drwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning
drwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network
tip

Remember that we are using lgtn for our demo. If you have opted for a different username, make sure you use the correct username. To find the username you are logged in with run the command:

whoami

For our demo, we'll assume that you understand that lgtn is the user we opted in for our demo.

We have the symbolic link that links the binary built from the source code, to the alias lgtn that's set under the /usr/local/bin/lgtn pathname.

For example, you can find where that is linked to by running:

ls -la $(which lgtn)

On the output below, we can see that the /usr/local/bin/lgtn points to /root/fleek-network/lightning/target/release/lightning-node.

lrwxrwxrwx 1 root root 64 Sep 11 15:48 /usr/local/bin/lgtn -> /root/fleek-network/lightning/target/release/lightning-node

The target base path is /root, and we know that we've moved the source code directory to the user home /home/lgtn. For this reason, we need to create a new symlink with the updated location of the binary file.

Unlink the symlink:

sudo unlink /usr/local/bin/lgtn

Create the symlink:

sudo ln -s "/home/lgtn/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn

If successful, you should be able to execute the command:

lgtn help

The output should look similar to:

Usage: lgtn [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version

Update the Systemd service unit

Open the file, its settings should be similar to the following:

[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/<USERNAME>/.lightning/config.toml run
ExecStop=killall -9 lgtn
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target

Since we opted in for the username lgtn for our demo, replaced <USERNAME> with lgtn, and it would look like:

[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml run
ExecStop=killall -9 lgtn
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
tip

Notice the ExecStart= which includes the flag -c where the location of the user files is declared. Learn how to update the config.toml to include the user-preferred file paths, e.g. declare the keystore pathname.

Complete the step by reloading the daemon, to apply the newly created changes. You can do this by executing:

sudo systemctl daemon-reload

Update the config.toml with user-preferred file locations

Open the /home/lgtn/.lightning/config.toml file in your favorite text editor.

Replace every instance of ~ (tilde) with the user's home path. We do this to ensure that every time we control the service via systemctl, the configuration file that tells which keystore to use is declared upfront regardless of running it as user or delegating to root with sudo. Learn more about file permissions and ownership by reading the reference document.

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

Here's an example of how to do it using sed:

sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

For example, if your username is lgtn that'd look like this:

sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

cat /home/lgtn/.lightning/config.toml

For our example where we opted in for the username lgtn that would look like:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

Start the service

At this stage, you should have migrated the essential files to the user home.

Ideally, you would now manage the service as the user (as described in the user service reference). To keep our guide wider to all users, we'll prefix the commands with sudo, which elevates the permissions to root. But since we have provided the configuration file the -c in our systemd service, we'll have the user-preferred configuration options ruling.

Start the service by running the command:

sudo systemctl start lightning.service
tip

Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section Log Messages.

To learn more, visit the section Use Systemctl to manage the Lightning Service

Conclusion

We started by giving a brief introduction to ownership of the Lightning CLI files.

Jumped through topics of Systemd service that helps the user manage the service in the Linux environment, which helps keep track of all the processes and threads that are spawned.

We've gone through the step-by-step process to migrate the Fleek Network CLI and Systemd service setup from one user to the other. To keep it short, we decided to go with the use-case of where the migration happens between a root user and a sudoer.

Discover more about the project by watching/contributing on GitHub, following us on Twitter, and joining our community Discord for any updates.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Transfering setup ownership

+ + +

TL;DR

+
tip

The step-by-step instructions provided in the guide should be simple to follow, but the process is also available as an automated script from our familiar get.fleek.network tool.

To use the automated script execute the following command in your server terminal and follow the instructions:

curl -sS https://get.fleek.network/transfer_system_user_setup_ownership | bash

We try to make the auomated scripts as useful as possible, but it's impossible to fit every single use-case. So, if you find any isses or have feedback to help us improve message us through our Discord.

+

Introduction

+

Our Lightning CLI and Node process is run by a user, that has some sort of permissions–some users run it as a super user (root) which is questionable as root privileges are not a necessary good. We'll look into how to create a user to manage and control the Fleek Network Lightning CLI and Systemd unit service. Also, presents the concept of file permissions and ownership which is crucial in preventing private or sensitive data from being exposed to dodgy actors.

+

Let's discuss the topic and open up a few ideas to help us improve the security of our server.

+

Pre-requisites

+

To follow the guide, you will need the following:

+
    +
  • Familiarity with the command-line interface
  • +
  • Have installed and set up the Lightning CLI and service
  • +
+

Ownership of Lightning CLI files

+

The user who installs the Lightning CLI and sets the Service takes an important role that determines the location of the configuration files, the setup, and how the Systemd service is managed or controlled.

+

Our install document recommends creating a user and switching to the user to set up the service. You shouldn't want installed applications to run with elevated privileges. Applications are meant to be run with non-administrative privileges. If an application requires higher privileges, the administrator, such as a sudoer should be able to elevate it. An application that has full access and control of a system can modify it in harmful ways, e.g. compromise the private keys.

+

For our guide, we'll illustrate the process of migration from a super user (root) to another user (sudo). The knowledge should be easily appliable for any other user-to-user migration. We stick with root user for simplicity and because that's the most common use case.

+
tip

A reference document about File permissions and ownership is available that explains how it works practically, by showcasing how the process can be started, how the node process locates the Keystore, etc.

+

Systemd Service

+

In systemd, a unit refers to any resource that the system knows how to operate on and manage. This is the primary object that the systemd tools know how to deal with. These resources are defined using configuration files called unit files.

+

The recommended installation process features a systemd.service which is a resource that the system knows how to operate and manage by an administrator user.

+
tip

When using a Systemd service to run a process, it operates comparably to running it directly. The key difference is that Systemd keeps track of all the processes and threads that are spawned. This means that when a service is stopped using systemctl, such as the Fleek Network Lightning Node service, all the child processes that were started by the service are also terminated. Additionally, by utilizing Systemd, a user can run the process in the background and configure it to start automatically on system startup.

+

If you have followed the installation recommendations, find the systemd service unit in the location /etc/systemd/system/lightning.service (we are using Ubuntu Linux as an example to keep it short).

+

Make sure that you have set up a Systemd unit service, as recommended during the installation as this guide assumes you have one setup.

+

Stop the service

+

Before we proceed with any changes required for the migration, you'll have to stop the lightning.service.

+
systemctl stop lightning
+
note

For this guide, we are assuming that you are migrating ownership from root to a sudoer user. If not, you might be required to elevate privileges as sudo** where required. For example, sudo systemctl stop lightning.

+

Clear the .lightning data

+

Run the following command to clear the /root/.lightning/data, as it can be quite large, and we don't need to move it.

+
sudo rm -rf /root/.lightning/data
+

Create a user

+

We recommend creating a non-root user with administrative privileges. It'll allow us to install any system requirements.

+

You can create a new user and add to the sudo group by running:

+
tip

For our example, we'll be using the name lgtn but you can pick whichever you'd like. If you already have a sudoer account, you can skip this step.

+
sudo adduser lgtn
+

After completing the adduser steps, execute the usermod to add the user to the sudo group, as follows:

+
sudo usermod -aG sudo lgtn
+

Switch to the new user by using the command:

+
su lgtn
+

Change the directory to the new user's home, as follows:

+
cd /home/lgtn
+

Move lightning system and source code directory to user's home

+

A user should've been created, added the user to the sudo group, switched to the user, and changed the directory to the user's home.

+

Run the command pwd:

+
pwd
+

The output would look like:

+
/home/<USERNAME>
+

Given the username lgtn:

+
/home/lgtn
+

You'll then move two directories:

+
    +
  • The /root/.lightning
  • +
  • The source code under the parent /root/fleek-network
  • +
+

1) Move the /root/.lightning directory from one user to the other

+

For our demo, we have assumed root user to sudoer user named lgtn, thus that'll look like this:

+
sudo mv /root/.lightning /home/lgtn/
+

2) Move the /root/fleek-network directory from one user to the other

+
sudo mv /root/fleek-network /home/lgtn/
+

3) Confirm move by finding both directories

+

In the user $HOME directory, you should be able to list the content of the directory and find the .lightning and fleek-network directory.

+
ls -la
+

The output should be similar to the following.

+
drwxr-x--- 6 lgtn lgtn  4096 Sep 12 13:51 .
drwxr-xr-x 3 root root 4096 Sep 11 12:28 ..
drwxrwxr-x 5 root root 4096 Sep 11 15:25 .lightning
drwxrwxr-x 3 root root 4096 Sep 11 12:28 fleek-network
+

Change ownership of files

+

Once the directories and files are moved, they should have the wrong ownership, which should be set to root:root. We'll now have to change the ownership of the directories and files recursively.

+

Change the ownership of /home/lgtn/.lightning to the user lgtn as follows:

+
sudo chown -R lgtn:lgtn .lightning
+
tip

Make sure that you use the -R flag to have the ownership changes applied to the parent, the child directories and all the files.

+

Change the ownership of /home/lgtn/fleek-network to the user lgtn as follows:

+
sudo chown -R lgtn:lgtn fleek-network
+

Once completed, if you list the content of the directory the ownership should have changed from root:root to lgtn:lgtn.

+
ls -la
+

The output should be similar to the following.

+
drwxr-x--- 6 lgtn lgtn  4096 Sep 12 13:51 .
drwxr-xr-x 3 root root 4096 Sep 11 12:28 ..
drwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning
drwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network
+
tip

Remember that we are using lgtn for our demo. If you have opted for a different username, make sure you use the correct username. To find the username you are logged in with run the command:

whoami

For our demo, we'll assume that you understand that lgtn is the user we opted in for our demo.

+ +

We have the symbolic link that links the binary built from the source code, to the alias lgtn that's set under the /usr/local/bin/lgtn pathname.

+

For example, you can find where that is linked to by running:

+
ls -la $(which lgtn)
+

On the output below, we can see that the /usr/local/bin/lgtn points to /root/fleek-network/lightning/target/release/lightning-node.

+
lrwxrwxrwx 1 root root 64 Sep 11 15:48 /usr/local/bin/lgtn -> /root/fleek-network/lightning/target/release/lightning-node
+

The target base path is /root, and we know that we've moved the source code directory to the user home /home/lgtn. For this reason, we need to create a new symlink with the updated location of the binary file.

+

Unlink the symlink:

+
sudo unlink /usr/local/bin/lgtn
+

Create the symlink:

+
sudo ln -s "/home/lgtn/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn
+

If successful, you should be able to execute the command:

+
lgtn help
+

The output should look similar to:

+
Usage: lgtn [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version
+

Update the Systemd service unit

+

Open the file, its settings should be similar to the following:

+
[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/<USERNAME>/.lightning/config.toml run
ExecStop=killall -9 lgtn
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
+

Since we opted in for the username lgtn for our demo, replaced <USERNAME> with lgtn, and it would look like:

+
[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml run
ExecStop=killall -9 lgtn
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
+
tip

Notice the ExecStart= which includes the flag -c where the location of the user files is declared. Learn how to update the config.toml to include the user-preferred file paths, e.g. declare the keystore pathname.

+

Complete the step by reloading the daemon, to apply the newly created changes. You can do this by executing:

+
sudo systemctl daemon-reload
+

Update the config.toml with user-preferred file locations

+

Open the /home/lgtn/.lightning/config.toml file in your favorite text editor.

+

Replace every instance of ~ (tilde) with the user's home path. We do this to ensure that every time we control the service via systemctl, the configuration file that tells which keystore to use is declared upfront regardless of running it as user or delegating to root with sudo. Learn more about file permissions and ownership by reading the reference document.

+

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

+

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

+

Here's an example of how to do it using sed:

+
sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
+
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

+

For example, if your username is lgtn that'd look like this:

+
sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
+

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

+
cat /home/lgtn/.lightning/config.toml
+

For our example where we opted in for the username lgtn that would look like:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

+

Start the service

+

At this stage, you should have migrated the essential files to the user home.

+

Ideally, you would now manage the service as the user (as described in the user service reference). To keep our guide wider to all users, we'll prefix the commands with sudo, which elevates the permissions to root. But since we have provided the configuration file the -c in our systemd service, we'll have the user-preferred configuration options ruling.

+

Start the service by running the command:

+
sudo systemctl start lightning.service
+
tip

Find the timeline of events for the Lightning service by checking the log files. Learn about it in the section Log Messages.

+

To learn more, visit the section Use Systemctl to manage the Lightning Service

+

Conclusion

+

We started by giving a brief introduction to ownership of the Lightning CLI files.

+

Jumped through topics of Systemd service that helps the user manage the service in the Linux environment, which helps keep track of all the processes and threads that are spawned.

+

We've gone through the step-by-step process to migrate the Fleek Network CLI and Systemd service setup from one user to the other. To keep it short, we decided to go with the use-case of where the migration happens between a root user and a sudoer.

+

Discover more about the project by watching/contributing on GitHub, following us on Twitter, and joining our community Discord for any updates.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/guides/Node Operators/updating-lightning/index.html b/guides/Node Operators/updating-lightning/index.html index f10b2d3a2..4237ba3d3 100644 --- a/guides/Node Operators/updating-lightning/index.html +++ b/guides/Node Operators/updating-lightning/index.html @@ -1,9 +1,9 @@ - + - -Updating Lightning | Fleek Network Docs | Decentralized Edge Platform + +Updating Lightning | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,118 @@ - - - + + + - + -
-

Update Lightning

Introduction

Fleek Network's Lightning source code is updated frequently and thus keeping up with changes can be a bit of a chore and especially difficult for users who are trying to have it compiled for the first time, or updating the Lightning CLI binary for their operating systems. While we should have stable releases in the future, at the current phase of development, there's a requirement to follow the contributions directly in the repository: checking in and out, the commits you're interested in running.

In the following guide, we’ll have a simple look into how to pull changes and update Lightning CLI on Linux, which we stick with Ubuntu for simplicity but should be easily transferrable to your supported OS.

Pre-requisites

To follow the guide, you will need the following:

  • Familiarity with the command-line interface
  • Some experience with Git
  • Have installed and set up the Lightning CLI and service

Pulling the latest changes

Check the latest contributions pushed to the Lightning CLI main branch, it'll give you clarity on what's been committed into the source code. Therefore, find out about new features, fixes, improvements, etc by looking directly into the repository history.

Switch to installer username

First, switch to the username you've used to install and setup Fleek Network Lightning.

To switch to the username you've used throughout the installation process do:

su <USERNAME>

For example, if you used the username lgtn it'll look like the following command:

su lgtn

Change directory to the source code

Next, change directory to the Lightning directory in your file system.

tip

The tild ~ means user $HOME, thus you have to be logged in with the correct user as requested in the installer username step.

cd <PATH-TO-LIGHTNING-SOURCE-CODE>

If you have installed it via the recommended instructions, then the default location where the source code is stored should be ~/fleek-network/lightning. Otherwise, if you opted-in for a custom location then look into your notes before proceeding.

For example, it'd look like the following command:

cd ~/fleek-network/lightning

Checkout to branch

Make sure that you are checked in to the correct branch. For example, if that'd be the first testnet phase it'd be called testnet-alpha-1.

git checkout <BRANCH-NAME>

Here's an example of how the command would look like for the main default branch with corresponding name main.

git checkout main
danger

During testnet phase, you have to checkout to the testnet branch. For example, the first testnet branch name was testnet-alpha-1 that you would have to be checked in order to run a node successfully. A list of the active branches can be found at anytime in the GitHub repository active branches. While we try our best to update documentation, guides, instructions or any other written content during development, there might be breaking changes that might take some time to reflect in our documents. To avoid disappointment, check into the correct branch or contribute by getting in touch with us, or sending a PR in the relevant context, thank you!

Here's an example of how the command would look like for the branch name testnet-alpha-1.

git checkout testnet-alpha-1

Pull the latest changes

The syntax to pull the latest commits is the following:

git pull <REPOSITORY-NAME> <BRANCH-NAME>

The git pull command is used to fetch and merge changes from the remote repository to the local repository. Here we're pulling from remote named origin and branch main.

git pull origin main
tip

If you've made any changes in the local repository directory, clear them to prevent being blocked. As git is a version control program that looks for changes and will ask you to do something about it to prevent losing data. Most readers can disregard changes if not contributing to the development by simply stashing or resetting the changes.

A quick way to clean is to stash the changes, for example:

git stash 

You can check yourself, as follows:

git remote -v

Our output clearly describes what origin is tracking.

origin  git@github.com:fleek-network/lightning.git (fetch)
origin git@github.com:fleek-network/lightning.git (push)

Alternatively, you can stash and pull, to reset the repository to the origin.

git fetch origin <BRANCH-NAME>
git reset --hard origin/<BRANCH-NAME>
git clean -f
tip

With git you can point to any point in the repository history, there might be lots of reasons you'd want to check into a certain commit or branch, e.g. if you encounter bugs and need to revert to a previous commit or version. That being said, we welcome all kinds of contributions, such as simply reporting bugs. To report issues in our repository visit the issues page to help us improve.

Here's the output we got after the git pull:

remote: Enumerating objects: 437, done.
remote: Counting objects: 100% (437/437), done.
remote: Compressing objects: 100% (205/205), done.
remote: Total 397 (delta 242), reused 334 (delta 181), pack-reused 0
Receiving objects: 100% (397/397), 214.68 KiB | 4.77 MiB/s, done.
Resolving deltas: 100% (242/242), completed with 29 local objects.
From https://github.com/fleek-network/lightning
* branch main -> FETCH_HEAD
12b2647..998108d main -> origin/main
Updating 12b2647..998108d
Fast-forward
.dockerignore | 6 -
.gitignore | 2 +
Cargo.lock | 782 +++++++----------------
Cargo.toml | 2 +-
core/application/src/state.rs | 12 +-
core/cli/Cargo.toml | 47 ++
core/cli/readme.md | 59 ++
core/cli/src/args.rs | 63 ++
core/cli/src/cli.rs | 136 ++++
core/cli/src/commands/dev.rs | 112 ++++
core/cli/src/commands/key.rs | 92 +++

...

When your local version of the repository, is up-to-date with the remote repository, you'd get:

From https://github.com/fleek-network/lightning
* branch main -> FETCH_HEAD
Already up to date.

A "already up to date" message means that you have the latest version of the source code and can proceed with compiling the binary process from the source code to override the Lightning CLI version you're on. You can also make any other setup changes that might find necessary. Some changes might be related to the recommended setup of Systemd Service that helps control the Fleek Network Lightning Node binary process, etc.

Build the binary from the source code

We're assuming that your system setup hasn't changed, such as Rust toolchain still being installed and setup correctly in the system and any other required dependencies. If you have made changes to your system and need to revisit the setup instructions, check our install document here.

First, switch the user and change directory to the Lightning directory in your file system as described in switch to installer username change directory to the source code sections.

Recall the command from our install document or getting started guide? As you probably guessed, you need to execute the rust cargo build command. But firstly, we are going to clean and update the Rust package manager, as follows:

cargo clean
cargo update

Next, execute the build command to compile the Fleek Network Lightning CLI binary.

cargo +stable build --release
tip

The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable.

Once the Rust compiler completes, the generated binary will be available in the source code project directory.

If you have stick with the default recommendation, that'll be at ~/fleek-network/lightning/target/release/lightning-node.

During the original install and setup process, a symbolic link (symlink) was created linking the generated binary file located in ~/fleek-network/lightning/target/release/lightning-node to /usr/local/bin/lgtn. By placing the symlink in the the default installation location of the user, the executable application is available globally as lgtn.

You can see the full absolute path of the symlink and verify if setup correctly by running:

readlink -f <SYMLINK-NAME>

If you have followed the recommended name, the symbolic link should be called lgtn, short version for lightning.

readlink -f lgtn

Here's an example where we find the symlink lgtn pointing to the absolute path where our source code and originated built binary is located, as described in the build the binary from the source code section.

/home/<USERNAME>/fleek-network/lightning/target/release/lightning-node

Alternatively, you can use the ls command to identify the symlink.

ls -la $(which lgtn)

If you find an error, it's very likely that a symlink is not setup. You can revisit the installation to learn, or execute the command to link the build binary to the user default install location:

sudo ln -s "~/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn
tip

Make sure that the paths provided to the command ln are correct. If you are using customized pathnames or switched to a different username other than the one used for installation it has to change accordingly.

Systemd service

It's highly recommended to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions.

Verify the setup

The recommended setup is to wrap the Lightning binary process as a Systemd service, as instructed in the install section.

If you have followed the recommendations, you should have the service file called ligthning.service in the path /etc/systemd/system/lightning.service.

The content of lightning.service should have some or more of the following properties and values:

[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target

Every time the file is modified, the Systemd process should be reloaded. You can do this by executing:

sudo systemctl daemon-reload

To learn more about how to create a Systemd service read the manual installation document that illustrates the steps required in greater detail.

Launching the node as a systemd service

After completing all the steps and checkups mentioned throughout the guide, you should have the Fleek Network Lightning Service ready to go.

To launch the service, execute the following command:

sudo systemctl start lightning.service

To learn more about how to use Systemctl to manage the Lightning service, read the document here.

Health check

First, complete all the steps and checkups mentioned throught the guide and once the Node process is running perform a health check.

To run a quick health checkup, send a GET request to /health endpoint of the RPC on port 4230.

curl -w "\n" localhost:4230/health

If successful, you should get the response running and staked, as follows:

running and staked

If you'd like to learn more about health check, visit the section health check of our documentation.

Conclusion

The Fleek Network's Ursa CLI is in constant development, there are frequent changes that can introduce features, fixes, and performance improvements, but also breaking changes that in some cases require you to add, including new libraries or packages in your operating system.

In the current phase of development, a proper software release cycle for the updates is still in development, thus we pick changes from the source repository to build the Lightning application.

We have looked into how to pull the changes via Git, and discussed that contributions can introduce new requirements to the host operating system that leads to updates or changes in the documentation–mentioning how hard it is to keep in sync. Explained how to look into the contributions to understand the nature of the change and get hints about new features.

To complete, provided a step-by-step walkthrough the installation and setup process for the Fleek Network Lightning CLI and Systemd service.

Discover more about the project by watching/contributing on GitHub, following us on Twitter, and joining our community Discord for any updates.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Update Lightning

+ + +

Introduction

+

Fleek Network's Lightning source code is updated frequently and thus keeping up with changes can be a bit of a chore and especially difficult for users who are trying to have it compiled for the first time, or updating the Lightning CLI binary for their operating systems. While we should have stable releases in the future, at the current phase of development, there's a requirement to follow the contributions directly in the repository: checking in and out, the commits you're interested in running.

+

In the following guide, we’ll have a simple look into how to pull changes and update Lightning CLI on Linux, which we stick with Ubuntu for simplicity but should be easily transferrable to your supported OS.

+

Pre-requisites

+

To follow the guide, you will need the following:

+
    +
  • Familiarity with the command-line interface
  • +
  • Some experience with Git
  • +
  • Have installed and set up the Lightning CLI and service
  • +
+

Pulling the latest changes

+

Check the latest contributions pushed to the Lightning CLI main branch, it'll give you clarity on what's been committed into the source code. Therefore, find out about new features, fixes, improvements, etc by looking directly into the repository history.

+

Switch to installer username

+

First, switch to the username you've used to install and setup Fleek Network Lightning.

+

To switch to the username you've used throughout the installation process do:

+
su <USERNAME>
+

For example, if you used the username lgtn it'll look like the following command:

+
su lgtn
+

Change directory to the source code

+

Next, change directory to the Lightning directory in your file system.

+
tip

The tild ~ means user $HOME, thus you have to be logged in with the correct user as requested in the installer username step.

+
cd <PATH-TO-LIGHTNING-SOURCE-CODE>
+

If you have installed it via the recommended instructions, then the default location where the source code is stored should be ~/fleek-network/lightning. Otherwise, if you opted-in for a custom location then look into your notes before proceeding.

+

For example, it'd look like the following command:

+
cd ~/fleek-network/lightning
+

Checkout to branch

+

Make sure that you are checked in to the correct branch. For example, if that'd be the first testnet phase it'd be called testnet-alpha-1.

+
git checkout <BRANCH-NAME>
+

Here's an example of how the command would look like for the main default branch with corresponding name main.

+
git checkout main
+
warning

During testnet phase, you have to checkout to the testnet branch. For example, the first testnet branch name was testnet-alpha-1 that you would have to be checked in order to run a node successfully. A list of the active branches can be found at anytime in the GitHub repository active branches. While we try our best to update documentation, guides, instructions or any other written content during development, there might be breaking changes that might take some time to reflect in our documents. To avoid disappointment, check into the correct branch or contribute by getting in touch with us, or sending a PR in the relevant context, thank you!

+

Here's an example of how the command would look like for the branch name testnet-alpha-1.

+
git checkout testnet-alpha-1
+

Pull the latest changes

+

The syntax to pull the latest commits is the following:

+
git pull <REPOSITORY-NAME> <BRANCH-NAME>
+

The git pull command is used to fetch and merge changes from the remote repository to the local repository. Here we're pulling from remote named origin and branch main.

+
git pull origin main
+
tip

If you've made any changes in the local repository directory, clear them to prevent being blocked. As git is a version control program that looks for changes and will ask you to do something about it to prevent losing data. Most readers can disregard changes if not contributing to the development by simply stashing or resetting the changes.

A quick way to clean is to stash the changes, for example:

git stash 
+

You can check yourself, as follows:

+
git remote -v
+

Our output clearly describes what origin is tracking.

+
origin	git@github.com:fleek-network/lightning.git (fetch)
origin git@github.com:fleek-network/lightning.git (push)
+

Alternatively, you can stash and pull, to reset the repository to the origin.

+
git fetch origin <BRANCH-NAME>
git reset --hard origin/<BRANCH-NAME>
git clean -f
+
tip

With git you can point to any point in the repository history, there might be lots of reasons you'd want to check into a certain commit or branch, e.g. if you encounter bugs and need to revert to a previous commit or version. That being said, we welcome all kinds of contributions, such as simply reporting bugs. To report issues in our repository visit the issues page to help us improve.

+

Here's the output we got after the git pull:

+
remote: Enumerating objects: 437, done.
remote: Counting objects: 100% (437/437), done.
remote: Compressing objects: 100% (205/205), done.
remote: Total 397 (delta 242), reused 334 (delta 181), pack-reused 0
Receiving objects: 100% (397/397), 214.68 KiB | 4.77 MiB/s, done.
Resolving deltas: 100% (242/242), completed with 29 local objects.
From https://github.com/fleek-network/lightning
* branch main -> FETCH_HEAD
12b2647..998108d main -> origin/main
Updating 12b2647..998108d
Fast-forward
.dockerignore | 6 -
.gitignore | 2 +
Cargo.lock | 782 +++++++----------------
Cargo.toml | 2 +-
core/application/src/state.rs | 12 +-
core/cli/Cargo.toml | 47 ++
core/cli/readme.md | 59 ++
core/cli/src/args.rs | 63 ++
core/cli/src/cli.rs | 136 ++++
core/cli/src/commands/dev.rs | 112 ++++
core/cli/src/commands/key.rs | 92 +++

...
+

When your local version of the repository, is up-to-date with the remote repository, you'd get:

+
From https://github.com/fleek-network/lightning
* branch main -> FETCH_HEAD
Already up to date.
+

A "already up to date" message means that you have the latest version of the source code and can proceed with compiling the binary process from the source code to override the Lightning CLI version you're on. You can also make any other setup changes that might find necessary. Some changes might be related to the recommended setup of Systemd Service that helps control the Fleek Network Lightning Node binary process, etc.

+

Build the binary from the source code

+

We're assuming that your system setup hasn't changed, such as Rust toolchain still being installed and setup correctly in the system and any other required dependencies. If you have made changes to your system and need to revisit the setup instructions, check our install document here.

+

First, switch the user and change directory to the Lightning directory in your file system as described in switch to installer username change directory to the source code sections.

+

Recall the command from our install document or getting started guide? As you probably guessed, you need to execute the rust cargo build command. But firstly, we are going to clean and update the Rust package manager, as follows:

+
cargo clean
cargo update
+

Next, execute the build command to compile the Fleek Network Lightning CLI binary.

+
cargo +stable build --release
+
tip

The build command uses the Rust compiler, which might take a while depending on how speedy the host machine is capable.

+

Once the Rust compiler completes, the generated binary will be available in the source code project directory.

+

If you have stick with the default recommendation, that'll be at ~/fleek-network/lightning/target/release/lightning-node.

+ +

During the original install and setup process, a symbolic link (symlink) was created linking the generated binary file located in ~/fleek-network/lightning/target/release/lightning-node to /usr/local/bin/lgtn. By placing the symlink in the the default installation location of the user, the executable application is available globally as lgtn.

+

You can see the full absolute path of the symlink and verify if setup correctly by running:

+
readlink -f <SYMLINK-NAME>
+

If you have followed the recommended name, the symbolic link should be called lgtn, short version for lightning.

+
readlink -f lgtn
+

Here's an example where we find the symlink lgtn pointing to the absolute path where our source code and originated built binary is located, as described in the build the binary from the source code section.

+
/home/<USERNAME>/fleek-network/lightning/target/release/lightning-node
+

Alternatively, you can use the ls command to identify the symlink.

+
ls -la $(which lgtn)
+

If you find an error, it's very likely that a symlink is not setup. You can revisit the installation to learn, or execute the command to link the build binary to the user default install location:

+
sudo ln -s "~/fleek-network/lightning/target/release/lightning-node" /usr/local/bin/lgtn
+
tip

Make sure that the paths provided to the command ln are correct. If you are using customized pathnames or switched to a different username other than the one used for installation it has to change accordingly.

+

Systemd service

+

It's highly recommended to use systemd to manage the Fleek Network service for node operators. Systemd is a system and service manager for Linux operating systems that provides a consistent way to manage system services across various distributions.

+

Verify the setup

+

The recommended setup is to wrap the Lightning binary process as a Systemd service, as instructed in the install section.

+

If you have followed the recommendations, you should have the service file called ligthning.service in the path /etc/systemd/system/lightning.service.

+

The content of lightning.service should have some or more of the following properties and values:

+
[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml -vv run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
+

Every time the file is modified, the Systemd process should be reloaded. You can do this by executing:

+
sudo systemctl daemon-reload
+

To learn more about how to create a Systemd service read the manual installation document that illustrates the steps required in greater detail.

+

Launching the node as a systemd service

+

After completing all the steps and checkups mentioned throughout the guide, you should have the Fleek Network Lightning Service ready to go.

+

To launch the service, execute the following command:

+
sudo systemctl start lightning.service
+

To learn more about how to use Systemctl to manage the Lightning service, read the document here.

+

Health check

+

First, complete all the steps and checkups mentioned throught the guide and once the Node process is running perform a health check.

+

To run a quick health checkup, send a GET request to /health endpoint of the RPC on port 4230.

+
curl -w "\n" localhost:4230/health
+

If successful, you should get the response running and staked, as follows:

+
running and staked
+

If you'd like to learn more about health check, visit the section health check of our documentation.

+

Conclusion

+

The Fleek Network's Ursa CLI is in constant development, there are frequent changes that can introduce features, fixes, and performance improvements, but also breaking changes that in some cases require you to add, including new libraries or packages in your operating system.

+

In the current phase of development, a proper software release cycle for the updates is still in development, thus we pick changes from the source repository to build the Lightning application.

+

We have looked into how to pull the changes via Git, and discussed that contributions can introduce new requirements to the host operating system that leads to updates or changes in the documentation–mentioning how hard it is to keep in sync. Explained how to look into the contributions to understand the nature of the change and get hints about new features.

+

To complete, provided a step-by-step walkthrough the installation and setup process for the Fleek Network Lightning CLI and Systemd service.

+

Discover more about the project by watching/contributing on GitHub, following us on Twitter, and joining our community Discord for any updates.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/guides/index.html b/guides/index.html index 627274ece..4d0384a5e 100644 --- a/guides/index.html +++ b/guides/index.html @@ -1,9 +1,9 @@ - + - -About guides | Fleek Network Docs | Decentralized Edge Platform + +About guides | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,16 @@ - - - + + + - + -
-

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

It differs from the references documentation which serves as a quick direct breakdown of commands and processes without much explanation, as the name implies.

To start, find guides by consulting the available categories to locate the content on the sidebar. Our guides are also available as a result when using the search feature located at the very top of the documentation site.

- - +
+

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

+

It differs from the references documentation which serves as a quick direct breakdown of commands and processes without much explanation, as the name implies.

+

To start, find guides by consulting the available categories to locate the content on the sidebar. Our guides are also available as a result when using the search feature located at the very top of the documentation site.

\ No newline at end of file diff --git a/guides/tags/configuration/index.html b/guides/tags/configuration/index.html index c9c9e60d6..1f7dd652d 100644 --- a/guides/tags/configuration/index.html +++ b/guides/tags/configuration/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "configuration" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "configuration" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "configuration"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

- - +

2 docs tagged with "configuration"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

\ No newline at end of file diff --git a/guides/tags/container/index.html b/guides/tags/container/index.html index e45516c57..aa402e8ec 100644 --- a/guides/tags/container/index.html +++ b/guides/tags/container/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "container" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "container" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "container"

View All Tags
- - +

One doc tagged with "container"

View All Tags
\ No newline at end of file diff --git a/guides/tags/docker/index.html b/guides/tags/docker/index.html index 94aeafef2..4baf69a73 100644 --- a/guides/tags/docker/index.html +++ b/guides/tags/docker/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "docker" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "docker" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "docker"

View All Tags
- - +

One doc tagged with "docker"

View All Tags
\ No newline at end of file diff --git a/guides/tags/edge-computing/index.html b/guides/tags/edge-computing/index.html index 0a9a80e75..9b3a6e077 100644 --- a/guides/tags/edge-computing/index.html +++ b/guides/tags/edge-computing/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Edge computing" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Edge computing" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "Edge computing"

View All Tags

Getting Started

A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!

- - +

One doc tagged with "Edge computing"

View All Tags

Getting Started

A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!

\ No newline at end of file diff --git a/guides/tags/fleek-network/index.html b/guides/tags/fleek-network/index.html index 08694ec99..398401800 100644 --- a/guides/tags/fleek-network/index.html +++ b/guides/tags/fleek-network/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Fleek Network" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Fleek Network" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "Fleek Network"

View All Tags

About guides

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

- - +

One doc tagged with "Fleek Network"

View All Tags

About guides

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

\ No newline at end of file diff --git a/guides/tags/getting-started/index.html b/guides/tags/getting-started/index.html index ef9b823e8..516a51a73 100644 --- a/guides/tags/getting-started/index.html +++ b/guides/tags/getting-started/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Getting Started" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Getting Started" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "Getting Started"

View All Tags

Getting Started

A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!

- - +

One doc tagged with "Getting Started"

View All Tags

Getting Started

A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!

\ No newline at end of file diff --git a/guides/tags/guide/index.html b/guides/tags/guide/index.html index 97d25a7bc..48d9c3d98 100644 --- a/guides/tags/guide/index.html +++ b/guides/tags/guide/index.html @@ -1,9 +1,9 @@ - + - -6 docs tagged with "Guide" | Fleek Network Docs | Decentralized Edge Platform + +6 docs tagged with "Guide" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

6 docs tagged with "Guide"

View All Tags

Getting Started

A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

- - +

6 docs tagged with "Guide"

View All Tags

Getting Started

A first look at what Fleek Network is, why it's important, and a simple tutorial of running and interacting with a node on your local machine!

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

\ No newline at end of file diff --git a/guides/tags/guides/index.html b/guides/tags/guides/index.html index 5079a6759..0f3e93af3 100644 --- a/guides/tags/guides/index.html +++ b/guides/tags/guides/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Guides" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Guides" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "Guides"

View All Tags

About guides

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

- - +

One doc tagged with "Guides"

View All Tags

About guides

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

\ No newline at end of file diff --git a/guides/tags/help/index.html b/guides/tags/help/index.html index 9d0bfd19a..35f1e1e65 100644 --- a/guides/tags/help/index.html +++ b/guides/tags/help/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Help" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Help" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "Help"

View All Tags

About guides

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

- - +

One doc tagged with "Help"

View All Tags

About guides

The guides provide step-by-step instructions and descriptions to help understand how and why you'd have to do or execute certain commands or processes.

\ No newline at end of file diff --git a/guides/tags/index.html b/guides/tags/index.html index 9f55395ac..5ff89b5b7 100644 --- a/guides/tags/index.html +++ b/guides/tags/index.html @@ -1,9 +1,9 @@ - + - -Tags | Fleek Network Docs | Decentralized Edge Platform + +Tags | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/guides/tags/keys/index.html b/guides/tags/keys/index.html index 204d79760..8537ab5d8 100644 --- a/guides/tags/keys/index.html +++ b/guides/tags/keys/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "keys" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "keys" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "keys"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

- - +

One doc tagged with "keys"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

\ No newline at end of file diff --git a/guides/tags/keystore/index.html b/guides/tags/keystore/index.html index 5346d6864..3452c6705 100644 --- a/guides/tags/keystore/index.html +++ b/guides/tags/keystore/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "keystore" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "keystore" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "keystore"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

- - +

One doc tagged with "keystore"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

\ No newline at end of file diff --git a/guides/tags/logs/index.html b/guides/tags/logs/index.html index fbaaa507e..54e7ed4ab 100644 --- a/guides/tags/logs/index.html +++ b/guides/tags/logs/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "logs" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "logs" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/guides/tags/ownership/index.html b/guides/tags/ownership/index.html index 49280e3f3..454a8fa5f 100644 --- a/guides/tags/ownership/index.html +++ b/guides/tags/ownership/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "ownership" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "ownership" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "ownership"

View All Tags
- - +

One doc tagged with "ownership"

View All Tags
\ No newline at end of file diff --git a/guides/tags/private-keys/index.html b/guides/tags/private-keys/index.html index faf2c5d54..1919ef1ae 100644 --- a/guides/tags/private-keys/index.html +++ b/guides/tags/private-keys/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "private keys" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "private keys" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "private keys"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

- - +

One doc tagged with "private keys"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

\ No newline at end of file diff --git a/guides/tags/public-keys/index.html b/guides/tags/public-keys/index.html index c13646cb8..e8d306aa5 100644 --- a/guides/tags/public-keys/index.html +++ b/guides/tags/public-keys/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "public keys" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "public keys" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "public keys"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

- - +

One doc tagged with "public keys"

View All Tags

Managing the keystore

The following will guide you through some of the fundamentals to help understand how to manage the key store at the very basics, and help you persist the key store identity, in any supported system you’re migrating to

\ No newline at end of file diff --git a/guides/tags/rebuild/index.html b/guides/tags/rebuild/index.html index 059e5623e..9bca8c467 100644 --- a/guides/tags/rebuild/index.html +++ b/guides/tags/rebuild/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "rebuild" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "rebuild" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "rebuild"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

- - +

One doc tagged with "rebuild"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

\ No newline at end of file diff --git a/guides/tags/setup/index.html b/guides/tags/setup/index.html index 305f433cc..9c344ee63 100644 --- a/guides/tags/setup/index.html +++ b/guides/tags/setup/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "setup" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "setup" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "setup"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

- - +

2 docs tagged with "setup"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

\ No newline at end of file diff --git a/guides/tags/transfer/index.html b/guides/tags/transfer/index.html index 1c7c215ce..c5083d95a 100644 --- a/guides/tags/transfer/index.html +++ b/guides/tags/transfer/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "transfer" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "transfer" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "transfer"

View All Tags
- - +

One doc tagged with "transfer"

View All Tags
\ No newline at end of file diff --git a/guides/tags/update/index.html b/guides/tags/update/index.html index 4bcdf935b..2a0477dc3 100644 --- a/guides/tags/update/index.html +++ b/guides/tags/update/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "update" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "update" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "update"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

- - +

One doc tagged with "update"

View All Tags

Updating Lightning

A step-by-step guide to update the Lightning CLI from source code and Service setup

\ No newline at end of file diff --git a/index.html b/index.html index d24fc3def..c8eaf502a 100644 --- a/index.html +++ b/index.html @@ -1,9 +1,9 @@ - + - -Fleek Network Docs | Decentralized Edge Platform + +Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-
- - +
\ No newline at end of file diff --git a/references/Docker/build-and-run-in-docker/index.html b/references/Docker/build-and-run-in-docker/index.html index e47937876..6ff943702 100644 --- a/references/Docker/build-and-run-in-docker/index.html +++ b/references/Docker/build-and-run-in-docker/index.html @@ -1,9 +1,9 @@ - + - -Build and run in Docker | Fleek Network Docs | Decentralized Edge Platform + +Build and run in Docker | Fleek Network Docs | Decentralized Edge Platform @@ -12,18 +12,59 @@ - - - + + + - + -
-

Clone the source code locally

tip

You have several ways of doing this:

  • Clone via HTTPS
  • Clone via SSH
  • Download via Github CLI
  • Download the zip package from the repository

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. -Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. -Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning

Change directory to Lightning source code

cd ~/fleek-network/lightning

Install Docker

tip

We're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems here.

sudo apt update

Next, install the required packages to let apt use packages over HTTPS:

sudo apt install \
apt-transport-https \
ca-certificates \
software-properties-common

Add the GPG key for the official Docker repository to your system:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"

Set to install from the Docker repo instead of the default Ubuntu repo:

apt-cache policy docker-ce

Finally, install Docker:

sudo apt install docker-ce

Once complete you should be able to run it via the CLI, as such:

docker -v

Here's the output (versions might differ a bit from the time of writing):

Docker version 24.0.6, build ed223bc

Docker setup verification

The following command's output will indicate if Docker's working correctly:

sudo docker run hello-world

You should get a "Hello from Docker!".

Check the Dockerfile

You should have changed directory to the projecto directory.

If you run a cat Dockerfile, you should have content similar to:

FROM rust:latest as builder
ARG PROFILE=release
WORKDIR /lightning

RUN apt-get update
RUN apt-get install -y \
build-essential \
cmake \
clang \
pkg-config \
libssl-dev \
gcc \
protobuf-compiler

...

Build the Docker image

Build the image named as lightning from our Dockerfile:

sudo docker build -t lightning -f ./Dockerfile .

Generate keys

sudo docker exec -it lightning-node lgtn keys generate

Docker Container

sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it lightning

View logs

To view the logs of a Docker container in real time, use the following command:

sudo docker logs -f lightning-node
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Clone the source code locally

+
tip

You have several ways of doing this:

    +
  • Clone via HTTPS
  • +
  • Clone via SSH
  • +
  • Download via Github CLI
  • +
  • Download the zip package from the repository
  • +

We recommend HTTPS because it is the easiest to set up in the wild, and by users who are new to all this. +Although, we strongly recommend using an SSH connection when interacting with GitHub. If you are to this and are interested read more about it here.

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git <DIRECTORY-NAME>

At time of writing, we are checking the branch name testnet-alpha-1 that corresponds to the testnet phase. +Here's an example of what it'd look like when sticking to the recommended path location:

git clone -b testnet-alpha-1 https://github.com/fleek-network/lightning.git ~/fleek-network/lightning
+

Change directory to Lightning source code

+
cd ~/fleek-network/lightning
+

Install Docker

+
tip

We're using Ubuntu Linux. You'll have to make the required tweaks for your preferred Linux Distro. Find the list of support operating systems here.

+
sudo apt update
+

Next, install the required packages to let apt use packages over HTTPS:

+
sudo apt install \
apt-transport-https \
ca-certificates \
software-properties-common
+

Add the GPG key for the official Docker repository to your system:

+
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+

Add the Docker repository to apt sources and update the package database with the Docker packages from the new added repository:

+
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable"
+

Set to install from the Docker repo instead of the default Ubuntu repo:

+
apt-cache policy docker-ce
+

Finally, install Docker:

+
sudo apt install docker-ce
+

Once complete you should be able to run it via the CLI, as such:

+
docker -v
+

Here's the output (versions might differ a bit from the time of writing):

+
Docker version 24.0.6, build ed223bc
+

Docker setup verification

+

The following command's output will indicate if Docker's working correctly:

+
sudo docker run hello-world
+

You should get a "Hello from Docker!".

+

Check the Dockerfile

+

You should have changed directory to the projecto directory.

+

If you run a cat Dockerfile, you should have content similar to:

+
FROM rust:latest as builder
ARG PROFILE=release
WORKDIR /lightning

RUN apt-get update
RUN apt-get install -y \
build-essential \
cmake \
clang \
pkg-config \
libssl-dev \
gcc \
protobuf-compiler

...
+

Build the Docker image

+

Build the image named as lightning from our Dockerfile:

+
sudo docker build -t lightning -f ./Dockerfile .
+

Generate keys

+
sudo docker exec -it lightning-node lgtn keys generate
+

Docker Container

+
sudo docker run \
-p 4200-4299:4200-4299 \
-p 4300-4399:4300-4399 \
--mount type=bind,source=$HOME/.lightning,target=/home/lgtn/.lightning \
--mount type=bind,source=/var/tmp,target=/var/tmp \
--name lightning-node \
-it lightning
+

View logs

+

To view the logs of a Docker container in real time, use the following command:

+
sudo docker logs -f lightning-node
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Docker/frequently-used-commands-for-docker-setup/index.html b/references/Docker/frequently-used-commands-for-docker-setup/index.html index 23362c929..b57006330 100644 --- a/references/Docker/frequently-used-commands-for-docker-setup/index.html +++ b/references/Docker/frequently-used-commands-for-docker-setup/index.html @@ -1,9 +1,9 @@ - + - -Frequently used commands for Docker setup | Fleek Network Docs | Decentralized Edge Platform + +Frequently used commands for Docker setup | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,64 @@ - - - + + + - + -
-

TL;DR

Most assisted processes are available through the get.fleek.network command, where you can select to install, do a health check amongst others.

To access the menu options run the command in the shell prompt:

curl https://get.fleek.network | bash
tip

For Native setup users read the corresponding version in the section Frequently Used Commands for Native Setup

Systemctl Service Management

Enable

sudo systemctl enable docker-lightning

Disable

sudo systemctl enable docker-lightning

Start

sudo systemctl start docker-lightning

Stop

sudo systemctl stop docker-lightning

Restart

sudo systemctl restart docker-lightning

Status

sudo systemctl status docker-lightning

Lightning CLI via Docker

Show keys for user config

Show the keys by running the sub-commands keys show and declaring the configuration file location (in-docker pathname):

sudo docker exec -it lightning-node lgtn -c /home/lgtn/.lightning/config.toml keys show

Diagnostic tools

Extended verification health check

The command show be executed from host and not in-Docker container.

curl -sS https://get.fleek.network/healthcheck | bash

Health status

The command show be executed from host and not in-Docker container.

curl -w "\n" localhost:4230/health

Node details

The command show be executed from host and not in-Docker container.

curl -sS https://get.fleek.network/node_details | bash

Analyzing Logs

Standard output

tail -f /var/log/lightning/output.log

Standard error

tail -f /var/log/lightning/diagnostic.log

Docker Container Logs

sudo docker logs -f lightning-node

Interactive Container

Execute Bash

sudo docker exec -it lightning-node bash

Docker

List Containers

sudo docker ps -a

Start Container

sudo docker start <CONTAINER ID or CONTAINER NAME>

Stop Container

sudo docker stop <CONTAINER ID or CONTAINER NAME>

Remove Container

sudo docker rm <CONTAINER ID or CONTAINER NAME>
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

TL;DR

+

Most assisted processes are available through the get.fleek.network command, where you can select to install, do a health check amongst others.

+

To access the menu options run the command in the shell prompt:

+
curl https://get.fleek.network | bash
+
tip

For Native setup users read the corresponding version in the section Frequently Used Commands for Native Setup

+

Systemctl Service Management

+

Enable

+
sudo systemctl enable docker-lightning
+

Disable

+
sudo systemctl enable docker-lightning
+

Start

+
sudo systemctl start docker-lightning
+

Stop

+
sudo systemctl stop docker-lightning
+

Restart

+
sudo systemctl restart docker-lightning
+

Status

+
sudo systemctl status docker-lightning
+

Lightning CLI via Docker

+

Show keys for user config

+

Show the keys by running the sub-commands keys show and declaring the configuration file location (in-docker pathname):

+
sudo docker exec -it lightning-node lgtn -c /home/lgtn/.lightning/config.toml keys show
+

Diagnostic tools

+

Extended verification health check

+

The command show be executed from host and not in-Docker container.

+
curl -sS https://get.fleek.network/healthcheck | bash
+

Health status

+

The command show be executed from host and not in-Docker container.

+
curl -w "\n" localhost:4230/health
+

Node details

+

The command show be executed from host and not in-Docker container.

+
curl -sS https://get.fleek.network/node_details | bash
+

Analyzing Logs

+

Standard output

+
tail -f /var/log/lightning/output.log
+

Standard error

+
tail -f /var/log/lightning/diagnostic.log
+

Docker Container Logs

+
sudo docker logs -f lightning-node
+

Interactive Container

+

Execute Bash

+
sudo docker exec -it lightning-node bash
+

Docker

+

List Containers

+
sudo docker ps -a
+

Start Container

+
sudo docker start <CONTAINER ID or CONTAINER NAME>
+

Stop Container

+
sudo docker stop <CONTAINER ID or CONTAINER NAME>
+

Remove Container

+
sudo docker rm <CONTAINER ID or CONTAINER NAME>
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Docker/uninstall-docker-setup/index.html b/references/Docker/uninstall-docker-setup/index.html index f5464ee5a..64bc7dc1a 100644 --- a/references/Docker/uninstall-docker-setup/index.html +++ b/references/Docker/uninstall-docker-setup/index.html @@ -1,9 +1,9 @@ - + - -Uninstall Docker Setup | Fleek Network Docs | Decentralized Edge Platform + +Uninstall Docker Setup | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,59 @@ - - - + + + - + -
-

Remove the source code locally

For users who build the Docker image from source-code.

Assuming the default installation source-code path ~/fleek-network/lightning, run the command:

rm -rf ~/fleek-network/lightning

If you have a custom path, you need to change the pathname to the correct path you have selected during your custom install.

Stop the Docker service

The Fleek Network recommends systemctl to manage the services, either natively or docker. It's an interface that is easily to translate across the setups, and to communicate to the users in a common manner.

If you have followed the recommendations, you should have the Systemd Unit Service setup.

To stop the service run the command:

sudo systemctl stop docker-lightning

Confirm the Docker service status

Check the status by:

sudo systemctl status docker-lightning

Disable the service by:

sudo systemctl disable docker-lightning
tip

Once stop, you can run the following command to confirm it is not running. If you have used the recommended container name lightning-node the command you'd have to execute is:

You can check the Docker container isn't running by running the following command. Notice that we are assuming that your docker container name is the default lightning-node. If you have customized the name use the correct selected name:

sudo docker container inspect -f '{{.State.Running}}' lightning-node

Reload the daemon

Reload the daemon by:

sudo systemctl daemon-reload

Remove the Systemd Service Unit file

If you have followed the recommendations, you should find the Systemd Service Unit file at:

/etc/systemd/system/docker-lightning

To remove the file, run the command:

sudo rm -f /etc/systemd/system/docker-lightning

Delete the Docker image

For our example, we'll assume that the Docker image for Fleek Network is the default lightning-node. If you have created the image under a different name, change in accordance to your preference.

Delete the image by running the following command:

sudo docker rmi $(docker images | grep 'lightning-node')

To learn more about the docker image remove command, visit the official documentation here

Uninstall Docker

Uninstalling Docker should only be performed if you don't need in your system. If you already had Docker for some purpose, you should not have to uninstall it.

Visit the Docker official documentation site for uninstall instructions here.

Manage keys

The configuration directory of Fleek Network is in the host machine file system. This is the directory where you can find the config.toml, keystore for the public keys, amongst others.

/home/<USERNAME>/.lightning

For example, for the user lgtn the location of these files is:

/home/lgtn/.lightning
warning

The directory can be deleted but have in mind that the keystore is located here. If you need to backup the keystore, be careful as this is not possible to recover by anyone. The keys are your responsibility.

To learn more about the keystore read the guide managing the keystore.

If you are happy to delete the directory, run the following command by replacing the <USERNAME> by yours:

rm -rf /home/<USERNAME>/.lightning

Remove the logs

The Docker container generates output to stdout and stderr. All the content is stored in the location:

/var/log/lightning

To completely remove the directory run the command:

sudo rm -rf /var/log/lightning
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Remove the source code locally

+

For users who build the Docker image from source-code.

+

Assuming the default installation source-code path ~/fleek-network/lightning, run the command:

+
rm -rf ~/fleek-network/lightning
+

If you have a custom path, you need to change the pathname to the correct path you have selected during your custom install.

+

Stop the Docker service

+

The Fleek Network recommends systemctl to manage the services, either natively or docker. It's an interface that is easily to translate across the setups, and to communicate to the users in a common manner.

+

If you have followed the recommendations, you should have the Systemd Unit Service setup.

+

To stop the service run the command:

+
sudo systemctl stop docker-lightning
+

Confirm the Docker service status

+

Check the status by:

+
sudo systemctl status docker-lightning
+

Disable the service by:

+
sudo systemctl disable docker-lightning
+
tip

Once stop, you can run the following command to confirm it is not running. If you have used the recommended container name lightning-node the command you'd have to execute is:

You can check the Docker container isn't running by running the following command. Notice that we are assuming that your docker container name is the default lightning-node. If you have customized the name use the correct selected name:

sudo docker container inspect -f '{{.State.Running}}' lightning-node
+

Reload the daemon

+

Reload the daemon by:

+
sudo systemctl daemon-reload
+

Remove the Systemd Service Unit file

+

If you have followed the recommendations, you should find the Systemd Service Unit file at:

+
/etc/systemd/system/docker-lightning
+

To remove the file, run the command:

+
sudo rm -f /etc/systemd/system/docker-lightning
+

Delete the Docker image

+

For our example, we'll assume that the Docker image for Fleek Network is the default lightning-node. If you have created the image under a different name, change in accordance to your preference.

+

Delete the image by running the following command:

+
sudo docker rmi $(docker images | grep 'lightning-node')
+

To learn more about the docker image remove command, visit the official documentation here

+

Uninstall Docker

+

Uninstalling Docker should only be performed if you don't need in your system. If you already had Docker for some purpose, you should not have to uninstall it.

+

Visit the Docker official documentation site for uninstall instructions here.

+

Manage keys

+

The configuration directory of Fleek Network is in the host machine file system. This is the directory where you can find the config.toml, keystore for the public keys, amongst others.

+
/home/<USERNAME>/.lightning
+

For example, for the user lgtn the location of these files is:

+
/home/lgtn/.lightning
+
warning

The directory can be deleted but have in mind that the keystore is located here. If you need to backup the keystore, be careful as this is not possible to recover by anyone. The keys are your responsibility.

+

To learn more about the keystore read the guide managing the keystore.

+

If you are happy to delete the directory, run the following command by replacing the <USERNAME> by yours:

+
rm -rf /home/<USERNAME>/.lightning
+

Remove the logs

+

The Docker container generates output to stdout and stderr. All the content is stored in the location:

+
/var/log/lightning
+

To completely remove the directory run the command:

+
sudo rm -rf /var/log/lightning
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/backing-up-the-keystore/index.html b/references/Lightning CLI/backing-up-the-keystore/index.html index a3f237a4f..e6cfa4103 100644 --- a/references/Lightning CLI/backing-up-the-keystore/index.html +++ b/references/Lightning CLI/backing-up-the-keystore/index.html @@ -1,9 +1,9 @@ - + - -Backing up the keystore | Fleek Network Docs | Decentralized Edge Platform + +Backing up the keystore | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,50 @@ - - - + + + - + -
-
caution

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Keystore pathname

The default location for the keystore is in the user home. The $HOME or ~ refers to the user home, as such consider the logged-in username.

To Check the user you are logged in with:

whoami

The default location for the keystore is:

$HOME/.lightning/keystore

Configuration file settings

The config.toml should have some and more of the following properties and values that are used to locate crucial files, such as the consensus and node keys of the keystore.

Here's an incomplete example of how the config.toml looks like:

[BLANK]
...

[application]
db_path = "~/.lightning/data/app_db"
...

[consensus]
store_path = "~/.lightning/data/narwhal_store"
...

[fsstore]
root = "~/.lightning/blockstore"
...

[resolver]
store_path = "~/.lightning/data/resolver_store"
...

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
...

If you've followed the installation recommendations, it's very likely that you'll have the username path defined at the base of the pathnames declared in the properties, such as the following except instead of <USERNAME> you'll have your username:

[signer]
consensus_key_path = "/home/<USERNAME>/.lightning/keystore/consensus.pem"
node_key_path = "/home/<USERNAME>/.lightning/keystore/node.pem"

The config.toml if loaded on Lightning node process runtime, will pick the desired paths declared in the file.

Loading the configuration file on runtime

Use the configuration flag -c to pass the configuration config.toml path:

lgtn -c /home/<USERNAME>/.lightning/config.toml run

Replace the <USERNAME> with the correct username, where the config is located.

Executing the subcommand run without the configuration flag -c, doesn't mean that it'll locate the desired config.toml, as it'll default to $HOME/.lightning/config.toml, e.g. if you were logged in with root, that'd be /root/.lightning/config.toml.

Low security backup

To zip and encrypt the $HOME/.lightning/keystore directory run:

# It'll prompt for password (remember)
zip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore

To unzip and decrypt the keystore.zip.enc, you'd run:

# It'll prompt for password (recall)
unzip keystore.zip.enc -d $HOME/.lightning/keystore

Higher security

Create a tarbar by executing:

tar -cf "keystore.tar" $HOME/.lightning/keystore

The encryption command is:

sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar

To decrypt the keystore.tar.asc file, enter:

sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc

Create a temporary directory to extract the tar archive with the original full pathname.

mkdir $HOME/tar_keystore_extract

Now, run the command to extract to the target directory, as follows:

tar -xf keystore.tar -C $HOME/tar_keystore_extract

Locate the extracted files in $HOME/tar_keystore_extract, which should look like $HOME/tar_keystore/home/<USERNAME>/.lightning/keystore

For a more in depth or step-by-step instructions read the guide managing the keystore.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +
caution

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

+

Keystore pathname

+

The default location for the keystore is in the user home. The $HOME or ~ refers to the user home, as such consider the logged-in username.

+

To Check the user you are logged in with:

+
whoami
+

The default location for the keystore is:

+
$HOME/.lightning/keystore
+

Configuration file settings

+

The config.toml should have some and more of the following properties and values that are used to locate crucial files, such as the consensus and node keys of the keystore.

+

Here's an incomplete example of how the config.toml looks like:

+
[BLANK]
...

[application]
db_path = "~/.lightning/data/app_db"
...

[consensus]
store_path = "~/.lightning/data/narwhal_store"
...

[fsstore]
root = "~/.lightning/blockstore"
...

[resolver]
store_path = "~/.lightning/data/resolver_store"
...

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
...
+

If you've followed the installation recommendations, it's very likely that you'll have the username path defined at the base of the pathnames declared in the properties, such as the following except instead of <USERNAME> you'll have your username:

+
[signer]
consensus_key_path = "/home/<USERNAME>/.lightning/keystore/consensus.pem"
node_key_path = "/home/<USERNAME>/.lightning/keystore/node.pem"
+

The config.toml if loaded on Lightning node process runtime, will pick the desired paths declared in the file.

+

Loading the configuration file on runtime

+

Use the configuration flag -c to pass the configuration config.toml path:

+
lgtn -c /home/<USERNAME>/.lightning/config.toml run
+

Replace the <USERNAME> with the correct username, where the config is located.

+

Executing the subcommand run without the configuration flag -c, doesn't mean that it'll locate the desired config.toml, as it'll default to $HOME/.lightning/config.toml, e.g. if you were logged in with root, that'd be /root/.lightning/config.toml.

+

Low security backup

+

To zip and encrypt the $HOME/.lightning/keystore directory run:

+
# It'll prompt for password (remember)
zip --encrypt -r keystore.zip.enc $HOME/.lightning/keystore
+

To unzip and decrypt the keystore.zip.enc, you'd run:

+
# It'll prompt for password (recall)
unzip keystore.zip.enc -d $HOME/.lightning/keystore
+

Higher security

+

Create a tarbar by executing:

+
tar -cf "keystore.tar" $HOME/.lightning/keystore
+

The encryption command is:

+
sudo gpg -a --symmetric --cipher-algo AES256 keystore.tar
+

To decrypt the keystore.tar.asc file, enter:

+
sudo gpg -a --output keystore.tar --decrypt keystore.tar.asc
+

Create a temporary directory to extract the tar archive with the original full pathname.

+
mkdir $HOME/tar_keystore_extract
+

Now, run the command to extract to the target directory, as follows:

+
tar -xf keystore.tar -C $HOME/tar_keystore_extract
+

Locate the extracted files in $HOME/tar_keystore_extract, which should look like $HOME/tar_keystore/home/<USERNAME>/.lightning/keystore

+

For a more in depth or step-by-step instructions read the guide managing the keystore.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/error-building-on-arm64/index.html b/references/Lightning CLI/error-building-on-arm64/index.html index 0ad23f930..69fa1ff99 100644 --- a/references/Lightning CLI/error-building-on-arm64/index.html +++ b/references/Lightning CLI/error-building-on-arm64/index.html @@ -1,9 +1,9 @@ - + - -Error building on ARM64 | Fleek Network Docs | Decentralized Edge Platform + +Error building on ARM64 | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,30 @@ - - - + + + - + -
-

Building on the ARM64 (aarch64)

ARM64 platform has its own specifics, and currently consists of requiring gcc:

sudo apt install gcc

On cargo build, the error error: linking with cc failed: exit status: 1 occurs, as demonstrated in the output below:

error: linking with `cc` failed: exit status: 1
# ... wall of text
# ... the key error is ↴
= note: /usr/bin/ld: /home/ubuntu/fleek-network/lightning/target/release/deps/libblake3-a927e9b36d695ff0.rlib(blake3-a927e9b36d695ff0.blake3.91a53ea05847a7a5-cgu.0.rcgu.o): in function `blake3_compress_in_place_portable':
/home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/blake3-1.4.1/src/ffi_neon.rs:45: multiple definition of `blake3_compress_in_place_portable'; /home/ubuntu/fleek-network/lightning/target/release/deps/libfleek_blake3-990c4c0cfb4eaa87.rlib(fleek_blake3-990c4c0cfb4eaa87.fleek_blake3.4f11e9370af31773-cgu.0.rcgu.o):/home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/fleek-blake3-1.4.1/src/ffi_neon.rs:45: first defined here

As a result of the research by the community member ryssroad, the following solution was shared.

Open the cargo.toml file in ~/fleek-network/lightning/Cargo.toml and find the lto key.

lto = true

Change the lto key value from true to thin:

...
[profile.release]
# currently enabled, may increase build time, but runtime faster, can set to `"thin"`.
lto = "thin"

Set RUSTFLAGS on build, as follows:

RUSTFLAGS="-Clink-arg=-Wl,--allow-multiple-definition" cargo +stable build --release 

Once the build completes, you should find the generated binary lightning-node under the directory ~/fleek-network/lightning/target/release/lightning-node.

As an example, execute:

~/fleek-network/lightning/target/release/lightning-node help

To find the help output:

Usage: lightning-node [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version
Road aka @road
Road aka @roadCommunity memberJoin our community on discord!
- - +

Building on the ARM64 (aarch64)

+

ARM64 platform has its own specifics, and currently consists of requiring gcc:

+
sudo apt install gcc
+

On cargo build, the error error: linking with cc failed: exit status: 1 occurs, as demonstrated in the output below:

+
error: linking with `cc` failed: exit status: 1
# ... wall of text
# ... the key error is ↴
= note: /usr/bin/ld: /home/ubuntu/fleek-network/lightning/target/release/deps/libblake3-a927e9b36d695ff0.rlib(blake3-a927e9b36d695ff0.blake3.91a53ea05847a7a5-cgu.0.rcgu.o): in function `blake3_compress_in_place_portable':
/home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/blake3-1.4.1/src/ffi_neon.rs:45: multiple definition of `blake3_compress_in_place_portable'; /home/ubuntu/fleek-network/lightning/target/release/deps/libfleek_blake3-990c4c0cfb4eaa87.rlib(fleek_blake3-990c4c0cfb4eaa87.fleek_blake3.4f11e9370af31773-cgu.0.rcgu.o):/home/ubuntu/.cargo/registry/src/index.crates.io-6f17d22bba15001f/fleek-blake3-1.4.1/src/ffi_neon.rs:45: first defined here
+

As a result of the research by the community member ryssroad, the following solution was shared.

+

Open the cargo.toml file in ~/fleek-network/lightning/Cargo.toml and find the lto key.

+
lto = true
+

Change the lto key value from true to thin:

+
...
[profile.release]
# currently enabled, may increase build time, but runtime faster, can set to `"thin"`.
lto = "thin"
+

Set RUSTFLAGS on build, as follows:

+
RUSTFLAGS="-Clink-arg=-Wl,--allow-multiple-definition" cargo +stable build --release 
+

Once the build completes, you should find the generated binary lightning-node under the directory ~/fleek-network/lightning/target/release/lightning-node.

+

As an example, execute:

+
~/fleek-network/lightning/target/release/lightning-node help
+

To find the help output:

+
Usage: lightning-node [OPTIONS] <COMMAND>

Commands:
run Start the node
keys Handle keys
print-config Print the loaded configuration
help Print this message or the help of the given subcommand(s)

Options:
-c, --config <CONFIG> Path to the toml configuration file [default: ~/.lightning/config.toml]
--with-mock-consensus Determines that we should be using the mock consensus backend
-v... Increases the level of verbosity (the max level is -vvv)
--log-location Print code location on console logs
-h, --help Print help
-V, --version Print version
+
Road aka @road
Road aka @roadCommunity memberJoin our community on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/index.html b/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/index.html index 3c31ea732..b42c49b97 100644 --- a/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/index.html +++ b/references/Lightning CLI/error-linking-with-cc-failed-exist-status-1/index.html @@ -1,9 +1,9 @@ - + - -Error linking with cc | Fleek Network Docs | Decentralized Edge Platform + +Error linking with cc | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,28 @@ - - - + + + - + -
-

Check if CPU is supported

uname -i
WARNING

Given the CPU requirements, currently we're mainly supporting GenuineIntel and there have been reports of failure to build the binary on AMD. The ARM64 is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference error building on ARM64.

Any contribution or feedback to provide support is appreciated. Feel free to let us know on our Discord channel.

Linking with cc error

A user who finds the error linking with cc failed, will have to install the required dependencies.

error: linking with `cc` failed: exit status: 1
error: could not compile `fleek-service-ping-example` (lib) due to previous error

Update

sudo apt-get update

Install gcc:

sudo apt-get install gcc

Remove previous installation files

You can re-run the installation process. If you are using the assisted installer, it'll complain that the source code directory already exists. Since you've probably cloned the source code repository locally, you'll have to remove it manually. If you need help, find the instructions in the reference.

Run the installation script

curl https://get.fleek.network | bash

Alternatively, read the manual installation instructions for more information.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Check if CPU is supported

+
uname -i
+
WARNING

Given the CPU requirements, currently we're mainly supporting GenuineIntel and there have been reports of failure to build the binary on AMD. The ARM64 is a different architecture, thus not supported, but there has been some community contributions in that regard, find it in the reference error building on ARM64.

Any contribution or feedback to provide support is appreciated. Feel free to let us know on our Discord channel.

+

Linking with cc error

+

A user who finds the error linking with cc failed, will have to install the required dependencies.

+
error: linking with `cc` failed: exit status: 1
error: could not compile `fleek-service-ping-example` (lib) due to previous error
+

Update

+
sudo apt-get update
+

Install gcc:

+
sudo apt-get install gcc
+

Remove previous installation files

+

You can re-run the installation process. If you are using the assisted installer, it'll complain that the source code directory already exists. Since you've probably cloned the source code repository locally, you'll have to remove it manually. If you need help, find the instructions in the reference.

+

Run the installation script

+
curl https://get.fleek.network | bash
+

Alternatively, read the manual installation instructions for more information.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/file-permissions-and-ownership/index.html b/references/Lightning CLI/file-permissions-and-ownership/index.html index 720ffecf3..58f72ec7d 100644 --- a/references/Lightning CLI/file-permissions-and-ownership/index.html +++ b/references/Lightning CLI/file-permissions-and-ownership/index.html @@ -1,9 +1,9 @@ - + - -File permissions and Ownership | Fleek Network Docs | Decentralized Edge Platform + +File permissions and Ownership | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,80 @@ - - - + + + - + -
-

Ownership

The user who installs the Fleek Network Lightning CLI matters, as it can own or delegate ownership of the dependencies and applications being installed.

For example, if you have followed the install document recommendations and have:

  • Created a user lgtn
  • Switched to the user lgtn
  • Executed the installation process as lgtn
note

The username can be anything, we are using the term lgtn as the example provided throughout our documentation. Select your username in accordance to your preferences.

You'll find that it owns the following directories under the user home (/home/lgtn):

drwxr-x--- 6 lgtn lgtn  4096 Sep 12 10:27 .
drwxr-xr-x 3 root root 4096 Sep 11 12:28 ..
drwxrwxr-x 5 lgtn lgtn 4096 Sep 11 12:29 .cargo
drwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning
drwxrwxr-x 6 lgtn lgtn 4096 Sep 11 12:29 .rustup
drwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network

Above, we have the listing properties set as drwxrwxr-x and the ownership lgtn:lgtn.

On the other hand, if you have done the installation process as root superuser, you'll find that:

  • The location of the directories and files goes under the /root pathname
  • The ownership is set to root:root

Learn more about file permissions from the Linux Foundation.

To learn more about file permission on Linux, read the Understanding Linux File Permissions.

Using sudo to delegate permissions

Consider file ownership and permissions to understand where the keystore is located. Take close attention when executing commands as an admin–with or without super user (root) or sudo.

If a command is executed without sudo then the generated output goes onto the user home.

lgtn keys generate

Resulting in having the keystore saved onto /home/username/.lightning/keystore.

On the other hand, if a command is executed with sudo then the generated output is delegated to root directory.

sudo lgtn keys generate

Resulting in having the keystore saved onto /root/.lightning/keystore.

User $HOME directory

The home directory is a directory that contains the personal files of a particular user of the system. On Linux, the $HOME environment variable is set by the login program, which sets the user `$HOME`` accordingly. A user's home goes by the username, the user who's logged in.

For this reason, a user can change to the home directory by executing:

cd $HOME

A shorthand allows a user to refer to their home directory simply as ~ (tilde), as follows:

cd ~
tip

We can find that the HOME or ~ (tilde) is highly dependent on the user who's logged in. Since we know that the user might delegate to root by the usage of sudo, this can help troubleshoot and explain the location of our files e.g. the keystore. In the section Set the locations of the user paths, we learn how to define the location of our user configuration paths to avoid confusion. By doing it we ensure that when running the service, the service picks the correct configuration paths for our user.

To learn more about the user $HOME directory read the wikipedia Home directory document.

Set the locations of the user paths

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

Here's an example of how to do it using sed:

sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

For example, if your username is lgtn that'd look like this:

sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

cat /home/lgtn/.lightning/config.toml

For our example where we opted in for the username lgtn that would look like:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

Set the configuration flag -c on the service unit file

The following section assumes that a System service unit has been declared, and you're using systemctl to control the service, as described in our Systemd Service Setup install section.

Open and edit the /etc/systemd/system/lightning.service file.

1) Replace <USERNAME> with YOUR username. For example, in the documentation we use the username lgtn, which means we'd replace <USERNAME> with lgtn.

2) Make sure that the ExecStart is set correctly, including the -c

[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/<USERNAME>/.lightning/config.toml run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target

For our example, as the username lgtn it would look like:

[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=/var/tmp

[Install]
WantedBy=multi-user.target

When complete make sure the file is saved and the systemctl daemon is reloaded, as follows:

sudo systemctl daemon-reload

Consequently, when a user manages the service via the systemctl, the Lightning CLI process will read the configuration file settings provided above. It includes the location of the user preferences, such as the keystore location amongst others, preventing confusion regardless of root delegation.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Ownership

+

The user who installs the Fleek Network Lightning CLI matters, as it can own or delegate ownership of the dependencies and applications being installed.

+

For example, if you have followed the install document recommendations and have:

+
    +
  • Created a user lgtn
  • +
  • Switched to the user lgtn
  • +
  • Executed the installation process as lgtn
  • +
+
note

The username can be anything, we are using the term lgtn as the example provided throughout our documentation. Select your username in accordance to your preferences.

+

You'll find that it owns the following directories under the user home (/home/lgtn):

+
drwxr-x--- 6 lgtn lgtn  4096 Sep 12 10:27 .
drwxr-xr-x 3 root root 4096 Sep 11 12:28 ..
drwxrwxr-x 5 lgtn lgtn 4096 Sep 11 12:29 .cargo
drwxrwxr-x 5 lgtn lgtn 4096 Sep 11 15:25 .lightning
drwxrwxr-x 6 lgtn lgtn 4096 Sep 11 12:29 .rustup
drwxrwxr-x 3 lgtn lgtn 4096 Sep 11 12:28 fleek-network
+

Above, we have the listing properties set as drwxrwxr-x and the ownership lgtn:lgtn.

+

On the other hand, if you have done the installation process as root superuser, you'll find that:

+
    +
  • The location of the directories and files goes under the /root pathname
  • +
  • The ownership is set to root:root
  • +
+

Learn more about file permissions from the Linux Foundation.

+

To learn more about file permission on Linux, read the Understanding Linux File Permissions.

+

Using sudo to delegate permissions

+

Consider file ownership and permissions to understand where the keystore is located. Take close attention when executing commands as an admin–with or without super user (root) or sudo.

+

If a command is executed without sudo then the generated output goes onto the user home.

+
lgtn keys generate
+

Resulting in having the keystore saved onto /home/username/.lightning/keystore.

+

On the other hand, if a command is executed with sudo then the generated output is delegated to root directory.

+
sudo lgtn keys generate
+

Resulting in having the keystore saved onto /root/.lightning/keystore.

+

User $HOME directory

+

The home directory is a directory that contains the personal files of a particular user of the system. On Linux, the $HOME environment variable is set by the login program, which sets the user `$HOME`` accordingly. A user's home goes by the username, the user who's logged in.

+

For this reason, a user can change to the home directory by executing:

+
cd $HOME
+

A shorthand allows a user to refer to their home directory simply as ~ (tilde), as follows:

+
cd ~
+
tip

We can find that the HOME or ~ (tilde) is highly dependent on the user who's logged in. Since we know that the user might delegate to root by the usage of sudo, this can help troubleshoot and explain the location of our files e.g. the keystore. In the section Set the locations of the user paths, we learn how to define the location of our user configuration paths to avoid confusion. By doing it we ensure that when running the service, the service picks the correct configuration paths for our user.

+

To learn more about the user $HOME directory read the wikipedia Home directory document.

+

Set the locations of the user paths

+

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

+

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

+

Here's an example of how to do it using sed:

+
sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
+
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

+

For example, if your username is lgtn that'd look like this:

+
sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
+

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

+
cat /home/lgtn/.lightning/config.toml
+

For our example where we opted in for the username lgtn that would look like:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

+

Set the configuration flag -c on the service unit file

+

The following section assumes that a System service unit has been declared, and you're using systemctl to control the service, as described in our Systemd Service Setup install section.

+

Open and edit the /etc/systemd/system/lightning.service file.

+
    +
  1. +

    Replace <USERNAME> with YOUR username. For example, in the documentation we use the username lgtn, which means we'd replace <USERNAME> with lgtn.

    +
  2. +
  3. +

    Make sure that the ExecStart is set correctly, including the -c

    +
  4. +
+
[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/<USERNAME>/.lightning/config.toml run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
+

For our example, as the username lgtn it would look like:

+
[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/lgtn/.lightning/config.toml run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=/var/tmp

[Install]
WantedBy=multi-user.target
+

When complete make sure the file is saved and the systemctl daemon is reloaded, as follows:

+
sudo systemctl daemon-reload
+

Consequently, when a user manages the service via the systemctl, the Lightning CLI process will read the configuration file settings provided above. It includes the location of the user preferences, such as the keystore location amongst others, preventing confusion regardless of root delegation.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/frequently-used-commands-for-native-setup/index.html b/references/Lightning CLI/frequently-used-commands-for-native-setup/index.html index 8df2812f1..6365c4379 100644 --- a/references/Lightning CLI/frequently-used-commands-for-native-setup/index.html +++ b/references/Lightning CLI/frequently-used-commands-for-native-setup/index.html @@ -1,9 +1,9 @@ - + - -Frequently used commands for Native setup | Fleek Network Docs | Decentralized Edge Platform + +Frequently used commands for Native setup | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,47 @@ - - - + + + - + -
-

TL;DR

Most assisted processes are available through the get.fleek.network command, where you can select to install, do a health check amongst others.

To access the menu options run the command in the shell prompt:

curl https://get.fleek.network | bash
tip

For Docker setup users read the corresponding version in the section Frequently Used Commands for Docker Setup

Systemctl Service Management

Enable

sudo systemctl enable lightning

Disable

sudo systemctl enable lightning

Start

sudo systemctl start lightning

Stop

sudo systemctl stop lightning

Restart

sudo systemctl restart lightning

Status

sudo systemctl status lightning

Lightning CLI

Show keys for user config

Show the keys by running the sub-commands keys show and declaring the configuration file location:

lgtn -c /home/<USERNAME>/.lightning/config.toml keys show

Diagnostic tools

Extended verification health check

curl -sS https://get.fleek.network/healthcheck | bash

Health status

curl -w "\n" localhost:4230/health

Node details

curl -sS https://get.fleek.network/node_details | bash

Analyzing Logs

Standard output

tail -f /var/log/lightning/output.log

Standard error

tail -f /var/log/lightning/diagnostic.log
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

TL;DR

+

Most assisted processes are available through the get.fleek.network command, where you can select to install, do a health check amongst others.

+

To access the menu options run the command in the shell prompt:

+
curl https://get.fleek.network | bash
+
tip

For Docker setup users read the corresponding version in the section Frequently Used Commands for Docker Setup

+

Systemctl Service Management

+

Enable

+
sudo systemctl enable lightning
+

Disable

+
sudo systemctl enable lightning
+

Start

+
sudo systemctl start lightning
+

Stop

+
sudo systemctl stop lightning
+

Restart

+
sudo systemctl restart lightning
+

Status

+
sudo systemctl status lightning
+

Lightning CLI

+

Show keys for user config

+

Show the keys by running the sub-commands keys show and declaring the configuration file location:

+
lgtn -c /home/<USERNAME>/.lightning/config.toml keys show
+

Diagnostic tools

+

Extended verification health check

+
curl -sS https://get.fleek.network/healthcheck | bash
+

Health status

+
curl -w "\n" localhost:4230/health
+

Node details

+
curl -sS https://get.fleek.network/node_details | bash
+

Analyzing Logs

+

Standard output

+
tail -f /var/log/lightning/output.log
+

Standard error

+
tail -f /var/log/lightning/diagnostic.log
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/keys-not-found/index.html b/references/Lightning CLI/keys-not-found/index.html index b0f7e4717..f586797d6 100644 --- a/references/Lightning CLI/keys-not-found/index.html +++ b/references/Lightning CLI/keys-not-found/index.html @@ -1,9 +1,9 @@ - + - -Keys not found | Fleek Network Docs | Decentralized Edge Platform + +Keys not found | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,18 @@ - - - + + + - + -
-

Node key does not exist

When watching the Fleek Network Lightning service log output, you find the "Node key does not exist" message placed recursively. As follows:

thread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

If you haven't deleted the keystore and can locate it, it's due to how the service is being run. As a user can delegate (sudo) the execution of the process to root, the location of the keystore differs on runtime.

To learn more about how file permissions and ownership work, you're advised to read the reference document here.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Node key does not exist

+

When watching the Fleek Network Lightning service log output, you find the "Node key does not exist" message placed recursively. As follows:

+
thread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
thread 'main' panicked at 'Node key does not exist. Use CLI to generate keys.', core/node/src/testnet_sync.rs:126:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+

If you haven't deleted the keystore and can locate it, it's due to how the service is being run. As a user can delegate (sudo) the execution of the process to root, the location of the keystore differs on runtime.

+

To learn more about how file permissions and ownership work, you're advised to read the reference document here.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/node-secret-key-does-not-exist/index.html b/references/Lightning CLI/node-secret-key-does-not-exist/index.html index cc16537de..a83ef9340 100644 --- a/references/Lightning CLI/node-secret-key-does-not-exist/index.html +++ b/references/Lightning CLI/node-secret-key-does-not-exist/index.html @@ -1,9 +1,9 @@ - + - -Node secret key does not exist | Fleek Network Docs | Decentralized Edge Platform + +Node secret key does not exist | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,19 @@ - - - + + + - + -
-

Node secret key does not exist

When watching the Fleek Network Lightning service log output, you find the "Node secret key does not exist" message as follows:

Error: Could not start the node.

Caused by:
Node Initialization failed: InitializationFailed(Tag<lightning_signer::Signer<lightning_node::FinalTypes> as SignerInterface>, Node secret key does not exist. Use the CLI to generate keys.)

Edit the ~/.lightning/config.toml to include the full location for the PEM files. For example, let's say that it's located under /home/skywalker that'd look like:

[signer]
consensus_key_path = "/home/skywalker/.lightning/keystore/consensus.pem"
node_key_path = "/home/skywalker/.lightning/keystore/node.pem"

To learn more about how file permissions and ownership work, you're advised to read the reference document here.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Node secret key does not exist

+

When watching the Fleek Network Lightning service log output, you find the "Node secret key does not exist" message as follows:

+
Error: Could not start the node.

Caused by:
Node Initialization failed: InitializationFailed(Tag<lightning_signer::Signer<lightning_node::FinalTypes> as SignerInterface>, Node secret key does not exist. Use the CLI to generate keys.)
+

Edit the ~/.lightning/config.toml to include the full location for the PEM files. For example, let's say that it's located under /home/skywalker that'd look like:

+
[signer]
consensus_key_path = "/home/skywalker/.lightning/keystore/consensus.pem"
node_key_path = "/home/skywalker/.lightning/keystore/node.pem"
+

To learn more about how file permissions and ownership work, you're advised to read the reference document here.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/permission-denied-os-error-13/index.html b/references/Lightning CLI/permission-denied-os-error-13/index.html index 15f000707..cfe9c61b8 100644 --- a/references/Lightning CLI/permission-denied-os-error-13/index.html +++ b/references/Lightning CLI/permission-denied-os-error-13/index.html @@ -1,9 +1,9 @@ - + - -Permission denied (os error 13) | Fleek Network Docs | Decentralized Edge Platform + +Permission denied (os error 13) | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,34 @@ - - - + + + - + -
-

Ownership and file permissions

When running the Lightning CLI, the user who's in control can delegate to root via sudo. Depending on how the Fleek Networking Lightning CLI was installed, this might cause some confusion, which is better explained by reading the reference Keys not found, which illustrates a situation where a user gets an error message about the wrong location of a system path (keystore).

Some reasons why the Permission denied (os error 13) might occur are related to:

  • The Fleek Network Lightning CLI process trying to write to a .lightning stored in a non permitted location
  • The Fleek Network Lightning CLI process trying to write to /tmp

The most common issue can be fixed by reading the section Override the TMPDIR.

Override the TMPDIR

The Fleek Network Lightning process requires writing to a temporary directory. As the process requires permissions, this might fail as demonstrated by some of the output logs we have below.

a) A permission denied error message

Permission denied (os error 13)

b) Rust panic error message which includes a permission denied

thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

c) A trace showing the path where this has failed

[00007fcbe168e764] openat(AT_FDCWD, "/tmp/lightning.log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = -1 EACCES (Permission denied)
[00007fcbe168ea6f] write(2, "thread '", 8thread ') = 8
[00007fcbe168ea6f] write(2, "main", 4main) = 4
[00007fcbe168ea6f] write(2, "' panicked at '", 15' panicked at ') = 15
[00007fcbe168ea6f] write(2, "called `Result::unwrap()` on an "..., 114called `Result::unwrap()` on an `Err` value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }) = 114
[00007fcbe168ea6f] write(2, "', ", 3', ) = 3
tip

The /tmp directory should have wide permissions for all applications, but to mitigate any permission issues the user can override the system environment TMPDIR. For example, the installer and update scripts override TMPDIR environment variable to /var/tmp setting it in the service unit Environment=.

The Lightning CLI process is aware of the environment variable TMPDIR, which the operators can override as discussed in the reference for Update the System service unit.

In short, it requires you to include a Environment= value of TMPDIR=/var/tmp as follows:

[Service]
...
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp
attention

The /etc/systemd/system/lightning.service service unit file presented here is a shorter version for simplicity. Do not replace your service unit file with the shorter content version presented here.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Ownership and file permissions

+

When running the Lightning CLI, the user who's in control can delegate to root via sudo. Depending on how the Fleek Networking Lightning CLI was installed, this might cause some confusion, which is better explained by reading the reference Keys not found, which illustrates a situation where a user gets an error message about the wrong location of a system path (keystore).

+

Some reasons why the Permission denied (os error 13) might occur are related to:

+
    +
  • The Fleek Network Lightning CLI process trying to write to a .lightning stored in a non permitted location
  • +
  • The Fleek Network Lightning CLI process trying to write to /tmp
  • +
+

The most common issue can be fixed by reading the section Override the TMPDIR.

+

Override the TMPDIR

+

The Fleek Network Lightning process requires writing to a temporary directory. As the process requires permissions, this might fail as demonstrated by some of the output logs we have below.

+

a) A permission denied error message

+
Permission denied (os error 13)
+

b) Rust panic error message which includes a permission denied

+
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
thread 'main' panicked at 'called Result::unwrap() on an Err value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', core/node/src/cli.rs:181:18
note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
+

c) A trace showing the path where this has failed

+
[00007fcbe168e764] openat(AT_FDCWD, "/tmp/lightning.log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = -1 EACCES (Permission denied)
[00007fcbe168ea6f] write(2, "thread '", 8thread ') = 8
[00007fcbe168ea6f] write(2, "main", 4main) = 4
[00007fcbe168ea6f] write(2, "' panicked at '", 15' panicked at ') = 15
[00007fcbe168ea6f] write(2, "called `Result::unwrap()` on an "..., 114called `Result::unwrap()` on an `Err` value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }) = 114
[00007fcbe168ea6f] write(2, "', ", 3', ) = 3
+
tip

The /tmp directory should have wide permissions for all applications, but to mitigate any permission issues the user can override the system environment TMPDIR. For example, the installer and update scripts override TMPDIR environment variable to /var/tmp setting it in the service unit Environment=.

+

The Lightning CLI process is aware of the environment variable TMPDIR, which the operators can override as discussed in the reference for Update the System service unit.

+

In short, it requires you to include a Environment= value of TMPDIR=/var/tmp as follows:

+
[Service]
...
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp
+
attention

The /etc/systemd/system/lightning.service service unit file presented here is a shorter version for simplicity. Do not replace your service unit file with the shorter content version presented here.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/restore-the-keystore/index.html b/references/Lightning CLI/restore-the-keystore/index.html index 598cc9177..84a809780 100644 --- a/references/Lightning CLI/restore-the-keystore/index.html +++ b/references/Lightning CLI/restore-the-keystore/index.html @@ -1,9 +1,9 @@ - + - -Restore the keystore | Fleek Network Docs | Decentralized Edge Platform + +Restore the keystore | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,65 @@ - - - + + + - + -
-
caution

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Switch user

Switch to the correct username you have used to install and set up the Fleek Network Lightning. For example, let's say that the username is lgtn. The command you'd have to run would be:

su lgtn

Change directory to user home

Change directory to the user you have used to install and set up the Fleek Network Lightning. For example, if you have used the username lgtn the command would be:

cd $HOME

In other words:

cd /home/lgtn

Clear the config.toml

You should can delete, backup or move the config.toml file in order to reset it.

It might be necessary to, if your configuration, e.g. is corrupted, or you want to reset it for any other reason.

To move or backup, run:

mv ~/.lightning/config.toml ~/.lightning/config.toml.backup

If you don't have a use-case for the backup, delete the file. To delete, run the command:

rm ~/.lightning/config.toml
warning

You should have switched to the correct username. If you haven't done it, when stating ~ that will refer to the current username home, which can be anything other than the correct username! Make sure you have switched to the correct username used during the installation and set up of Fleek Network Lightning to avoid confusion and issues.

Create a new config.toml

A new configuration file can be created by running the following command:

lgtn print-config --default > ~/.lightning/config.toml

Update the config.toml with user home path

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

Here's an example of how to do it using sed:

sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

For example, if your username is lgtn that'd look like this:

sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

cat /home/lgtn/.lightning/config.toml

For our example where we opted in for the username lgtn that would look like:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

Restoring the keystore

You can restore the keystore (Public Keys) by copying the directory to the ~/.lightning directory.

Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:

1) The keystore and files are located under the hypothetical location /my-keystore-backup

2) The files in the /my-keystore-backup are the following:

/my-keystore-backup
├── consensus.pem
└── node.pem

1 directory, 2 files

Considering the above for our example, you would have to run the following command:

mv /my-keystore-backup /home/<YOUR-USERNAME>/.lightning/keystore
tip

Remember to replace the <YOUR-USERNAME> with the correct username for the setup. For example, if you have installed the Fleek Network with the username lgtn that would be /home/lgtn/.lightning/keystore.

Once moved, remember to start the service, you can learn how to manage the service by reading the section Systemd Service.

For a more in depth or step-by-step instructions read the guide managing the keystore.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +
caution

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

+

Switch user

+

Switch to the correct username you have used to install and set up the Fleek Network Lightning. For example, let's say that the username is lgtn. The command you'd have to run would be:

+
su lgtn
+

Change directory to user home

+

Change directory to the user you have used to install and set up the Fleek Network Lightning. For example, if you have used the username lgtn the command would be:

+
cd $HOME
+

In other words:

+
cd /home/lgtn
+

Clear the config.toml

+

You should can delete, backup or move the config.toml file in order to reset it.

+

It might be necessary to, if your configuration, e.g. is corrupted, or you want to reset it for any other reason.

+

To move or backup, run:

+
mv ~/.lightning/config.toml ~/.lightning/config.toml.backup
+

If you don't have a use-case for the backup, delete the file. To delete, run the command:

+
rm ~/.lightning/config.toml
+
warning

You should have switched to the correct username. If you haven't done it, when stating ~ that will refer to the current username home, which can be anything other than the correct username! Make sure you have switched to the correct username used during the installation and set up of Fleek Network Lightning to avoid confusion and issues.

+

Create a new config.toml

+

A new configuration file can be created by running the following command:

+
lgtn print-config --default > ~/.lightning/config.toml
+

Update the config.toml with user home path

+

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

+

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

+

Here's an example of how to do it using sed:

+
sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
+
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

+

For example, if your username is lgtn that'd look like this:

+
sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
+

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

+
cat /home/lgtn/.lightning/config.toml
+

For our example where we opted in for the username lgtn that would look like:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

+

Restoring the keystore

+

You can restore the keystore (Public Keys) by copying the directory to the ~/.lightning directory.

+

Let's assume that you know where your backup directory or files are located. To keep our instructions easy to follow, let's say that:

+
    +
  1. +

    The keystore and files are located under the hypothetical location /my-keystore-backup

    +
  2. +
  3. +

    The files in the /my-keystore-backup are the following:

    +
  4. +
+
/my-keystore-backup
├── consensus.pem
└── node.pem

1 directory, 2 files
+

Considering the above for our example, you would have to run the following command:

+
mv /my-keystore-backup /home/<YOUR-USERNAME>/.lightning/keystore
+
tip

Remember to replace the <YOUR-USERNAME> with the correct username for the setup. For example, if you have installed the Fleek Network with the username lgtn that would be /home/lgtn/.lightning/keystore.

+

Once moved, remember to start the service, you can learn how to manage the service by reading the section Systemd Service.

+

For a more in depth or step-by-step instructions read the guide managing the keystore.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/uninstall-lightning-node/index.html b/references/Lightning CLI/uninstall-lightning-node/index.html index 1c3a0c8ac..124f6a9a5 100644 --- a/references/Lightning CLI/uninstall-lightning-node/index.html +++ b/references/Lightning CLI/uninstall-lightning-node/index.html @@ -1,9 +1,9 @@ - + - -Uninstall Lightning Node | Fleek Network Docs | Decentralized Edge Platform + +Uninstall Lightning Node | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,44 @@ - - - + + + - + -
-

To remove a symbolic link, use either the rm or unlink command followed by the name of the symlink as an argument. Here's an example with unlink:

unlink /usr/local/bin/lgtn

Delete the local source code

Delete the local source code which was copied from the remote repository. You can delete it recursively by:

rm -r ~/fleek-network/lightning

💡 Use the flag f to force remove by skipping any prompts, e.g. rm -rf <PATHNAME>

note

The default install location is $HOME/fleek-network/lightning. If you have selected a different location to store the repository, change the target path.

Disable the systemd service

To disable the Fleek Network Lightning Systemd's service, start by stopping the service.

sudo systemctl stop lightning.service
tip

You can replace lightning.service by lightning.

Disable the lightning service

sudo systemctl disable lightning.service

If you have used the recommended procedures in the install documentation you'll have to remove the Systemd unit (file that defines the service).

rm /etc/systemd/system/lightning.service

Reload the Systemd service daemon

sudo systemctl daemon-reload

Clear the lightning config directory

The Fleek Network lightning config directory is where the configuration, keystore–the location where your private key is hosted–and other system files are stored.

WARNING

Make sure to back up any sensitive data, such as the keystore (private keys), as you won't be able to recover the keys by any other means. If you have any funds associated with it, it'll be lost forever. The Fleek Network team or anyone else will not be able to help recover keys. Your keys, your responsibility.

Alternatively, instead of deleting you can move the files to a custom directory name such as.lightning.backupDATESTAMP, e.g. the example below we've used the date 2023-09-06-1205 as that was the time this text was written:

mv ~/.lightning ~/.lightning.backup202309061205

To clear the lightning config directory remove any files recursively by running the following command:

rm -r ~/.lightning/*

💡 Use the flag f to force remove by skipping any prompts, e.g. rm -rf <PATHNAME>/*

Alternatively, delete the ~/.lightning directory:

rm -r ~/.lightning

Uninstall Cargo and Rust

To uninstall rustc, rustup and cargo run the following command:

rustup self uninstall
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +
+

To remove a symbolic link, use either the rm or unlink command followed by the name of the symlink as an argument. Here's an example with unlink:

+
unlink /usr/local/bin/lgtn
+

Delete the local source code

+

Delete the local source code which was copied from the remote repository. You can delete it recursively by:

+
rm -r ~/fleek-network/lightning
+

💡 Use the flag f to force remove by skipping any prompts, e.g. rm -rf <PATHNAME>

+
note

The default install location is $HOME/fleek-network/lightning. If you have selected a different location to store the repository, change the target path.

+

Disable the systemd service

+

To disable the Fleek Network Lightning Systemd's service, start by stopping the service.

+
sudo systemctl stop lightning.service
+
tip

You can replace lightning.service by lightning.

+

Disable the lightning service

+
sudo systemctl disable lightning.service
+

If you have used the recommended procedures in the install documentation you'll have to remove the Systemd unit (file that defines the service).

+
rm /etc/systemd/system/lightning.service
+

Reload the Systemd service daemon

+
sudo systemctl daemon-reload
+

Clear the lightning config directory

+

The Fleek Network lightning config directory is where the configuration, keystore–the location where your private key is hosted–and other system files are stored.

+
WARNING

Make sure to back up any sensitive data, such as the keystore (private keys), as you won't be able to recover the keys by any other means. If you have any funds associated with it, it'll be lost forever. The Fleek Network team or anyone else will not be able to help recover keys. Your keys, your responsibility.

+

Alternatively, instead of deleting you can move the files to a custom directory name such as.lightning.backupDATESTAMP, e.g. the example below we've used the date 2023-09-06-1205 as that was the time this text was written:

+
mv ~/.lightning ~/.lightning.backup202309061205
+

To clear the lightning config directory remove any files recursively by running the following command:

+
rm -r ~/.lightning/*
+

💡 Use the flag f to force remove by skipping any prompts, e.g. rm -rf <PATHNAME>/*

+

Alternatively, delete the ~/.lightning directory:

+
rm -r ~/.lightning
+

Uninstall Cargo and Rust

+

To uninstall rustc, rustup and cargo run the following command:

+
rustup self uninstall
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Lightning CLI/update-cli-from-source-code/index.html b/references/Lightning CLI/update-cli-from-source-code/index.html index bfe5697c4..eface34e9 100644 --- a/references/Lightning CLI/update-cli-from-source-code/index.html +++ b/references/Lightning CLI/update-cli-from-source-code/index.html @@ -1,9 +1,9 @@ - + - -Update CLI from source code | Fleek Network Docs | Decentralized Edge Platform + +Update CLI from source code | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,101 @@ - - - + + + - + -
-
tip

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

curl -sS https://get.fleek.network/update | bash

Switch to the installation user

Switch to the username you've used throughout the installation process.

su <USERNAME>

For example, if you used the username lgtn it'll look like the following command:

su lgtn

Change directory to the source code

If you have installed it via the recommended process or instructions, then the default location where the source code is stored is ~/fleek-network/lightning.

cd ~/fleek-network/lightning
tip

Notice that we use ~, which refers to $HOME. You must use the username used for the installation process. For example, on Ubuntu if you use the username lgtn, the pathname for $HOME is /home/lgtn.

Checkout to branch

Make sure that you are checked in to the correct branch. For the current testnet phase that'd be testnet-alpha-1. If you use any other branch name, your node will not function correctly. Use the branch name testnet-alpha-1.

git checkout testnet-alpha-1
tip

We try to update our documentation promptly but sometimes are a bit behind on any changes we might make in real-time. If you find any typos, such as the wrong branch name, help us by letting us know! Find us in Fleek Network section of our Discord.

Pull the latest changes

Before make sure that you stash or clear any changes you may have in the working directory, as otherwise, git will let you know about local changes–if you'd like to learn more about it read the git stash document.

A quick way to clean is to stash the changes, for example:

git stash 

To pull the latest changes use the git pull command, as follows:

git pull origin testnet-alpha-1

Alternatively, to have to stash and pull, you can reset the repository to the origin.

git fetch origin testnet-alpha-1
git reset --hard origin/testnet-alpha-1
git clean -f
tip

We are using the branch named testnet-alpha-1, which is specific to the early testnet launch. Change to the correct branch name according to needs. For example, in the future the mainnet version will go on branch name main.

Build binary from the source

To build the binary from the source code, we execute the cargo build command:

cargo +stable build --release

Start by removing the existing one:

sudo rm -f "/usr/local/bin/lgtn"

Create a new symlink that links the new build binary to /usr/local/bin/lgtn, as follows:

sudo ln -s ~/fleek-network/lightning/target/release/lightning-node /usr/local/bin/lgtn

Set user path in config.toml

You should be following the create a user recommendation. For our example, we have the username lgtn.

tip

If you have chosen a different username, replace lgtn by the correct username you have selected.

In the config.toml you'll find some and more of the following:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"

Find and replace all instances of ~ in the config file /home/lgtn/.lightning/config.toml. Here's an example using sed:

sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
caution

The config.toml example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here.

Once changed, all the instances of ~/ should be replaced by your user path e.g. /home/lgtn/. For our example, the output would look like the following:

[BLANK]

[application]
db_path = "/home/lgtn/.lightning/data/app_db"

[consensus]
store_path = "/home/lgtn/.lightning/data/narwhal_store"

[fsstore]
root = "/home/lgtn/.lightning/blockstore"

[resolver]
store_path = "/home/lgtn/.lightning/data/resolver_store"

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"

Update the systemd service unit

Open and edit the /etc/systemd/system/lightning.service file.

1) Replace <YOUR-USERNAME> with the username. For example, in the documentation we use the username lgtn.

2) Make sure that the ExecStart is set correctly

[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/<YOUR-USERNAME>/.lightning/config.toml -vv run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
note

The flag -c in the lightning.service ExecStart, is to provide the toml configuration file path e.g. defaults to ~/.lightning/config.toml. This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a user or sudoer. For example, a sudoer would have the configuration set to /root/.lightning/config.toml or /home/username/.lightning/config.toml depending on using sudo which might cause some confusion to some users.

When complete make sure the file is saved. Followed by a systemctl daemon reload:

sudo systemctl daemon-reload

Clear the data

rm -rf ~/.lightning/data

Depending on how you control the system, this might need sudo.

sudo rm -rf ~/.lightning/data

Update the config.toml

Remove the ~/.lightning/config.toml.

rm ~/.lightning/config.toml

Create a new config.toml

lgtn print-config --default > ~/.lightning/config.toml

Update the config.toml with user home path

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

Here's an example of how to do it using sed:

sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

For example, if your username is lgtn that'd look like this:

sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

cat /home/lgtn/.lightning/config.toml

For our example where we opted in for the username lgtn that would look like:

[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

Restart the service

Once the cargo build process is completed, you have to restart the service. We're assuming you are using non-root user as recommended, you won't use sudo to start the service. The command will look as follows:

sudo systemctl restart lightning
tip

If you have installed the Fleek Network lightning manually, the installation instructions recommended setting up a systemd service for the Fleek Network process. If you haven't, you're advised to check the instructions provided.

Health checkup

Do a quick health check by running:

curl -w "\p" localhost:4230/health

If successful, you should get the response running and staked, as follows:

running and staked
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +
tip

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

curl -sS https://get.fleek.network/update | bash
+

Switch to the installation user

+

Switch to the username you've used throughout the installation process.

+
su <USERNAME>
+

For example, if you used the username lgtn it'll look like the following command:

+
su lgtn
+

Change directory to the source code

+

If you have installed it via the recommended process or instructions, then the default location where the source code is stored is ~/fleek-network/lightning.

+
cd ~/fleek-network/lightning
+
tip

Notice that we use ~, which refers to $HOME. You must use the username used for the installation process. For example, on Ubuntu if you use the username lgtn, the pathname for $HOME is /home/lgtn.

+

Checkout to branch

+

Make sure that you are checked in to the correct branch. For the current testnet phase that'd be testnet-alpha-1. If you use any other branch name, your node will not function correctly. Use the branch name testnet-alpha-1.

+
git checkout testnet-alpha-1
+
tip

We try to update our documentation promptly but sometimes are a bit behind on any changes we might make in real-time. If you find any typos, such as the wrong branch name, help us by letting us know! Find us in Fleek Network section of our Discord.

+

Pull the latest changes

+

Before make sure that you stash or clear any changes you may have in the working directory, as otherwise, git will let you know about local changes–if you'd like to learn more about it read the git stash document.

+

A quick way to clean is to stash the changes, for example:

+
git stash 
+

To pull the latest changes use the git pull command, as follows:

+
git pull origin testnet-alpha-1
+

Alternatively, to have to stash and pull, you can reset the repository to the origin.

+
git fetch origin testnet-alpha-1
git reset --hard origin/testnet-alpha-1
git clean -f
+
tip

We are using the branch named testnet-alpha-1, which is specific to the early testnet launch. Change to the correct branch name according to needs. For example, in the future the mainnet version will go on branch name main.

+

Build binary from the source

+

To build the binary from the source code, we execute the cargo build command:

+
cargo +stable build --release
+ +

Start by removing the existing one:

+
sudo rm -f "/usr/local/bin/lgtn"
+

Create a new symlink that links the new build binary to /usr/local/bin/lgtn, as follows:

+
sudo ln -s ~/fleek-network/lightning/target/release/lightning-node /usr/local/bin/lgtn
+

Set user path in config.toml

+

You should be following the create a user recommendation. For our example, we have the username lgtn.

+
tip

If you have chosen a different username, replace lgtn by the correct username you have selected.

+

In the config.toml you'll find some and more of the following:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+

Find and replace all instances of ~ in the config file /home/lgtn/.lightning/config.toml. Here's an example using sed:

+
sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
+
caution

The config.toml example below is a shorter version of what you'll encounter, yours might look different. We do this to keep the guide simple to read. Do not copy and replace with the version demonstrated here.

+

Once changed, all the instances of ~/ should be replaced by your user path e.g. /home/lgtn/. For our example, the output would look like the following:

+
[BLANK]

[application]
db_path = "/home/lgtn/.lightning/data/app_db"

[consensus]
store_path = "/home/lgtn/.lightning/data/narwhal_store"

[fsstore]
root = "/home/lgtn/.lightning/blockstore"

[resolver]
store_path = "/home/lgtn/.lightning/data/resolver_store"

[signer]
consensus_key_path = "/home/lgtn/.lightning/keystore/consensus.pem"
node_key_path = "/home/lgtn/.lightning/keystore/node.pem"
+

Update the systemd service unit

+

Open and edit the /etc/systemd/system/lightning.service file.

+
    +
  1. +

    Replace <YOUR-USERNAME> with the username. For example, in the documentation we use the username lgtn.

    +
  2. +
  3. +

    Make sure that the ExecStart is set correctly

    +
  4. +
+
[Unit]
Description=Fleek Network Node lightning service

[Service]
Type=simple
MemoryHigh=32G
RestartSec=15s
Restart=always
ExecStart=lgtn -c /home/<YOUR-USERNAME>/.lightning/config.toml -vv run
StandardOutput=append:/var/log/lightning/output.log
StandardError=append:/var/log/lightning/diagnostic.log
Environment=TMPDIR=/var/tmp

[Install]
WantedBy=multi-user.target
+
note

The flag -c in the lightning.service ExecStart, is to provide the toml configuration file path e.g. defaults to ~/.lightning/config.toml. This is to avoid the path being determined dynamically (given path base ~ or $HOME), as users might control the systemctl service as a user or sudoer. For example, a sudoer would have the configuration set to /root/.lightning/config.toml or /home/username/.lightning/config.toml depending on using sudo which might cause some confusion to some users.

+

When complete make sure the file is saved. Followed by a systemctl daemon reload:

+
sudo systemctl daemon-reload
+

Clear the data

+
rm -rf ~/.lightning/data
+

Depending on how you control the system, this might need sudo.

+
sudo rm -rf ~/.lightning/data
+

Update the config.toml

+

Remove the ~/.lightning/config.toml.

+
rm ~/.lightning/config.toml
+

Create a new config.toml

+
lgtn print-config --default > ~/.lightning/config.toml
+

Update the config.toml with user home path

+

In the /home/<USERNAME>/.lightning/config.toml you'll find some and more of the following:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
tip

The configuration properties and values presented above are a shorter version of what you'll find on your configuration.toml. We keep it short to make it easier to follow, do not copy and paste.

+

Find and replace all instances of ~ in the config file /home/<USERNAME>/.lightning/config.toml.

+

Here's an example of how to do it using sed:

+
sed -i "s|~/.lightning|/home/<USERNAME>/.lightning|g" "/home/<USERNAME>/.lightning/config.toml"
+
tip

Replace the <USERNAME> with your username. For example, if you have followed the recommendation to create a user it would look like /home/lgtn/.lightning/config.toml for the username lgtn.

+

For example, if your username is lgtn that'd look like this:

+
sed -i "s|~/.lightning|/home/lgtn/.lightning|g" "/home/lgtn/.lightning/config.toml"
+

Once modified, you can run a cat to see the content of the files to confirm it has been updated.

+
cat /home/lgtn/.lightning/config.toml
+

For our example where we opted in for the username lgtn that would look like:

+
[BLANK]

[application]
db_path = "~/.lightning/data/app_db"

[consensus]
store_path = "~/.lightning/data/narwhal_store"

[fsstore]
root = "~/.lightning/blockstore"

[resolver]
store_path = "~/.lightning/data/resolver_store"

[signer]
consensus_key_path = "~/.lightning/keystore/consensus.pem"
node_key_path = "~/.lightning/keystore/node.pem"
+
Warning

Bear in mind that we are keeping the content of the file short to make it easier to read and follow. The content of your configuration file should look slightly different, amongst these it should contain other properties and values. You should not copy and replace the content of your files with the ones presented here.

+

Restart the service

+

Once the cargo build process is completed, you have to restart the service. We're assuming you are using non-root user as recommended, you won't use sudo to start the service. The command will look as follows:

+
sudo systemctl restart lightning
+
tip

If you have installed the Fleek Network lightning manually, the installation instructions recommended setting up a systemd service for the Fleek Network process. If you haven't, you're advised to check the instructions provided.

+

Health checkup

+

Do a quick health check by running:

+
curl -w "\p" localhost:4230/health
+

If successful, you should get the response running and staked, as follows:

+
running and staked
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Systemd/service-keeps-running-after-shutdown/index.html b/references/Systemd/service-keeps-running-after-shutdown/index.html index 69698bafe..c6178141b 100644 --- a/references/Systemd/service-keeps-running-after-shutdown/index.html +++ b/references/Systemd/service-keeps-running-after-shutdown/index.html @@ -1,9 +1,9 @@ - + - -Service keeps running after shutdown | Fleek Network Docs | Decentralized Edge Platform + +Service keeps running after shutdown | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,24 @@ - - - + + + - + -
-

Stop the service

The Systemd service section tells how to stop the service, as follows:

sudo systemctl stop lightning

Although, the service is set to restart on failure after a few seconds.

Kill the process by name

Force stop a process by name with the command pkill.

pkill -f <PROCESS NAME>

If you've followed the recommended settings, or used the assisted installer the process should be called lgtn.

A Systemd service is managed by Systemctl, to start, stop, to get status or restart. The service controls the Lightning CLI service, that for our convenience named as lgtn–short for lightning. If you haven't followed the recommended settings and have a custom set up, you need to use the custom details you have defined.

To force stop the service lgtn execute the command:

sudo killall -9 lgtn
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Stop the service

+

The Systemd service section tells how to stop the service, as follows:

+
sudo systemctl stop lightning
+

Although, the service is set to restart on failure after a few seconds.

+

Kill the process by name

+

Force stop a process by name with the command pkill.

+
pkill -f <PROCESS NAME>
+

If you've followed the recommended settings, or used the assisted installer the process should be called lgtn.

+

A Systemd service is managed by Systemctl, to start, stop, to get status or restart. The service controls the Lightning CLI service, that for our convenience named as lgtn–short for lightning. If you haven't followed the recommended settings and have a custom set up, you need to use the custom details you have defined.

+

To force stop the service lgtn execute the command:

+
sudo killall -9 lgtn
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Systemd/shutting-down-persistance/index.html b/references/Systemd/shutting-down-persistance/index.html index e21184098..16d6bd12c 100644 --- a/references/Systemd/shutting-down-persistance/index.html +++ b/references/Systemd/shutting-down-persistance/index.html @@ -1,9 +1,9 @@ - + - -Shutting down persistance | Fleek Network Docs | Decentralized Edge Platform + +Shutting down persistance | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,34 @@ - - - + + + - + -
-

Systemd Service as frozen or idle

If you have a Shutting node down message on the service log, the process is likely failing to respond to Systemd shut down command by failing to terminate all the child processes that were started by the service.

The logs should be similar to the following:

2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: XsE9KtedDRUGv22MLHvy8qcc52QsWGWJYY1LBnWhglg=
2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: zBmZaycvQsdFRfe0p5Rig/KgyYPD4yNKQTPDo7JrugM=
2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################
2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************
RPC server starting up
listening on 0.0.0.0:4230
Shutting node down.
Shutting node down.
Shutting node down.
Shutting node down.
Shutting node down.

To resolve this issue, start by executing a new shutdown command as follows:

systemctl stop lightning

If you need to delegate to root, then use the sudo keyword, as follows:

sudo systemctl stop lightning

Once completed, clear the logs to avoid confusion as the log aggregates messages past and current.

Delete all the log files (output.log and diagnostic.log) by running:

sudo rm -f /var/log/lightning/*.log

Launch the service:

systemctl start lightning

If you need to delegate to root, then use the sudo keyword, as follows:

sudo systemctl start lightning

You can watch the log output of the service by running:

tail -f /var/log/lightning/output.log

The output should be similar to:

2023-09-12 13:53:51 | WARN  | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################
2023-09-12 13:53:51 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************

Alternatively, you can watch the diagnostic.log

tail -f /var/log/lightning/diagnostic.log
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

Systemd Service as frozen or idle

+

If you have a Shutting node down message on the service log, the process is likely failing to respond to Systemd shut down command by failing to terminate all the child processes that were started by the service.

+

The logs should be similar to the following:

+
2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: XsE9KtedDRUGv22MLHvy8qcc52QsWGWJYY1LBnWhglg=
2023-09-11 18:02:07 | ERROR | lightning_consensus::consensus - core/consensus/src/consensus.rs:371 - node: zBmZaycvQsdFRfe0p5Rig/KgyYPD4yNKQTPDo7JrugM=
2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################
2023-09-11 18:02:07 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************
RPC server starting up
listening on 0.0.0.0:4230
Shutting node down.
Shutting node down.
Shutting node down.
Shutting node down.
Shutting node down.
+

To resolve this issue, start by executing a new shutdown command as follows:

+
systemctl stop lightning
+

If you need to delegate to root, then use the sudo keyword, as follows:

+
sudo systemctl stop lightning
+

Once completed, clear the logs to avoid confusion as the log aggregates messages past and current.

+

Delete all the log files (output.log and diagnostic.log) by running:

+
sudo rm -f /var/log/lightning/*.log
+

Launch the service:

+
systemctl start lightning
+

If you need to delegate to root, then use the sudo keyword, as follows:

+
sudo systemctl start lightning
+

You can watch the log output of the service by running:

+
tail -f /var/log/lightning/output.log
+

The output should be similar to:

+
2023-09-12 13:53:51 | WARN  | lightning_consensus::consensus - core/consensus/src/consensus.rs:373 - ##################
2023-09-12 13:53:51 | WARN | lightning_consensus::consensus - core/consensus/src/consensus.rs:374 - ********************************
+

Alternatively, you can watch the diagnostic.log

+
tail -f /var/log/lightning/diagnostic.log
+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/Systemd/user-service/index.html b/references/Systemd/user-service/index.html index 61f775793..e27dbbc0b 100644 --- a/references/Systemd/user-service/index.html +++ b/references/Systemd/user-service/index.html @@ -1,9 +1,9 @@ - + - -User service | Fleek Network Docs | Decentralized Edge Platform + +User service | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,57 @@ - - - + + + - + -
-

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

Check --user support

Use the --user flag when getting the list of unit files.

systemctl --user list-unit-files

It should return a list of unit files.

Put the service unit in the user service

Create the Systemd user units directory:

sudo mkdir -p /etc/systemd/system/user

Move the lightning.service to the system user unit service directory:

mv /etc/systemd/system/lightning.service /etc/systemd/system/user/lightning.service

Check the Load path when running in user mode (--user) in Systemd unit for other alternative user paths, or to understand how it works to customize your server accordingly.

Reload daemon

sudo systemctl daemon-reload

Systemd service control as --user

Reload the Systemctl daemon by executing the command:

systemctl --user daemon-reload

Enable the service for starting up on system boot:

systemctl --user enable lightning.service

Start the service by:

systemctl --user start lightning

Stop the service by:

systemctl --user stop lightning

Restart the service by:

systemctl --user restart lightning

Check the service status by:

systemctl --user status lightning.service

Problem statement

On tests done in a DigitalOcean Ubuntu 22.x, we had set up user-level services which were operated with --user. When the commands were executed as --user it failed with:

Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)

The user should be able to operate as user, it shouldn't be required to connect on behalf of other users. This means that even for a simple command, such as to retrieve the list of unit files:

systemctl --user list-unit-files

We'd get the error:

Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)

For any of the supported user unit locations e.g. $HOME/.config/systemd/user as documented in Systemd unit documentation, the result is the error above.

This is related to the load paths when running in user mode (--user), as described in the discussion here.

User-dependent

$XDG_CONFIG_HOME/systemd/user User configuration (only used when $XDG_CONFIG_HOME is set)

$HOME/.config/systemd/user User configuration (only used when $XDG_CONFIG_HOME is not set)

$XDG_RUNTIME_DIR/systemd/user Runtime units (only used when $XDG_RUNTIME_DIR is set)

$XDG_DATA_HOME/systemd/user Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is set)

$HOME/.local/share/systemd/user Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is not set)

For example, if we check the $XDG_RUNTIME_DIR in a DigitalOcean box, we get the following output:

/run/user/0

For this reason and to provide support for a wider audience of users and systems, we've stuck to sudo to execute the service, but this should not be a requirement and is not recommended.

Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
- - +

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

+

Check --user support

+

Use the --user flag when getting the list of unit files.

+
systemctl --user list-unit-files
+

It should return a list of unit files.

+

Put the service unit in the user service

+

Create the Systemd user units directory:

+
sudo mkdir -p /etc/systemd/system/user
+

Move the lightning.service to the system user unit service directory:

+
mv /etc/systemd/system/lightning.service /etc/systemd/system/user/lightning.service
+

Check the Load path when running in user mode (--user) in Systemd unit for other alternative user paths, or to understand how it works to customize your server accordingly.

+

Reload daemon

+
sudo systemctl daemon-reload
+

Systemd service control as --user

+

Reload the Systemctl daemon by executing the command:

+
systemctl --user daemon-reload
+

Enable the service for starting up on system boot:

+
systemctl --user enable lightning.service
+

Start the service by:

+
systemctl --user start lightning
+

Stop the service by:

+
systemctl --user stop lightning
+

Restart the service by:

+
systemctl --user restart lightning
+

Check the service status by:

+
systemctl --user status lightning.service
+

Problem statement

+

On tests done in a DigitalOcean Ubuntu 22.x, we had set up user-level services which were operated with --user. When the commands were executed as --user it failed with:

+
Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)
+

The user should be able to operate as user, it shouldn't be required to connect on behalf of other users. This means that even for a simple command, such as to retrieve the list of unit files:

+
systemctl --user list-unit-files
+

We'd get the error:

+
Failed to connect to bus: Operation not permitted (consider using --machine=<user>@.host --user to connect to bus of other user)
+

For any of the supported user unit locations e.g. $HOME/.config/systemd/user as documented in Systemd unit documentation, the result is the error above.

+

This is related to the load paths when running in user mode (--user), as described in the discussion here.

+

User-dependent

+

$XDG_CONFIG_HOME/systemd/user User configuration (only used when $XDG_CONFIG_HOME is set)

+

$HOME/.config/systemd/user User configuration (only used when $XDG_CONFIG_HOME is not set)

+

$XDG_RUNTIME_DIR/systemd/user Runtime units (only used when $XDG_RUNTIME_DIR is set)

+

$XDG_DATA_HOME/systemd/user Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is set)

+

$HOME/.local/share/systemd/user Units of packages that have been installed in the home directory (only used when $XDG_DATA_HOME is not set)

+

For example, if we check the $XDG_RUNTIME_DIR in a DigitalOcean box, we get the following output:

+
/run/user/0
+

For this reason and to provide support for a wider audience of users and systems, we've stuck to sudo to execute the service, but this should not be a requirement and is not recommended.

+
Helder Oliveira
Helder OliveiraSoftware Developer + DXGot questions? Find us on discord!
\ No newline at end of file diff --git a/references/index.html b/references/index.html index 5fea691a4..95440dc0e 100644 --- a/references/index.html +++ b/references/index.html @@ -1,9 +1,9 @@ - + - -About references | Fleek Network Docs | Decentralized Edge Platform + +About references | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,16 @@ - - - + + + - + -
-

The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.

It differs from Guides which is more descriptive or verbose when providing instructions and how-to's.

To start, find references by consulting the available categories to locate the appropriate content on the sidebar. Our references are also available as a result when using the search feature located at the very top of the documentation site.

- - +
+

The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.

+

It differs from Guides which is more descriptive or verbose when providing instructions and how-to's.

+

To start, find references by consulting the available categories to locate the appropriate content on the sidebar. Our references are also available as a result when using the search feature located at the very top of the documentation site.

\ No newline at end of file diff --git a/references/tags/backup/index.html b/references/tags/backup/index.html index c6e372e6e..b86e0172c 100644 --- a/references/tags/backup/index.html +++ b/references/tags/backup/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "backup" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "backup" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "backup"

View All Tags

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

- - +

2 docs tagged with "backup"

View All Tags

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

\ No newline at end of file diff --git a/references/tags/build/index.html b/references/tags/build/index.html index 84c8324e1..3d55a0ca7 100644 --- a/references/tags/build/index.html +++ b/references/tags/build/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "build" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "build" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/clean/index.html b/references/tags/clean/index.html index a7ad9f76b..704464396 100644 --- a/references/tags/clean/index.html +++ b/references/tags/clean/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Clean" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Clean" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/clear/index.html b/references/tags/clear/index.html index 015eaf4b1..897580857 100644 --- a/references/tags/clear/index.html +++ b/references/tags/clear/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Clear" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Clear" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/cli/index.html b/references/tags/cli/index.html index 74d4535c1..bd846e62f 100644 --- a/references/tags/cli/index.html +++ b/references/tags/cli/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "cli" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "cli" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/commands/index.html b/references/tags/commands/index.html index b097e99f9..79a31b142 100644 --- a/references/tags/commands/index.html +++ b/references/tags/commands/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "commands" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "commands" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/container/index.html b/references/tags/container/index.html index 90d2d2e24..f3a79a5f6 100644 --- a/references/tags/container/index.html +++ b/references/tags/container/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "container" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "container" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/delete/index.html b/references/tags/delete/index.html index 23321a0ed..bb77d2db8 100644 --- a/references/tags/delete/index.html +++ b/references/tags/delete/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Delete" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Delete" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/docker/index.html b/references/tags/docker/index.html index 733b132d2..4b50197a0 100644 --- a/references/tags/docker/index.html +++ b/references/tags/docker/index.html @@ -1,9 +1,9 @@ - + - -3 docs tagged with "docker" | Fleek Network Docs | Decentralized Edge Platform + +3 docs tagged with "docker" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/file-permissions/index.html b/references/tags/file-permissions/index.html index 9b645df1f..8baf51ef9 100644 --- a/references/tags/file-permissions/index.html +++ b/references/tags/file-permissions/index.html @@ -1,9 +1,9 @@ - + - -3 docs tagged with "file permissions" | Fleek Network Docs | Decentralized Edge Platform + +3 docs tagged with "file permissions" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/fix/index.html b/references/tags/fix/index.html index 053419766..d5c875979 100644 --- a/references/tags/fix/index.html +++ b/references/tags/fix/index.html @@ -1,9 +1,9 @@ - + - -3 docs tagged with "fix" | Fleek Network Docs | Decentralized Edge Platform + +3 docs tagged with "fix" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

3 docs tagged with "fix"

View All Tags

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

- - +

3 docs tagged with "fix"

View All Tags

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

\ No newline at end of file diff --git a/references/tags/frozen/index.html b/references/tags/frozen/index.html index b2ed04c4b..c5642a33d 100644 --- a/references/tags/frozen/index.html +++ b/references/tags/frozen/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "frozen" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "frozen" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/help/index.html b/references/tags/help/index.html index 3ccd986f4..0714c5c68 100644 --- a/references/tags/help/index.html +++ b/references/tags/help/index.html @@ -1,9 +1,9 @@ - + - -10 docs tagged with "help" | Fleek Network Docs | Decentralized Edge Platform + +10 docs tagged with "help" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

10 docs tagged with "help"

View All Tags

About references

The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

- - +

10 docs tagged with "help"

View All Tags

About references

The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

\ No newline at end of file diff --git a/references/tags/idle/index.html b/references/tags/idle/index.html index 6c11e0092..91bf42df2 100644 --- a/references/tags/idle/index.html +++ b/references/tags/idle/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "idle" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "idle" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/image/index.html b/references/tags/image/index.html index 2d76cf423..db88c8787 100644 --- a/references/tags/image/index.html +++ b/references/tags/image/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "image" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "image" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/index.html b/references/tags/index.html index f1b52561c..b9594c642 100644 --- a/references/tags/index.html +++ b/references/tags/index.html @@ -1,9 +1,9 @@ - + - -Tags | Fleek Network Docs | Decentralized Edge Platform + +Tags | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/keystore/index.html b/references/tags/keystore/index.html index a83b64a67..be0b185ed 100644 --- a/references/tags/keystore/index.html +++ b/references/tags/keystore/index.html @@ -1,9 +1,9 @@ - + - -4 docs tagged with "keystore" | Fleek Network Docs | Decentralized Edge Platform + +4 docs tagged with "keystore" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

4 docs tagged with "keystore"

View All Tags

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

- - +

4 docs tagged with "keystore"

View All Tags

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

\ No newline at end of file diff --git a/references/tags/lightning/index.html b/references/tags/lightning/index.html index eda981cc7..ac6e532a3 100644 --- a/references/tags/lightning/index.html +++ b/references/tags/lightning/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "lightning" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "lightning" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/lost-keys/index.html b/references/tags/lost-keys/index.html index 67f0210a0..c61251249 100644 --- a/references/tags/lost-keys/index.html +++ b/references/tags/lost-keys/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "lost keys" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "lost keys" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/ownership/index.html b/references/tags/ownership/index.html index 571efb237..55f17550e 100644 --- a/references/tags/ownership/index.html +++ b/references/tags/ownership/index.html @@ -1,9 +1,9 @@ - + - -3 docs tagged with "ownership" | Fleek Network Docs | Decentralized Edge Platform + +3 docs tagged with "ownership" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/permissions/index.html b/references/tags/permissions/index.html index eba350796..2145f08aa 100644 --- a/references/tags/permissions/index.html +++ b/references/tags/permissions/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "permissions" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "permissions" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/pkill/index.html b/references/tags/pkill/index.html index c351a2533..00992015f 100644 --- a/references/tags/pkill/index.html +++ b/references/tags/pkill/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "pkill" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "pkill" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/process/index.html b/references/tags/process/index.html index 43d036235..5d5f88de6 100644 --- a/references/tags/process/index.html +++ b/references/tags/process/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "process" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "process" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/reference/index.html b/references/tags/reference/index.html index e0ed664a8..81243ce00 100644 --- a/references/tags/reference/index.html +++ b/references/tags/reference/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "reference" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "reference" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/references/index.html b/references/tags/references/index.html index 8c41bb39d..998d74245 100644 --- a/references/tags/references/index.html +++ b/references/tags/references/index.html @@ -1,9 +1,9 @@ - + - -10 docs tagged with "references" | Fleek Network Docs | Decentralized Edge Platform + +10 docs tagged with "references" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

10 docs tagged with "references"

View All Tags

About references

The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

- - +

10 docs tagged with "references"

View All Tags

About references

The references provide concise instructions to interface with the system, broken down into commands or small pieces for quick reference.

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

\ No newline at end of file diff --git a/references/tags/remove/index.html b/references/tags/remove/index.html index 65cb71ef8..9d9d67f08 100644 --- a/references/tags/remove/index.html +++ b/references/tags/remove/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Remove" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Remove" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/restore/index.html b/references/tags/restore/index.html index 64d00b831..d875083c7 100644 --- a/references/tags/restore/index.html +++ b/references/tags/restore/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "restore" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "restore" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "restore"

View All Tags

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

- - +

2 docs tagged with "restore"

View All Tags

Backing up the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

Restore the keystore

The security of the private key is the responsibility of the user. Unfortunately, the Fleek Network team and any others are unable to help regain access to private key if lost or failed to secure them. The private keys are the user responsibility. The Fleek Network team doesn't endorse any methods of encryption and storage, the methods described here are for educational purposes only.

\ No newline at end of file diff --git a/references/tags/root/index.html b/references/tags/root/index.html index dac194888..e0f1e13c5 100644 --- a/references/tags/root/index.html +++ b/references/tags/root/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "root" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "root" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/service-error/index.html b/references/tags/service-error/index.html index c03446d95..e2ed3cc58 100644 --- a/references/tags/service-error/index.html +++ b/references/tags/service-error/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "service error" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "service error" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/shutdown/index.html b/references/tags/shutdown/index.html index f4aad8ff7..0b92409b6 100644 --- a/references/tags/shutdown/index.html +++ b/references/tags/shutdown/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "shutdown" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "shutdown" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/sudoer/index.html b/references/tags/sudoer/index.html index 742c1d3a4..3d3946541 100644 --- a/references/tags/sudoer/index.html +++ b/references/tags/sudoer/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "sudoer" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "sudoer" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/systemctl/index.html b/references/tags/systemctl/index.html index ad707b3d6..90ebf8afd 100644 --- a/references/tags/systemctl/index.html +++ b/references/tags/systemctl/index.html @@ -1,9 +1,9 @@ - + - -3 docs tagged with "systemctl" | Fleek Network Docs | Decentralized Edge Platform + +3 docs tagged with "systemctl" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

3 docs tagged with "systemctl"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

- - +

3 docs tagged with "systemctl"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

\ No newline at end of file diff --git a/references/tags/systemd/index.html b/references/tags/systemd/index.html index b793d93f2..408a53d89 100644 --- a/references/tags/systemd/index.html +++ b/references/tags/systemd/index.html @@ -1,9 +1,9 @@ - + - -3 docs tagged with "systemd" | Fleek Network Docs | Decentralized Edge Platform + +3 docs tagged with "systemd" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

3 docs tagged with "systemd"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

- - +

3 docs tagged with "systemd"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

\ No newline at end of file diff --git a/references/tags/uninstall/index.html b/references/tags/uninstall/index.html index 8864a0d52..cdd8c53b7 100644 --- a/references/tags/uninstall/index.html +++ b/references/tags/uninstall/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "Uninstall" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "Uninstall" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/references/tags/unit/index.html b/references/tags/unit/index.html index 94278fd57..565de510d 100644 --- a/references/tags/unit/index.html +++ b/references/tags/unit/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "unit" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "unit" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "unit"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

- - +

One doc tagged with "unit"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

\ No newline at end of file diff --git a/references/tags/update/index.html b/references/tags/update/index.html index 60769fac6..dd0d54a1f 100644 --- a/references/tags/update/index.html +++ b/references/tags/update/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "update" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "update" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "update"

View All Tags

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

- - +

2 docs tagged with "update"

View All Tags

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

\ No newline at end of file diff --git a/references/tags/upgrade/index.html b/references/tags/upgrade/index.html index 97ef29cae..f5a714e3b 100644 --- a/references/tags/upgrade/index.html +++ b/references/tags/upgrade/index.html @@ -1,9 +1,9 @@ - + - -2 docs tagged with "upgrade" | Fleek Network Docs | Decentralized Edge Platform + +2 docs tagged with "upgrade" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

2 docs tagged with "upgrade"

View All Tags

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

- - +

2 docs tagged with "upgrade"

View All Tags

Update CLI from source code

Although the step-by-step instructions described here are simple to follow, this process is available as an automated script. To use it execute the following command in your server terminal and follow the instructions:

\ No newline at end of file diff --git a/references/tags/user-service/index.html b/references/tags/user-service/index.html index 2652989ec..d3b32c471 100644 --- a/references/tags/user-service/index.html +++ b/references/tags/user-service/index.html @@ -1,9 +1,9 @@ - + - -One doc tagged with "user service" | Fleek Network Docs | Decentralized Edge Platform + +One doc tagged with "user service" | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + -
-

One doc tagged with "user service"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

- - +

One doc tagged with "user service"

View All Tags

User service

A user should have the ability to run a Systemd user service unit without having to use sudo to control it.

\ No newline at end of file diff --git a/search/index.html b/search/index.html index e6b715b90..a1ed7d945 100644 --- a/search/index.html +++ b/search/index.html @@ -1,9 +1,9 @@ - + - -Search the documentation | Fleek Network Docs | Decentralized Edge Platform + +Search the documentation | Fleek Network Docs | Decentralized Edge Platform @@ -12,16 +12,13 @@ - - - + + + - + - - - + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 369d24d38..2393ee9db 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://docs.fleek.network/blog/weekly0.9https://docs.fleek.network/blog/archive/weekly0.9https://docs.fleek.network/blog/bloom-and-cuckoo-filters-for-cache-summarization/weekly0.9https://docs.fleek.network/blog/tags/weekly0.9https://docs.fleek.network/blog/tags/blog/weekly0.9https://docs.fleek.network/blog/tags/content-routing/weekly0.9https://docs.fleek.network/blog/tags/engineering/weekly0.9https://docs.fleek.network/blog/tags/fleek-network/weekly0.9https://docs.fleek.network/docs/tags/weekly0.9https://docs.fleek.network/docs/tags/about/weekly0.9https://docs.fleek.network/docs/tags/algorithms/weekly0.9https://docs.fleek.network/docs/tags/architecture/weekly0.9https://docs.fleek.network/docs/tags/awards/weekly0.9https://docs.fleek.network/docs/tags/build/weekly0.9https://docs.fleek.network/docs/tags/cdn/weekly0.9https://docs.fleek.network/docs/tags/cli/weekly0.9https://docs.fleek.network/docs/tags/client/weekly0.9https://docs.fleek.network/docs/tags/code-of-conduct/weekly0.9https://docs.fleek.network/docs/tags/codebase/weekly0.9https://docs.fleek.network/docs/tags/command-line-interface/weekly0.9https://docs.fleek.network/docs/tags/compile/weekly0.9https://docs.fleek.network/docs/tags/configuration/weekly0.9https://docs.fleek.network/docs/tags/consensus/weekly0.9https://docs.fleek.network/docs/tags/contribute/weekly0.9https://docs.fleek.network/docs/tags/control/weekly0.9https://docs.fleek.network/docs/tags/decentralization/weekly0.9https://docs.fleek.network/docs/tags/develop/weekly0.9https://docs.fleek.network/docs/tags/diagnostic/weekly0.9https://docs.fleek.network/docs/tags/diagnostics/weekly0.9https://docs.fleek.network/docs/tags/economics/weekly0.9https://docs.fleek.network/docs/tags/edge-network/weekly0.9https://docs.fleek.network/docs/tags/edge-platform/weekly0.9https://docs.fleek.network/docs/tags/fleek-network/weekly0.9https://docs.fleek.network/docs/tags/getting-started/weekly0.9https://docs.fleek.network/docs/tags/git/weekly0.9https://docs.fleek.network/docs/tags/guide/weekly0.9https://docs.fleek.network/docs/tags/healthcheck/weekly0.9https://docs.fleek.network/docs/tags/incentives/weekly0.9https://docs.fleek.network/docs/tags/learn/weekly0.9https://docs.fleek.network/docs/tags/lgtn/weekly0.9https://docs.fleek.network/docs/tags/lightning/weekly0.9https://docs.fleek.network/docs/tags/logs/weekly0.9https://docs.fleek.network/docs/tags/manage/weekly0.9https://docs.fleek.network/docs/tags/manual/weekly0.9https://docs.fleek.network/docs/tags/node-status/weekly0.9https://docs.fleek.network/docs/tags/onboarding/weekly0.9https://docs.fleek.network/docs/tags/open-source/weekly0.9https://docs.fleek.network/docs/tags/permissionless/weekly0.9https://docs.fleek.network/docs/tags/phases/weekly0.9https://docs.fleek.network/docs/tags/pledge/weekly0.9https://docs.fleek.network/docs/tags/ports/weekly0.9https://docs.fleek.network/docs/tags/protocol/weekly0.9https://docs.fleek.network/docs/tags/repository/weekly0.9https://docs.fleek.network/docs/tags/reputation/weekly0.9https://docs.fleek.network/docs/tags/requirements/weekly0.9https://docs.fleek.network/docs/tags/rewards/weekly0.9https://docs.fleek.network/docs/tags/roadmap/weekly0.9https://docs.fleek.network/docs/tags/rpc/weekly0.9https://docs.fleek.network/docs/tags/rust-dependencies/weekly0.9https://docs.fleek.network/docs/tags/sdk/weekly0.9https://docs.fleek.network/docs/tags/server/weekly0.9https://docs.fleek.network/docs/tags/services/weekly0.9https://docs.fleek.network/docs/tags/snarks/weekly0.9https://docs.fleek.network/docs/tags/standards/weekly0.9https://docs.fleek.network/docs/tags/systemctl/weekly0.9https://docs.fleek.network/docs/tags/systemd/weekly0.9https://docs.fleek.network/docs/tags/testnet/weekly0.9https://docs.fleek.network/docs/tags/token/weekly0.9https://docs.fleek.network/docs/tags/tokenomics/weekly0.9https://docs.fleek.network/docs/tags/toolkit/weekly0.9https://docs.fleek.network/docs/tags/verification/weekly0.9https://docs.fleek.network/docs/tags/whitepaper/weekly0.9https://docs.fleek.network/docs/tags/wizard/weekly0.9https://docs.fleek.network/guides/tags/weekly0.9https://docs.fleek.network/guides/tags/configuration/weekly0.9https://docs.fleek.network/guides/tags/container/weekly0.9https://docs.fleek.network/guides/tags/docker/weekly0.9https://docs.fleek.network/guides/tags/edge-computing/weekly0.9https://docs.fleek.network/guides/tags/fleek-network/weekly0.9https://docs.fleek.network/guides/tags/getting-started/weekly0.9https://docs.fleek.network/guides/tags/guide/weekly0.9https://docs.fleek.network/guides/tags/guides/weekly0.9https://docs.fleek.network/guides/tags/help/weekly0.9https://docs.fleek.network/guides/tags/keys/weekly0.9https://docs.fleek.network/guides/tags/keystore/weekly0.9https://docs.fleek.network/guides/tags/logs/weekly0.9https://docs.fleek.network/guides/tags/ownership/weekly0.9https://docs.fleek.network/guides/tags/private-keys/weekly0.9https://docs.fleek.network/guides/tags/public-keys/weekly0.9https://docs.fleek.network/guides/tags/rebuild/weekly0.9https://docs.fleek.network/guides/tags/setup/weekly0.9https://docs.fleek.network/guides/tags/transfer/weekly0.9https://docs.fleek.network/guides/tags/update/weekly0.9https://docs.fleek.network/references/tags/weekly0.9https://docs.fleek.network/references/tags/backup/weekly0.9https://docs.fleek.network/references/tags/build/weekly0.9https://docs.fleek.network/references/tags/clean/weekly0.9https://docs.fleek.network/references/tags/clear/weekly0.9https://docs.fleek.network/references/tags/cli/weekly0.9https://docs.fleek.network/references/tags/commands/weekly0.9https://docs.fleek.network/references/tags/container/weekly0.9https://docs.fleek.network/references/tags/delete/weekly0.9https://docs.fleek.network/references/tags/docker/weekly0.9https://docs.fleek.network/references/tags/file-permissions/weekly0.9https://docs.fleek.network/references/tags/fix/weekly0.9https://docs.fleek.network/references/tags/frozen/weekly0.9https://docs.fleek.network/references/tags/help/weekly0.9https://docs.fleek.network/references/tags/idle/weekly0.9https://docs.fleek.network/references/tags/image/weekly0.9https://docs.fleek.network/references/tags/keystore/weekly0.9https://docs.fleek.network/references/tags/lightning/weekly0.9https://docs.fleek.network/references/tags/lost-keys/weekly0.9https://docs.fleek.network/references/tags/ownership/weekly0.9https://docs.fleek.network/references/tags/permissions/weekly0.9https://docs.fleek.network/references/tags/pkill/weekly0.9https://docs.fleek.network/references/tags/process/weekly0.9https://docs.fleek.network/references/tags/reference/weekly0.9https://docs.fleek.network/references/tags/references/weekly0.9https://docs.fleek.network/references/tags/remove/weekly0.9https://docs.fleek.network/references/tags/restore/weekly0.9https://docs.fleek.network/references/tags/root/weekly0.9https://docs.fleek.network/references/tags/service-error/weekly0.9https://docs.fleek.network/references/tags/shutdown/weekly0.9https://docs.fleek.network/references/tags/sudoer/weekly0.9https://docs.fleek.network/references/tags/systemctl/weekly0.9https://docs.fleek.network/references/tags/systemd/weekly0.9https://docs.fleek.network/references/tags/uninstall/weekly0.9https://docs.fleek.network/references/tags/unit/weekly0.9https://docs.fleek.network/references/tags/update/weekly0.9https://docs.fleek.network/references/tags/upgrade/weekly0.9https://docs.fleek.network/references/tags/user-service/weekly0.9https://docs.fleek.network/search/weekly0.9https://docs.fleek.network/docs/weekly0.9https://docs.fleek.network/docs/develop/client/weekly0.9https://docs.fleek.network/docs/develop/json-rpc/weekly0.9https://docs.fleek.network/docs/develop/overview/weekly0.9https://docs.fleek.network/docs/develop/service-development/weekly0.9https://docs.fleek.network/docs/learn/delivery-acknowledgements/weekly0.9https://docs.fleek.network/docs/learn/developers/weekly0.9https://docs.fleek.network/docs/learn/introduction/weekly0.9https://docs.fleek.network/docs/learn/services/weekly0.9https://docs.fleek.network/docs/learn/the-network/weekly0.9https://docs.fleek.network/docs/learn/token-and-economics/weekly0.9https://docs.fleek.network/docs/node/analyzing-logs/weekly0.9https://docs.fleek.network/docs/node/configuration/weekly0.9https://docs.fleek.network/docs/node/diagnostics/weekly0.9https://docs.fleek.network/docs/node/health-check/weekly0.9https://docs.fleek.network/docs/node/install/weekly0.9https://docs.fleek.network/docs/node/lightning-cli/weekly0.9https://docs.fleek.network/docs/node/overview/weekly0.9https://docs.fleek.network/docs/node/requirements/weekly0.9https://docs.fleek.network/docs/node/systemd-service/weekly0.9https://docs.fleek.network/docs/node/testnet-onboarding/weekly0.9https://docs.fleek.network/docs/Open-source/weekly0.9https://docs.fleek.network/docs/Open-source/code-of-conduct/weekly0.9https://docs.fleek.network/docs/Open-source/contributing/weekly0.9https://docs.fleek.network/docs/Open-source/repositories/weekly0.9https://docs.fleek.network/docs/roadmap/weekly0.9https://docs.fleek.network/docs/whitepaper/weekly0.9https://docs.fleek.network/guides/weekly0.9https://docs.fleek.network/guides/Node%20Operators/getting-started/weekly0.9https://docs.fleek.network/guides/Node%20Operators/how-to-manage-log-files/weekly0.9https://docs.fleek.network/guides/Node%20Operators/managing-the-keystore/weekly0.9https://docs.fleek.network/guides/Node%20Operators/running-a-node-in-docker/weekly0.9https://docs.fleek.network/guides/Node%20Operators/transfering-setup-ownership/weekly0.9https://docs.fleek.network/guides/Node%20Operators/updating-lightning/weekly0.9https://docs.fleek.network/references/weekly0.9https://docs.fleek.network/references/Docker/build-and-run-in-docker/weekly0.9https://docs.fleek.network/references/Docker/frequently-used-commands-for-docker-setup/weekly0.9https://docs.fleek.network/references/Docker/uninstall-docker-setup/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/backing-up-the-keystore/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/error-building-on-arm64/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/error-linking-with-cc-failed-exist-status-1/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/file-permissions-and-ownership/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/frequently-used-commands-for-native-setup/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/keys-not-found/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/node-secret-key-does-not-exist/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/permission-denied-os-error-13/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/restore-the-keystore/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/uninstall-lightning-node/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/update-cli-from-source-code/weekly0.9https://docs.fleek.network/references/Systemd/service-keeps-running-after-shutdown/weekly0.9https://docs.fleek.network/references/Systemd/shutting-down-persistance/weekly0.9https://docs.fleek.network/references/Systemd/user-service/weekly0.9https://docs.fleek.network/weekly0.9 \ No newline at end of file +https://docs.fleek.network/blog/weekly0.9https://docs.fleek.network/blog/archive/weekly0.9https://docs.fleek.network/blog/bloom-and-cuckoo-filters-for-cache-summarization/weekly0.9https://docs.fleek.network/blog/tags/weekly0.9https://docs.fleek.network/blog/tags/blog/weekly0.9https://docs.fleek.network/blog/tags/content-routing/weekly0.9https://docs.fleek.network/blog/tags/engineering/weekly0.9https://docs.fleek.network/blog/tags/fleek-network/weekly0.9https://docs.fleek.network/search/weekly0.9https://docs.fleek.network/docs/tags/weekly0.9https://docs.fleek.network/docs/tags/about/weekly0.9https://docs.fleek.network/docs/tags/algorithms/weekly0.9https://docs.fleek.network/docs/tags/architecture/weekly0.9https://docs.fleek.network/docs/tags/awards/weekly0.9https://docs.fleek.network/docs/tags/build/weekly0.9https://docs.fleek.network/docs/tags/cdn/weekly0.9https://docs.fleek.network/docs/tags/cli/weekly0.9https://docs.fleek.network/docs/tags/client/weekly0.9https://docs.fleek.network/docs/tags/code-of-conduct/weekly0.9https://docs.fleek.network/docs/tags/codebase/weekly0.9https://docs.fleek.network/docs/tags/command-line-interface/weekly0.9https://docs.fleek.network/docs/tags/compile/weekly0.9https://docs.fleek.network/docs/tags/configuration/weekly0.9https://docs.fleek.network/docs/tags/consensus/weekly0.9https://docs.fleek.network/docs/tags/contribute/weekly0.9https://docs.fleek.network/docs/tags/control/weekly0.9https://docs.fleek.network/docs/tags/decentralization/weekly0.9https://docs.fleek.network/docs/tags/develop/weekly0.9https://docs.fleek.network/docs/tags/diagnostic/weekly0.9https://docs.fleek.network/docs/tags/diagnostics/weekly0.9https://docs.fleek.network/docs/tags/economics/weekly0.9https://docs.fleek.network/docs/tags/edge-network/weekly0.9https://docs.fleek.network/docs/tags/edge-platform/weekly0.9https://docs.fleek.network/docs/tags/fleek-network/weekly0.9https://docs.fleek.network/docs/tags/getting-started/weekly0.9https://docs.fleek.network/docs/tags/git/weekly0.9https://docs.fleek.network/docs/tags/guide/weekly0.9https://docs.fleek.network/docs/tags/healthcheck/weekly0.9https://docs.fleek.network/docs/tags/incentives/weekly0.9https://docs.fleek.network/docs/tags/learn/weekly0.9https://docs.fleek.network/docs/tags/lgtn/weekly0.9https://docs.fleek.network/docs/tags/lightning/weekly0.9https://docs.fleek.network/docs/tags/logs/weekly0.9https://docs.fleek.network/docs/tags/manage/weekly0.9https://docs.fleek.network/docs/tags/manual/weekly0.9https://docs.fleek.network/docs/tags/node-status/weekly0.9https://docs.fleek.network/docs/tags/onboarding/weekly0.9https://docs.fleek.network/docs/tags/open-source/weekly0.9https://docs.fleek.network/docs/tags/permissionless/weekly0.9https://docs.fleek.network/docs/tags/phases/weekly0.9https://docs.fleek.network/docs/tags/pledge/weekly0.9https://docs.fleek.network/docs/tags/ports/weekly0.9https://docs.fleek.network/docs/tags/protocol/weekly0.9https://docs.fleek.network/docs/tags/repository/weekly0.9https://docs.fleek.network/docs/tags/reputation/weekly0.9https://docs.fleek.network/docs/tags/requirements/weekly0.9https://docs.fleek.network/docs/tags/rewards/weekly0.9https://docs.fleek.network/docs/tags/roadmap/weekly0.9https://docs.fleek.network/docs/tags/rpc/weekly0.9https://docs.fleek.network/docs/tags/rust-dependencies/weekly0.9https://docs.fleek.network/docs/tags/sdk/weekly0.9https://docs.fleek.network/docs/tags/server/weekly0.9https://docs.fleek.network/docs/tags/services/weekly0.9https://docs.fleek.network/docs/tags/snarks/weekly0.9https://docs.fleek.network/docs/tags/standards/weekly0.9https://docs.fleek.network/docs/tags/systemctl/weekly0.9https://docs.fleek.network/docs/tags/systemd/weekly0.9https://docs.fleek.network/docs/tags/testnet/weekly0.9https://docs.fleek.network/docs/tags/token/weekly0.9https://docs.fleek.network/docs/tags/tokenomics/weekly0.9https://docs.fleek.network/docs/tags/toolkit/weekly0.9https://docs.fleek.network/docs/tags/verification/weekly0.9https://docs.fleek.network/docs/tags/whitepaper/weekly0.9https://docs.fleek.network/docs/tags/wizard/weekly0.9https://docs.fleek.network/docs/weekly0.9https://docs.fleek.network/docs/develop/client/weekly0.9https://docs.fleek.network/docs/develop/json-rpc/weekly0.9https://docs.fleek.network/docs/develop/overview/weekly0.9https://docs.fleek.network/docs/develop/service-development/weekly0.9https://docs.fleek.network/docs/learn/delivery-acknowledgements/weekly0.9https://docs.fleek.network/docs/learn/developers/weekly0.9https://docs.fleek.network/docs/learn/introduction/weekly0.9https://docs.fleek.network/docs/learn/services/weekly0.9https://docs.fleek.network/docs/learn/the-network/weekly0.9https://docs.fleek.network/docs/learn/token-and-economics/weekly0.9https://docs.fleek.network/docs/node/analyzing-logs/weekly0.9https://docs.fleek.network/docs/node/configuration/weekly0.9https://docs.fleek.network/docs/node/diagnostics/weekly0.9https://docs.fleek.network/docs/node/health-check/weekly0.9https://docs.fleek.network/docs/node/install/weekly0.9https://docs.fleek.network/docs/node/lightning-cli/weekly0.9https://docs.fleek.network/docs/node/overview/weekly0.9https://docs.fleek.network/docs/node/requirements/weekly0.9https://docs.fleek.network/docs/node/systemd-service/weekly0.9https://docs.fleek.network/docs/node/testnet-onboarding/weekly0.9https://docs.fleek.network/docs/Open-source/weekly0.9https://docs.fleek.network/docs/Open-source/code-of-conduct/weekly0.9https://docs.fleek.network/docs/Open-source/contributing/weekly0.9https://docs.fleek.network/docs/Open-source/repositories/weekly0.9https://docs.fleek.network/docs/roadmap/weekly0.9https://docs.fleek.network/docs/whitepaper/weekly0.9https://docs.fleek.network/guides/tags/weekly0.9https://docs.fleek.network/guides/tags/configuration/weekly0.9https://docs.fleek.network/guides/tags/container/weekly0.9https://docs.fleek.network/guides/tags/docker/weekly0.9https://docs.fleek.network/guides/tags/edge-computing/weekly0.9https://docs.fleek.network/guides/tags/fleek-network/weekly0.9https://docs.fleek.network/guides/tags/getting-started/weekly0.9https://docs.fleek.network/guides/tags/guide/weekly0.9https://docs.fleek.network/guides/tags/guides/weekly0.9https://docs.fleek.network/guides/tags/help/weekly0.9https://docs.fleek.network/guides/tags/keys/weekly0.9https://docs.fleek.network/guides/tags/keystore/weekly0.9https://docs.fleek.network/guides/tags/logs/weekly0.9https://docs.fleek.network/guides/tags/ownership/weekly0.9https://docs.fleek.network/guides/tags/private-keys/weekly0.9https://docs.fleek.network/guides/tags/public-keys/weekly0.9https://docs.fleek.network/guides/tags/rebuild/weekly0.9https://docs.fleek.network/guides/tags/setup/weekly0.9https://docs.fleek.network/guides/tags/transfer/weekly0.9https://docs.fleek.network/guides/tags/update/weekly0.9https://docs.fleek.network/guides/weekly0.9https://docs.fleek.network/guides/Node%20Operators/getting-started/weekly0.9https://docs.fleek.network/guides/Node%20Operators/how-to-manage-log-files/weekly0.9https://docs.fleek.network/guides/Node%20Operators/managing-the-keystore/weekly0.9https://docs.fleek.network/guides/Node%20Operators/running-a-node-in-docker/weekly0.9https://docs.fleek.network/guides/Node%20Operators/transfering-setup-ownership/weekly0.9https://docs.fleek.network/guides/Node%20Operators/updating-lightning/weekly0.9https://docs.fleek.network/references/tags/weekly0.9https://docs.fleek.network/references/tags/backup/weekly0.9https://docs.fleek.network/references/tags/build/weekly0.9https://docs.fleek.network/references/tags/clean/weekly0.9https://docs.fleek.network/references/tags/clear/weekly0.9https://docs.fleek.network/references/tags/cli/weekly0.9https://docs.fleek.network/references/tags/commands/weekly0.9https://docs.fleek.network/references/tags/container/weekly0.9https://docs.fleek.network/references/tags/delete/weekly0.9https://docs.fleek.network/references/tags/docker/weekly0.9https://docs.fleek.network/references/tags/file-permissions/weekly0.9https://docs.fleek.network/references/tags/fix/weekly0.9https://docs.fleek.network/references/tags/frozen/weekly0.9https://docs.fleek.network/references/tags/help/weekly0.9https://docs.fleek.network/references/tags/idle/weekly0.9https://docs.fleek.network/references/tags/image/weekly0.9https://docs.fleek.network/references/tags/keystore/weekly0.9https://docs.fleek.network/references/tags/lightning/weekly0.9https://docs.fleek.network/references/tags/lost-keys/weekly0.9https://docs.fleek.network/references/tags/ownership/weekly0.9https://docs.fleek.network/references/tags/permissions/weekly0.9https://docs.fleek.network/references/tags/pkill/weekly0.9https://docs.fleek.network/references/tags/process/weekly0.9https://docs.fleek.network/references/tags/reference/weekly0.9https://docs.fleek.network/references/tags/references/weekly0.9https://docs.fleek.network/references/tags/remove/weekly0.9https://docs.fleek.network/references/tags/restore/weekly0.9https://docs.fleek.network/references/tags/root/weekly0.9https://docs.fleek.network/references/tags/service-error/weekly0.9https://docs.fleek.network/references/tags/shutdown/weekly0.9https://docs.fleek.network/references/tags/sudoer/weekly0.9https://docs.fleek.network/references/tags/systemctl/weekly0.9https://docs.fleek.network/references/tags/systemd/weekly0.9https://docs.fleek.network/references/tags/uninstall/weekly0.9https://docs.fleek.network/references/tags/unit/weekly0.9https://docs.fleek.network/references/tags/update/weekly0.9https://docs.fleek.network/references/tags/upgrade/weekly0.9https://docs.fleek.network/references/tags/user-service/weekly0.9https://docs.fleek.network/references/weekly0.9https://docs.fleek.network/references/Docker/build-and-run-in-docker/weekly0.9https://docs.fleek.network/references/Docker/frequently-used-commands-for-docker-setup/weekly0.9https://docs.fleek.network/references/Docker/uninstall-docker-setup/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/backing-up-the-keystore/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/error-building-on-arm64/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/error-linking-with-cc-failed-exist-status-1/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/file-permissions-and-ownership/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/frequently-used-commands-for-native-setup/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/keys-not-found/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/node-secret-key-does-not-exist/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/permission-denied-os-error-13/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/restore-the-keystore/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/uninstall-lightning-node/weekly0.9https://docs.fleek.network/references/Lightning%20CLI/update-cli-from-source-code/weekly0.9https://docs.fleek.network/references/Systemd/service-keeps-running-after-shutdown/weekly0.9https://docs.fleek.network/references/Systemd/shutting-down-persistance/weekly0.9https://docs.fleek.network/references/Systemd/user-service/weekly0.9https://docs.fleek.network/weekly0.9 \ No newline at end of file