diff --git a/assets/hunters/Gunner/000.png b/assets/hunters/Gunner/000.png index 9f412e0..350ba58 100644 Binary files a/assets/hunters/Gunner/000.png and b/assets/hunters/Gunner/000.png differ diff --git a/assets/hunters/Gunner/010.png b/assets/hunters/Gunner/010.png index ae289e6..ef86356 100644 Binary files a/assets/hunters/Gunner/010.png and b/assets/hunters/Gunner/010.png differ diff --git a/assets/hunters/Gunner/011.png b/assets/hunters/Gunner/011.png index a376640..de53e72 100644 Binary files a/assets/hunters/Gunner/011.png and b/assets/hunters/Gunner/011.png differ diff --git a/assets/hunters/Gunner/012.png b/assets/hunters/Gunner/012.png index b0391db..7858297 100644 Binary files a/assets/hunters/Gunner/012.png and b/assets/hunters/Gunner/012.png differ diff --git a/assets/hunters/Gunner/020.png b/assets/hunters/Gunner/020.png index 81bbc92..480f2c9 100644 Binary files a/assets/hunters/Gunner/020.png and b/assets/hunters/Gunner/020.png differ diff --git a/assets/hunters/Gunner/021.png b/assets/hunters/Gunner/021.png index d7eec5b..ab2b5d0 100644 Binary files a/assets/hunters/Gunner/021.png and b/assets/hunters/Gunner/021.png differ diff --git a/assets/hunters/Gunner/022.png b/assets/hunters/Gunner/022.png index e1a179c..2a82bc2 100644 Binary files a/assets/hunters/Gunner/022.png and b/assets/hunters/Gunner/022.png differ diff --git a/assets/hunters/Gunner/023.png b/assets/hunters/Gunner/023.png index 3fec8db..76ebc88 100644 Binary files a/assets/hunters/Gunner/023.png and b/assets/hunters/Gunner/023.png differ diff --git a/assets/hunters/Gunner/024.png b/assets/hunters/Gunner/024.png index 8b032ba..e3cab97 100644 Binary files a/assets/hunters/Gunner/024.png and b/assets/hunters/Gunner/024.png differ diff --git a/assets/hunters/Gunner/030.png b/assets/hunters/Gunner/030.png index db817b1..47ce2e8 100644 Binary files a/assets/hunters/Gunner/030.png and b/assets/hunters/Gunner/030.png differ diff --git a/assets/hunters/Gunner/031.png b/assets/hunters/Gunner/031.png index c294ca0..810c653 100644 Binary files a/assets/hunters/Gunner/031.png and b/assets/hunters/Gunner/031.png differ diff --git a/assets/hunters/Gunner/032.png b/assets/hunters/Gunner/032.png index 8d3c389..4f24b9c 100644 Binary files a/assets/hunters/Gunner/032.png and b/assets/hunters/Gunner/032.png differ diff --git a/assets/hunters/Gunner/033.png b/assets/hunters/Gunner/033.png index 81d5695..f41208a 100644 Binary files a/assets/hunters/Gunner/033.png and b/assets/hunters/Gunner/033.png differ diff --git a/assets/hunters/Gunner/040.png b/assets/hunters/Gunner/040.png index 6ef0f44..8aacbbf 100644 Binary files a/assets/hunters/Gunner/040.png and b/assets/hunters/Gunner/040.png differ diff --git a/assets/hunters/Gunner/041.png b/assets/hunters/Gunner/041.png index 523947c..f17449e 100644 Binary files a/assets/hunters/Gunner/041.png and b/assets/hunters/Gunner/041.png differ diff --git a/assets/hunters/Gunner/042.png b/assets/hunters/Gunner/042.png index 3f3588d..1474d14 100644 Binary files a/assets/hunters/Gunner/042.png and b/assets/hunters/Gunner/042.png differ diff --git a/assets/hunters/Gunner/043.png b/assets/hunters/Gunner/043.png index fc009ab..53bd730 100644 Binary files a/assets/hunters/Gunner/043.png and b/assets/hunters/Gunner/043.png differ diff --git a/assets/hunters/Gunner/050.png b/assets/hunters/Gunner/050.png index af081e1..6b57bef 100644 Binary files a/assets/hunters/Gunner/050.png and b/assets/hunters/Gunner/050.png differ diff --git a/assets/hunters/Gunner/051.png b/assets/hunters/Gunner/051.png index 639c7e2..895597e 100644 Binary files a/assets/hunters/Gunner/051.png and b/assets/hunters/Gunner/051.png differ diff --git a/assets/hunters/Gunner/052.png b/assets/hunters/Gunner/052.png index 6a4c321..9862b0f 100644 Binary files a/assets/hunters/Gunner/052.png and b/assets/hunters/Gunner/052.png differ diff --git a/assets/hunters/Gunner/060.png b/assets/hunters/Gunner/060.png index 8bb8d10..946714b 100644 Binary files a/assets/hunters/Gunner/060.png and b/assets/hunters/Gunner/060.png differ diff --git a/assets/hunters/Gunner/100.png b/assets/hunters/Gunner/100.png index 45c0eb8..f8cf550 100644 Binary files a/assets/hunters/Gunner/100.png and b/assets/hunters/Gunner/100.png differ diff --git a/assets/hunters/Gunner/110.png b/assets/hunters/Gunner/110.png index 40e5081..225000d 100644 Binary files a/assets/hunters/Gunner/110.png and b/assets/hunters/Gunner/110.png differ diff --git a/assets/hunters/Gunner/111.png b/assets/hunters/Gunner/111.png index 1926265..1c12baa 100644 Binary files a/assets/hunters/Gunner/111.png and b/assets/hunters/Gunner/111.png differ diff --git a/assets/hunters/Gunner/112.png b/assets/hunters/Gunner/112.png index c76cc30..b31823e 100644 Binary files a/assets/hunters/Gunner/112.png and b/assets/hunters/Gunner/112.png differ diff --git a/assets/hunters/Gunner/120.png b/assets/hunters/Gunner/120.png index bc73167..997724a 100644 Binary files a/assets/hunters/Gunner/120.png and b/assets/hunters/Gunner/120.png differ diff --git a/assets/hunters/Gunner/121.png b/assets/hunters/Gunner/121.png index d0e0d74..269add1 100644 Binary files a/assets/hunters/Gunner/121.png and b/assets/hunters/Gunner/121.png differ diff --git a/assets/hunters/Gunner/122.png b/assets/hunters/Gunner/122.png index 065a389..b698865 100644 Binary files a/assets/hunters/Gunner/122.png and b/assets/hunters/Gunner/122.png differ diff --git a/assets/hunters/Gunner/123.png b/assets/hunters/Gunner/123.png index 72c9ff5..c421ab2 100644 Binary files a/assets/hunters/Gunner/123.png and b/assets/hunters/Gunner/123.png differ diff --git a/assets/hunters/Gunner/124.png b/assets/hunters/Gunner/124.png index 1183b15..29a3b82 100644 Binary files a/assets/hunters/Gunner/124.png and b/assets/hunters/Gunner/124.png differ diff --git a/assets/hunters/Gunner/130.png b/assets/hunters/Gunner/130.png index cd893cc..74103d6 100644 Binary files a/assets/hunters/Gunner/130.png and b/assets/hunters/Gunner/130.png differ diff --git a/assets/hunters/Gunner/131.png b/assets/hunters/Gunner/131.png index b5d587c..b0a9b9d 100644 Binary files a/assets/hunters/Gunner/131.png and b/assets/hunters/Gunner/131.png differ diff --git a/assets/hunters/Gunner/132.png b/assets/hunters/Gunner/132.png index f535247..175b8c3 100644 Binary files a/assets/hunters/Gunner/132.png and b/assets/hunters/Gunner/132.png differ diff --git a/assets/hunters/Gunner/133.png b/assets/hunters/Gunner/133.png index de365ec..fd81b12 100644 Binary files a/assets/hunters/Gunner/133.png and b/assets/hunters/Gunner/133.png differ diff --git a/assets/hunters/Gunner/140.png b/assets/hunters/Gunner/140.png index c0f655e..8265084 100644 Binary files a/assets/hunters/Gunner/140.png and b/assets/hunters/Gunner/140.png differ diff --git a/assets/hunters/Gunner/141.png b/assets/hunters/Gunner/141.png index 9ca2402..93a4d73 100644 Binary files a/assets/hunters/Gunner/141.png and b/assets/hunters/Gunner/141.png differ diff --git a/assets/hunters/Gunner/142.png b/assets/hunters/Gunner/142.png index fa91276..490433d 100644 Binary files a/assets/hunters/Gunner/142.png and b/assets/hunters/Gunner/142.png differ diff --git a/assets/hunters/Gunner/143.png b/assets/hunters/Gunner/143.png index 575f771..38fa2b5 100644 Binary files a/assets/hunters/Gunner/143.png and b/assets/hunters/Gunner/143.png differ diff --git a/assets/hunters/Gunner/150.png b/assets/hunters/Gunner/150.png index 4cbbfce..0ee2033 100644 Binary files a/assets/hunters/Gunner/150.png and b/assets/hunters/Gunner/150.png differ diff --git a/assets/hunters/Gunner/151.png b/assets/hunters/Gunner/151.png index 9808b70..142dcf3 100644 Binary files a/assets/hunters/Gunner/151.png and b/assets/hunters/Gunner/151.png differ diff --git a/assets/hunters/Gunner/152.png b/assets/hunters/Gunner/152.png index 4e7f306..1010494 100644 Binary files a/assets/hunters/Gunner/152.png and b/assets/hunters/Gunner/152.png differ diff --git a/assets/hunters/Gunner/160.png b/assets/hunters/Gunner/160.png index 07677f7..6c4dcab 100644 Binary files a/assets/hunters/Gunner/160.png and b/assets/hunters/Gunner/160.png differ diff --git a/assets/hunters/Gunner/200.png b/assets/hunters/Gunner/200.png index 28bd246..48c76b6 100644 Binary files a/assets/hunters/Gunner/200.png and b/assets/hunters/Gunner/200.png differ diff --git a/assets/hunters/Gunner/210.png b/assets/hunters/Gunner/210.png index 415afdd..4c522a9 100644 Binary files a/assets/hunters/Gunner/210.png and b/assets/hunters/Gunner/210.png differ diff --git a/assets/hunters/Gunner/211.png b/assets/hunters/Gunner/211.png index 1bcb3cb..19d6174 100644 Binary files a/assets/hunters/Gunner/211.png and b/assets/hunters/Gunner/211.png differ diff --git a/assets/hunters/Gunner/212.png b/assets/hunters/Gunner/212.png index b2306d4..31e061d 100644 Binary files a/assets/hunters/Gunner/212.png and b/assets/hunters/Gunner/212.png differ diff --git a/assets/hunters/Gunner/220.png b/assets/hunters/Gunner/220.png index 1819ea1..35e8d91 100644 Binary files a/assets/hunters/Gunner/220.png and b/assets/hunters/Gunner/220.png differ diff --git a/assets/hunters/Gunner/221.png b/assets/hunters/Gunner/221.png index d36ded4..ca8df46 100644 Binary files a/assets/hunters/Gunner/221.png and b/assets/hunters/Gunner/221.png differ diff --git a/assets/hunters/Gunner/222.png b/assets/hunters/Gunner/222.png index 7f39e2f..e40a43c 100644 Binary files a/assets/hunters/Gunner/222.png and b/assets/hunters/Gunner/222.png differ diff --git a/assets/hunters/Gunner/223.png b/assets/hunters/Gunner/223.png index 3fc1ee8..2ad36c7 100644 Binary files a/assets/hunters/Gunner/223.png and b/assets/hunters/Gunner/223.png differ diff --git a/assets/hunters/Gunner/224.png b/assets/hunters/Gunner/224.png index 352fa4a..f3725c9 100644 Binary files a/assets/hunters/Gunner/224.png and b/assets/hunters/Gunner/224.png differ diff --git a/assets/hunters/Gunner/230.png b/assets/hunters/Gunner/230.png index c23c0c7..62422dd 100644 Binary files a/assets/hunters/Gunner/230.png and b/assets/hunters/Gunner/230.png differ diff --git a/assets/hunters/Gunner/231.png b/assets/hunters/Gunner/231.png index f9eaf0c..5021753 100644 Binary files a/assets/hunters/Gunner/231.png and b/assets/hunters/Gunner/231.png differ diff --git a/assets/hunters/Gunner/232.png b/assets/hunters/Gunner/232.png index 5dda67a..2bde971 100644 Binary files a/assets/hunters/Gunner/232.png and b/assets/hunters/Gunner/232.png differ diff --git a/assets/hunters/Gunner/233.png b/assets/hunters/Gunner/233.png index cefdd8d..601d018 100644 Binary files a/assets/hunters/Gunner/233.png and b/assets/hunters/Gunner/233.png differ diff --git a/assets/hunters/Gunner/240.png b/assets/hunters/Gunner/240.png index 942c541..9655fa9 100644 Binary files a/assets/hunters/Gunner/240.png and b/assets/hunters/Gunner/240.png differ diff --git a/assets/hunters/Gunner/241.png b/assets/hunters/Gunner/241.png index 568de44..e7bb66e 100644 Binary files a/assets/hunters/Gunner/241.png and b/assets/hunters/Gunner/241.png differ diff --git a/assets/hunters/Gunner/242.png b/assets/hunters/Gunner/242.png index 558e721..825b8fb 100644 Binary files a/assets/hunters/Gunner/242.png and b/assets/hunters/Gunner/242.png differ diff --git a/assets/hunters/Gunner/243.png b/assets/hunters/Gunner/243.png index f3bf395..600b60a 100644 Binary files a/assets/hunters/Gunner/243.png and b/assets/hunters/Gunner/243.png differ diff --git a/assets/hunters/Gunner/250.png b/assets/hunters/Gunner/250.png index f48e1e9..9c28d49 100644 Binary files a/assets/hunters/Gunner/250.png and b/assets/hunters/Gunner/250.png differ diff --git a/assets/hunters/Gunner/251.png b/assets/hunters/Gunner/251.png index d7d96ae..5043fc6 100644 Binary files a/assets/hunters/Gunner/251.png and b/assets/hunters/Gunner/251.png differ diff --git a/assets/hunters/Gunner/252.png b/assets/hunters/Gunner/252.png index 35c6b2e..f7ecb3b 100644 Binary files a/assets/hunters/Gunner/252.png and b/assets/hunters/Gunner/252.png differ diff --git a/assets/hunters/Gunner/260.png b/assets/hunters/Gunner/260.png index fd43b5f..1f376d2 100644 Binary files a/assets/hunters/Gunner/260.png and b/assets/hunters/Gunner/260.png differ diff --git a/assets/hunters/Operative/000.png b/assets/hunters/Operative/000.png index 9175519..a68512d 100644 Binary files a/assets/hunters/Operative/000.png and b/assets/hunters/Operative/000.png differ diff --git a/assets/hunters/Operative/010.png b/assets/hunters/Operative/010.png index f4fc168..3e5cd46 100644 Binary files a/assets/hunters/Operative/010.png and b/assets/hunters/Operative/010.png differ diff --git a/assets/hunters/Operative/011.png b/assets/hunters/Operative/011.png index 735fb43..c045359 100644 Binary files a/assets/hunters/Operative/011.png and b/assets/hunters/Operative/011.png differ diff --git a/assets/hunters/Operative/012.png b/assets/hunters/Operative/012.png index 5cceaf8..ce319a0 100644 Binary files a/assets/hunters/Operative/012.png and b/assets/hunters/Operative/012.png differ diff --git a/assets/hunters/Operative/020.png b/assets/hunters/Operative/020.png index d614084..3b6466b 100644 Binary files a/assets/hunters/Operative/020.png and b/assets/hunters/Operative/020.png differ diff --git a/assets/hunters/Operative/021.png b/assets/hunters/Operative/021.png index 1f4d2b9..f48a8c4 100644 Binary files a/assets/hunters/Operative/021.png and b/assets/hunters/Operative/021.png differ diff --git a/assets/hunters/Operative/022.png b/assets/hunters/Operative/022.png index 5a8217f..a4e658f 100644 Binary files a/assets/hunters/Operative/022.png and b/assets/hunters/Operative/022.png differ diff --git a/assets/hunters/Operative/023.png b/assets/hunters/Operative/023.png index 95fbc4b..3d49b75 100644 Binary files a/assets/hunters/Operative/023.png and b/assets/hunters/Operative/023.png differ diff --git a/assets/hunters/Operative/030.png b/assets/hunters/Operative/030.png index 5b22696..2007c25 100644 Binary files a/assets/hunters/Operative/030.png and b/assets/hunters/Operative/030.png differ diff --git a/assets/hunters/Operative/031.png b/assets/hunters/Operative/031.png index b26b6ca..4fae1fb 100644 Binary files a/assets/hunters/Operative/031.png and b/assets/hunters/Operative/031.png differ diff --git a/assets/hunters/Operative/032.png b/assets/hunters/Operative/032.png index 593e357..42d05b2 100644 Binary files a/assets/hunters/Operative/032.png and b/assets/hunters/Operative/032.png differ diff --git a/assets/hunters/Operative/040.png b/assets/hunters/Operative/040.png index 6c52085..b2c96e1 100644 Binary files a/assets/hunters/Operative/040.png and b/assets/hunters/Operative/040.png differ diff --git a/assets/hunters/Operative/041.png b/assets/hunters/Operative/041.png index 629ff84..51c82fe 100644 Binary files a/assets/hunters/Operative/041.png and b/assets/hunters/Operative/041.png differ diff --git a/assets/hunters/Operative/042.png b/assets/hunters/Operative/042.png index 5314075..2e32eb9 100644 Binary files a/assets/hunters/Operative/042.png and b/assets/hunters/Operative/042.png differ diff --git a/assets/hunters/Operative/043.png b/assets/hunters/Operative/043.png index e9e4b6c..a958b99 100644 Binary files a/assets/hunters/Operative/043.png and b/assets/hunters/Operative/043.png differ diff --git a/assets/hunters/Operative/044.png b/assets/hunters/Operative/044.png index ae54d10..d051706 100644 Binary files a/assets/hunters/Operative/044.png and b/assets/hunters/Operative/044.png differ diff --git a/assets/hunters/Operative/050.png b/assets/hunters/Operative/050.png index 1070a7d..8b3286c 100644 Binary files a/assets/hunters/Operative/050.png and b/assets/hunters/Operative/050.png differ diff --git a/assets/hunters/Operative/051.png b/assets/hunters/Operative/051.png index f2952f9..ca9156e 100644 Binary files a/assets/hunters/Operative/051.png and b/assets/hunters/Operative/051.png differ diff --git a/assets/hunters/Operative/052.png b/assets/hunters/Operative/052.png index 3e7ca5e..d982328 100644 Binary files a/assets/hunters/Operative/052.png and b/assets/hunters/Operative/052.png differ diff --git a/assets/hunters/Operative/060.png b/assets/hunters/Operative/060.png index 652b5d0..7e6500e 100644 Binary files a/assets/hunters/Operative/060.png and b/assets/hunters/Operative/060.png differ diff --git a/assets/hunters/Operative/100.png b/assets/hunters/Operative/100.png index 382e240..a4c2931 100644 Binary files a/assets/hunters/Operative/100.png and b/assets/hunters/Operative/100.png differ diff --git a/assets/hunters/Operative/110.png b/assets/hunters/Operative/110.png index b79cd69..18e7c98 100644 Binary files a/assets/hunters/Operative/110.png and b/assets/hunters/Operative/110.png differ diff --git a/assets/hunters/Operative/111.png b/assets/hunters/Operative/111.png index 854ba38..204e780 100644 Binary files a/assets/hunters/Operative/111.png and b/assets/hunters/Operative/111.png differ diff --git a/assets/hunters/Operative/112.png b/assets/hunters/Operative/112.png index ca3c143..61d8f2c 100644 Binary files a/assets/hunters/Operative/112.png and b/assets/hunters/Operative/112.png differ diff --git a/assets/hunters/Operative/120.png b/assets/hunters/Operative/120.png index 37d0f96..336a17e 100644 Binary files a/assets/hunters/Operative/120.png and b/assets/hunters/Operative/120.png differ diff --git a/assets/hunters/Operative/121.png b/assets/hunters/Operative/121.png index b31ed52..a7e5b94 100644 Binary files a/assets/hunters/Operative/121.png and b/assets/hunters/Operative/121.png differ diff --git a/assets/hunters/Operative/122.png b/assets/hunters/Operative/122.png index f1d19c3..bd44358 100644 Binary files a/assets/hunters/Operative/122.png and b/assets/hunters/Operative/122.png differ diff --git a/assets/hunters/Operative/123.png b/assets/hunters/Operative/123.png index d715579..9bf4c12 100644 Binary files a/assets/hunters/Operative/123.png and b/assets/hunters/Operative/123.png differ diff --git a/assets/hunters/Operative/130.png b/assets/hunters/Operative/130.png index c5cf997..f8e562b 100644 Binary files a/assets/hunters/Operative/130.png and b/assets/hunters/Operative/130.png differ diff --git a/assets/hunters/Operative/131.png b/assets/hunters/Operative/131.png index 0ffadfc..d4e2ad0 100644 Binary files a/assets/hunters/Operative/131.png and b/assets/hunters/Operative/131.png differ diff --git a/assets/hunters/Operative/132.png b/assets/hunters/Operative/132.png index 4a79b80..02df718 100644 Binary files a/assets/hunters/Operative/132.png and b/assets/hunters/Operative/132.png differ diff --git a/assets/hunters/Operative/140.png b/assets/hunters/Operative/140.png index 6958e0e..0f07a71 100644 Binary files a/assets/hunters/Operative/140.png and b/assets/hunters/Operative/140.png differ diff --git a/assets/hunters/Operative/141.png b/assets/hunters/Operative/141.png index 748bf46..68f4ff6 100644 Binary files a/assets/hunters/Operative/141.png and b/assets/hunters/Operative/141.png differ diff --git a/assets/hunters/Operative/142.png b/assets/hunters/Operative/142.png index 039f3fe..2a1825e 100644 Binary files a/assets/hunters/Operative/142.png and b/assets/hunters/Operative/142.png differ diff --git a/assets/hunters/Operative/143.png b/assets/hunters/Operative/143.png index 1e0ccf5..009e7d5 100644 Binary files a/assets/hunters/Operative/143.png and b/assets/hunters/Operative/143.png differ diff --git a/assets/hunters/Operative/150.png b/assets/hunters/Operative/150.png index ccbff9e..f7bab8f 100644 Binary files a/assets/hunters/Operative/150.png and b/assets/hunters/Operative/150.png differ diff --git a/assets/hunters/Operative/160.png b/assets/hunters/Operative/160.png index f1ad999..dbe5af0 100644 Binary files a/assets/hunters/Operative/160.png and b/assets/hunters/Operative/160.png differ diff --git a/assets/hunters/Operative/200.png b/assets/hunters/Operative/200.png index fdc6ef8..c4cc361 100644 Binary files a/assets/hunters/Operative/200.png and b/assets/hunters/Operative/200.png differ diff --git a/assets/hunters/Operative/210.png b/assets/hunters/Operative/210.png index a89e769..6202b5c 100644 Binary files a/assets/hunters/Operative/210.png and b/assets/hunters/Operative/210.png differ diff --git a/assets/hunters/Operative/211.png b/assets/hunters/Operative/211.png index 5770dc9..e5d1f05 100644 Binary files a/assets/hunters/Operative/211.png and b/assets/hunters/Operative/211.png differ diff --git a/assets/hunters/Operative/212.png b/assets/hunters/Operative/212.png index c0b0088..ccc8a5d 100644 Binary files a/assets/hunters/Operative/212.png and b/assets/hunters/Operative/212.png differ diff --git a/assets/hunters/Operative/220.png b/assets/hunters/Operative/220.png index 5314075..02104c7 100644 Binary files a/assets/hunters/Operative/220.png and b/assets/hunters/Operative/220.png differ diff --git a/assets/hunters/Operative/221.png b/assets/hunters/Operative/221.png index 313da9e..9005adf 100644 Binary files a/assets/hunters/Operative/221.png and b/assets/hunters/Operative/221.png differ diff --git a/assets/hunters/Operative/222.png b/assets/hunters/Operative/222.png index 1b0fab1..fa50960 100644 Binary files a/assets/hunters/Operative/222.png and b/assets/hunters/Operative/222.png differ diff --git a/assets/hunters/Operative/223.png b/assets/hunters/Operative/223.png index 609d92d..cee3025 100644 Binary files a/assets/hunters/Operative/223.png and b/assets/hunters/Operative/223.png differ diff --git a/assets/hunters/Operative/230.png b/assets/hunters/Operative/230.png index 2f8f6e0..0f59370 100644 Binary files a/assets/hunters/Operative/230.png and b/assets/hunters/Operative/230.png differ diff --git a/assets/hunters/Operative/231.png b/assets/hunters/Operative/231.png index 5f24d10..4b598e1 100644 Binary files a/assets/hunters/Operative/231.png and b/assets/hunters/Operative/231.png differ diff --git a/assets/hunters/Operative/232.png b/assets/hunters/Operative/232.png index 3357edb..367019b 100644 Binary files a/assets/hunters/Operative/232.png and b/assets/hunters/Operative/232.png differ diff --git a/assets/hunters/Operative/240.png b/assets/hunters/Operative/240.png index 034eabc..b264101 100644 Binary files a/assets/hunters/Operative/240.png and b/assets/hunters/Operative/240.png differ diff --git a/assets/hunters/Operative/241.png b/assets/hunters/Operative/241.png index d4e3f1e..df67f87 100644 Binary files a/assets/hunters/Operative/241.png and b/assets/hunters/Operative/241.png differ diff --git a/assets/hunters/Operative/242.png b/assets/hunters/Operative/242.png index 854ba38..cacc35f 100644 Binary files a/assets/hunters/Operative/242.png and b/assets/hunters/Operative/242.png differ diff --git a/assets/hunters/Operative/243.png b/assets/hunters/Operative/243.png index b4421e9..3b93c3f 100644 Binary files a/assets/hunters/Operative/243.png and b/assets/hunters/Operative/243.png differ diff --git a/assets/hunters/Operative/244.png b/assets/hunters/Operative/244.png index 6a0caf8..99d6fa0 100644 Binary files a/assets/hunters/Operative/244.png and b/assets/hunters/Operative/244.png differ diff --git a/assets/hunters/Operative/250.png b/assets/hunters/Operative/250.png index ea1e886..d9f8881 100644 Binary files a/assets/hunters/Operative/250.png and b/assets/hunters/Operative/250.png differ diff --git a/assets/hunters/Operative/251.png b/assets/hunters/Operative/251.png index 53b42e4..169a2c5 100644 Binary files a/assets/hunters/Operative/251.png and b/assets/hunters/Operative/251.png differ diff --git a/assets/hunters/Operative/252.png b/assets/hunters/Operative/252.png index 9c6d369..be46504 100644 Binary files a/assets/hunters/Operative/252.png and b/assets/hunters/Operative/252.png differ diff --git a/assets/hunters/Operative/260.png b/assets/hunters/Operative/260.png index 22939d3..e4c0180 100644 Binary files a/assets/hunters/Operative/260.png and b/assets/hunters/Operative/260.png differ diff --git a/assets/hunters/Siren/000.png b/assets/hunters/Siren/000.png index 53d8a90..9103aea 100644 Binary files a/assets/hunters/Siren/000.png and b/assets/hunters/Siren/000.png differ diff --git a/assets/hunters/Siren/010.png b/assets/hunters/Siren/010.png index 14948da..8998b77 100644 Binary files a/assets/hunters/Siren/010.png and b/assets/hunters/Siren/010.png differ diff --git a/assets/hunters/Siren/011.png b/assets/hunters/Siren/011.png index e4b0b7c..a25bd16 100644 Binary files a/assets/hunters/Siren/011.png and b/assets/hunters/Siren/011.png differ diff --git a/assets/hunters/Siren/012.png b/assets/hunters/Siren/012.png index c3be273..bb11b24 100644 Binary files a/assets/hunters/Siren/012.png and b/assets/hunters/Siren/012.png differ diff --git a/assets/hunters/Siren/020.png b/assets/hunters/Siren/020.png index f2c7394..13debb8 100644 Binary files a/assets/hunters/Siren/020.png and b/assets/hunters/Siren/020.png differ diff --git a/assets/hunters/Siren/021.png b/assets/hunters/Siren/021.png index 2df0242..640feab 100644 Binary files a/assets/hunters/Siren/021.png and b/assets/hunters/Siren/021.png differ diff --git a/assets/hunters/Siren/022.png b/assets/hunters/Siren/022.png index 96fe348..35c6dea 100644 Binary files a/assets/hunters/Siren/022.png and b/assets/hunters/Siren/022.png differ diff --git a/assets/hunters/Siren/023.png b/assets/hunters/Siren/023.png index 364e522..8db0afa 100644 Binary files a/assets/hunters/Siren/023.png and b/assets/hunters/Siren/023.png differ diff --git a/assets/hunters/Siren/030.png b/assets/hunters/Siren/030.png index 8399759..f0c2a9c 100644 Binary files a/assets/hunters/Siren/030.png and b/assets/hunters/Siren/030.png differ diff --git a/assets/hunters/Siren/031.png b/assets/hunters/Siren/031.png index 1ee9798..c78b19b 100644 Binary files a/assets/hunters/Siren/031.png and b/assets/hunters/Siren/031.png differ diff --git a/assets/hunters/Siren/032.png b/assets/hunters/Siren/032.png index f78080d..f7da750 100644 Binary files a/assets/hunters/Siren/032.png and b/assets/hunters/Siren/032.png differ diff --git a/assets/hunters/Siren/033.png b/assets/hunters/Siren/033.png index d762646..6e41476 100644 Binary files a/assets/hunters/Siren/033.png and b/assets/hunters/Siren/033.png differ diff --git a/assets/hunters/Siren/034.png b/assets/hunters/Siren/034.png index cee4903..a611738 100644 Binary files a/assets/hunters/Siren/034.png and b/assets/hunters/Siren/034.png differ diff --git a/assets/hunters/Siren/040.png b/assets/hunters/Siren/040.png index dfd867f..4e786d8 100644 Binary files a/assets/hunters/Siren/040.png and b/assets/hunters/Siren/040.png differ diff --git a/assets/hunters/Siren/041.png b/assets/hunters/Siren/041.png index c4073da..8e9279a 100644 Binary files a/assets/hunters/Siren/041.png and b/assets/hunters/Siren/041.png differ diff --git a/assets/hunters/Siren/050.png b/assets/hunters/Siren/050.png index 018aa92..1ff1923 100644 Binary files a/assets/hunters/Siren/050.png and b/assets/hunters/Siren/050.png differ diff --git a/assets/hunters/Siren/051.png b/assets/hunters/Siren/051.png index eb739aa..9711268 100644 Binary files a/assets/hunters/Siren/051.png and b/assets/hunters/Siren/051.png differ diff --git a/assets/hunters/Siren/052.png b/assets/hunters/Siren/052.png index c2c8091..f761884 100644 Binary files a/assets/hunters/Siren/052.png and b/assets/hunters/Siren/052.png differ diff --git a/assets/hunters/Siren/053.png b/assets/hunters/Siren/053.png index ff22b95..18c9c9d 100644 Binary files a/assets/hunters/Siren/053.png and b/assets/hunters/Siren/053.png differ diff --git a/assets/hunters/Siren/06.png b/assets/hunters/Siren/06.png deleted file mode 100644 index ff22b95..0000000 Binary files a/assets/hunters/Siren/06.png and /dev/null differ diff --git a/assets/hunters/Siren/060.png b/assets/hunters/Siren/060.png index 9c9089e..be904cd 100644 Binary files a/assets/hunters/Siren/060.png and b/assets/hunters/Siren/060.png differ diff --git a/assets/hunters/Siren/100.png b/assets/hunters/Siren/100.png index 8644647..3774309 100644 Binary files a/assets/hunters/Siren/100.png and b/assets/hunters/Siren/100.png differ diff --git a/assets/hunters/Siren/110.png b/assets/hunters/Siren/110.png index 6d11514..11e338f 100644 Binary files a/assets/hunters/Siren/110.png and b/assets/hunters/Siren/110.png differ diff --git a/assets/hunters/Siren/111.png b/assets/hunters/Siren/111.png index 05ec849..d1f7c35 100644 Binary files a/assets/hunters/Siren/111.png and b/assets/hunters/Siren/111.png differ diff --git a/assets/hunters/Siren/112.png b/assets/hunters/Siren/112.png index 2e66fff..1424ca1 100644 Binary files a/assets/hunters/Siren/112.png and b/assets/hunters/Siren/112.png differ diff --git a/assets/hunters/Siren/120.png b/assets/hunters/Siren/120.png index 079a0c4..a8024bd 100644 Binary files a/assets/hunters/Siren/120.png and b/assets/hunters/Siren/120.png differ diff --git a/assets/hunters/Siren/121.png b/assets/hunters/Siren/121.png index 9629ee7..2d64e47 100644 Binary files a/assets/hunters/Siren/121.png and b/assets/hunters/Siren/121.png differ diff --git a/assets/hunters/Siren/122.png b/assets/hunters/Siren/122.png index 60dbb58..1c2eb7b 100644 Binary files a/assets/hunters/Siren/122.png and b/assets/hunters/Siren/122.png differ diff --git a/assets/hunters/Siren/123.png b/assets/hunters/Siren/123.png index b4ad9cf..17bd38d 100644 Binary files a/assets/hunters/Siren/123.png and b/assets/hunters/Siren/123.png differ diff --git a/assets/hunters/Siren/130.png b/assets/hunters/Siren/130.png index 66db328..2a94a1a 100644 Binary files a/assets/hunters/Siren/130.png and b/assets/hunters/Siren/130.png differ diff --git a/assets/hunters/Siren/131.png b/assets/hunters/Siren/131.png index ea322c2..4f24c33 100644 Binary files a/assets/hunters/Siren/131.png and b/assets/hunters/Siren/131.png differ diff --git a/assets/hunters/Siren/132.png b/assets/hunters/Siren/132.png index d863ea7..a08b9ca 100644 Binary files a/assets/hunters/Siren/132.png and b/assets/hunters/Siren/132.png differ diff --git a/assets/hunters/Siren/140.png b/assets/hunters/Siren/140.png index b666f5a..da8d996 100644 Binary files a/assets/hunters/Siren/140.png and b/assets/hunters/Siren/140.png differ diff --git a/assets/hunters/Siren/141.png b/assets/hunters/Siren/141.png index e097c78..c2abff3 100644 Binary files a/assets/hunters/Siren/141.png and b/assets/hunters/Siren/141.png differ diff --git a/assets/hunters/Siren/142.png b/assets/hunters/Siren/142.png index ffa058d..4d43645 100644 Binary files a/assets/hunters/Siren/142.png and b/assets/hunters/Siren/142.png differ diff --git a/assets/hunters/Siren/143.png b/assets/hunters/Siren/143.png index 3a45767..2f817b0 100644 Binary files a/assets/hunters/Siren/143.png and b/assets/hunters/Siren/143.png differ diff --git a/assets/hunters/Siren/150.png b/assets/hunters/Siren/150.png index 3707102..f3afa85 100644 Binary files a/assets/hunters/Siren/150.png and b/assets/hunters/Siren/150.png differ diff --git a/assets/hunters/Siren/151.png b/assets/hunters/Siren/151.png index d1050af..d37364c 100644 Binary files a/assets/hunters/Siren/151.png and b/assets/hunters/Siren/151.png differ diff --git a/assets/hunters/Siren/152.png b/assets/hunters/Siren/152.png index baf24fe..3640d4e 100644 Binary files a/assets/hunters/Siren/152.png and b/assets/hunters/Siren/152.png differ diff --git a/assets/hunters/Siren/160.png b/assets/hunters/Siren/160.png index d03ef82..5edd6d7 100644 Binary files a/assets/hunters/Siren/160.png and b/assets/hunters/Siren/160.png differ diff --git a/assets/hunters/Siren/200.png b/assets/hunters/Siren/200.png index b8906d2..87a3648 100644 Binary files a/assets/hunters/Siren/200.png and b/assets/hunters/Siren/200.png differ diff --git a/assets/hunters/Siren/210.png b/assets/hunters/Siren/210.png index 802d113..63870d5 100644 Binary files a/assets/hunters/Siren/210.png and b/assets/hunters/Siren/210.png differ diff --git a/assets/hunters/Siren/211.png b/assets/hunters/Siren/211.png index 2e08912..ab5d97a 100644 Binary files a/assets/hunters/Siren/211.png and b/assets/hunters/Siren/211.png differ diff --git a/assets/hunters/Siren/212.png b/assets/hunters/Siren/212.png index 6e6a9a5..c5136b2 100644 Binary files a/assets/hunters/Siren/212.png and b/assets/hunters/Siren/212.png differ diff --git a/assets/hunters/Siren/220.png b/assets/hunters/Siren/220.png index 05e7f41..c64b905 100644 Binary files a/assets/hunters/Siren/220.png and b/assets/hunters/Siren/220.png differ diff --git a/assets/hunters/Siren/221.png b/assets/hunters/Siren/221.png index b780794..497281a 100644 Binary files a/assets/hunters/Siren/221.png and b/assets/hunters/Siren/221.png differ diff --git a/assets/hunters/Siren/222.png b/assets/hunters/Siren/222.png index 9fe1c96..a9281a1 100644 Binary files a/assets/hunters/Siren/222.png and b/assets/hunters/Siren/222.png differ diff --git a/assets/hunters/Siren/223.png b/assets/hunters/Siren/223.png index 7a79665..cf6128d 100644 Binary files a/assets/hunters/Siren/223.png and b/assets/hunters/Siren/223.png differ diff --git a/assets/hunters/Siren/230.png b/assets/hunters/Siren/230.png index dffc60b..91402b9 100644 Binary files a/assets/hunters/Siren/230.png and b/assets/hunters/Siren/230.png differ diff --git a/assets/hunters/Siren/231.png b/assets/hunters/Siren/231.png index f6af2ca..1fe96df 100644 Binary files a/assets/hunters/Siren/231.png and b/assets/hunters/Siren/231.png differ diff --git a/assets/hunters/Siren/232.png b/assets/hunters/Siren/232.png index d4b99ca..413772c 100644 Binary files a/assets/hunters/Siren/232.png and b/assets/hunters/Siren/232.png differ diff --git a/assets/hunters/Siren/240.png b/assets/hunters/Siren/240.png index 3e7b76d..2ef74d2 100644 Binary files a/assets/hunters/Siren/240.png and b/assets/hunters/Siren/240.png differ diff --git a/assets/hunters/Siren/241.png b/assets/hunters/Siren/241.png index 2def3ac..fb10d17 100644 Binary files a/assets/hunters/Siren/241.png and b/assets/hunters/Siren/241.png differ diff --git a/assets/hunters/Siren/242.png b/assets/hunters/Siren/242.png index 5409e6d..9368291 100644 Binary files a/assets/hunters/Siren/242.png and b/assets/hunters/Siren/242.png differ diff --git a/assets/hunters/Siren/243.png b/assets/hunters/Siren/243.png index 88e2dfd..f39e40b 100644 Binary files a/assets/hunters/Siren/243.png and b/assets/hunters/Siren/243.png differ diff --git a/assets/hunters/Siren/250.png b/assets/hunters/Siren/250.png index 32c9d0d..59bd4c0 100644 Binary files a/assets/hunters/Siren/250.png and b/assets/hunters/Siren/250.png differ diff --git a/assets/hunters/Siren/251.png b/assets/hunters/Siren/251.png index 00ea2d0..b3fa4f6 100644 Binary files a/assets/hunters/Siren/251.png and b/assets/hunters/Siren/251.png differ diff --git a/assets/hunters/Siren/252.png b/assets/hunters/Siren/252.png index aaf320b..5c7adab 100644 Binary files a/assets/hunters/Siren/252.png and b/assets/hunters/Siren/252.png differ diff --git a/assets/hunters/Siren/260.png b/assets/hunters/Siren/260.png index bc457ec..ce6df05 100644 Binary files a/assets/hunters/Siren/260.png and b/assets/hunters/Siren/260.png differ diff --git a/beastmaster/index.html b/beastmaster/index.html index 5865a58..c080a1f 100644 --- a/beastmaster/index.html +++ b/beastmaster/index.html @@ -1 +1 @@ -Borderlands 3 Skill Planner \ No newline at end of file +Borderlands 3 Skill Planner \ No newline at end of file diff --git a/bundle.2a8cb50f.js b/bundle.2a8cb50f.js deleted file mode 100644 index 8594cbe..0000000 --- a/bundle.2a8cb50f.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(n){return e[n]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="/",n(n.s=0)}({"/Yqc":function(e,n){function t(){return"serviceWorker"in navigator&&("https:"===window.location.protocol||"localhost"===window.location.hostname||0===window.location.hostname.indexOf("127."))}n.install=function(e){if(e||(e={}),t()){var n=navigator.serviceWorker.register("/sw.js",{}),a=function(e){function n(){switch(o.state){case"redundant":r("onUpdateFailed"),o.onstatechange=null;break;case"installing":a||r("onUpdating");break;case"installed":i||r("onUpdateReady");break;case"activated":r("onUpdated"),o.onstatechange=null}}function t(){switch(o.state){case"redundant":o.onstatechange=null;break;case"installing":case"installed":break;case"activated":r("onInstalled"),o.onstatechange=null}}var a,i,s,o=e.installing||e.waiting;o&&!o.onstatechange&&(e.active?(n(),s=n):(t(),s=t),a=!0,e.waiting&&(i=!0),o.onstatechange=s)},r=function(n){"function"==typeof e[n]&&e[n]({source:"ServiceWorker"})};n.then(function(e){e&&(a(e),e.onupdatefound=function(){a(e)})}).catch(function(e){return r("onError"),Promise.reject(e)})}},n.applyUpdate=function(e,n){t()&&navigator.serviceWorker.getRegistration().then(function(t){t&&t.waiting?(t.waiting.postMessage({action:"skipWaiting"}),e&&e()):n&&n()})},n.update=function(){t()&&navigator.serviceWorker.getRegistration().then(function(e){if(e)return e.update()})}},0:function(e,n,t){e.exports=t("QfWi")},"31cR":function(e){e.exports={skill:"_3JH8h",enabled:"_1mLSi",usable:"_1xemn",augment:"_3VkFk",actionSkill:"-z8wv",chevron:"_2t_-G",diamond:"_2ej0d",image:"_8ejWg",ranks:"_3DD7O",skillTitle:"_394yV",description:"_1S9-f",effect:"oiyDq"}},"9fQE":function(e,n,t){"use strict";(function(e){function a(n){var t=n.path;return e("nav",null,[{name:"Zane",path:"/operative"},{name:"Amara",path:"/siren"},{name:"FL4K",path:"/beastmaster"},{name:"Moze",path:"/gunner"}].map(function(n){return t===n.path?null:e(r.a,{href:n.path},n.name)}))}t.d(n,"a",function(){return a});var r=t("Y3FI")}).call(this,t("gDde").h)},"Et/u":function(e,n,t){"use strict";function a(e,n){return Math.round(e*n*10)/10}function r(e,n,t){return Math.floor(e*t)}var i=t("LMbI");n.a={Brawl:{0:{Phaseslam:{text:"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,98)+" (increases with character level)\nCooldown: 35 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Root to Rise":{ranks:5,text:"Amara gains increased Maximum Health.",effect:function(e){return"Maximum Health: +"+a(e,8)+"%"}},"Personal Space":{ranks:3,text:"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.",effect:function(e){return"Bonus Damage: Up to +"+a(e,18)+"% of damage dealt"}},Clarity:{ranks:5,text:"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.",effect:function(e){return"Health Regen: Up to +"+a(e,1)+"% of Missing Health/sec\nAdditional Regen: Up to +"+a(e,1)+"% of Missing Health/sec\nDuration: 5 seconds"}}},2:{"Arms Deal":{ranks:5,text:"Amara deals increased Splash Damage and takes reduced Splash Damage.",effect:function(e){return"Splash Damage: +"+a(e,4)+"%\nSplash Damage Resistance: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}},Samsara:{ranks:3,text:"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.",effect:function(e){return"Gun Damage: +"+a(e,1.7)+"% per stack\nHealth Regen: +"+a(e,1.7)+"% of Missing Health/sec per stack\nMaximum Stacks: 5\nDuration: 20 seconds"}},"Helping Hand(s)":{ranks:5,text:"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Resistance.",effect:function(e){return"Damage Resistance: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%\nDuration: 15 seconds"}},"Blight Tiger":{ranks:0,text:"Converts Amara's Action Skill to Corrosive Damage.",effect:function(){return"Action Skill Element: Corrosive."},type:i.a.AUGMENT_DIAMOND}},3:{Fracture:{ranks:0,text:"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level)\nCooldown: 28 seconds"},type:i.a.AUGMENT_ACTION_SKILL},Mindfulness:{ranks:3,text:"Whenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.",effect:function(e){return"Shield Regeneration Delay: -"+function(e){switch(e){case 1:return 9;case 2:return 17;case 3:return 23;default:return 0}}(e)+"% per stack\nMovement Speed: +"+a(e,1.4)+"% per stack\nMaximum Stacks: 25\nDuration: 5 seconds"}},"Find Your Center":{ranks:1,text:"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.",effect:function(){return"Melee Damage: +100%\nMelee Range: +75%\nDuration: 20 seconds"}},Vigor:{ranks:3,text:"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.",effect:function(e){return"Team Movement Speed: +"+a(e,3.333)+"%\nDuration: 8 seconds"}},Revelation:{ranks:0,text:"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.",effect:function(e){return"Nova Damage: "+r(e,0,41)+" (increases with character level)\nAction Skill Damage: -15%"},type:i.a.AUGMENT_CHEVRON}},4:{Downfall:{ranks:0,text:"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam. Element: Shock.",effect:function(e){return"Beam Damage: "+r(e,0,14)+" per second (increases with character level)\nSlam Damage: "+r(e,0,95)+" (increases with character level)\nCooldown: 47 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"One With Nature":{ranks:5,text:"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.",effect:function(e){return"Maximum Health: +"+a(e,5)+"%\nElemental Damage Resistance: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}}},5:{"Do Unto Others":{ranks:1,text:"Whenever an enemy damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.",effect:function(){return"Cooldown: 8 seconds"}},"Jab Cross":{ranks:5,text:"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.",effect:function(e){return"Action Skill Damage: +"+a(e,15)+"%\nGun Damage: +"+a(e,3)+"%\nDuration: 10 seconds"}},"Guardian Angel":{ranks:1,text:"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.",effect:function(){return"Health Restored: 50% of Maximum Health\nCooldown: 120 seconds"}},Glamour:{ranks:0,text:"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.",effect:function(){return"Confuse Duration: 8 seconds\nAction Skill Damage: -10%\nAction Skill Cooldown: +20%"},type:i.a.AUGMENT_CHEVRON}},6:{Blitz:{ranks:1,text:"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.",effect:function(){return"Melee Damage: +100%\nCooldown: 8 seconds"}}}},"Mystical Assault":{0:{Phasecast:{text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,92)+"\nCooldown: 28 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Do Harm":{ranks:5,text:"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.",effect:function(e){return"Action Skill Dmg: +"+a(e,.9)+"% per Rush stack consumed\nMaximum Rush Stacks: 10\nDuration: 20 seconds"}},"Fast Hand(s)":{ranks:3,text:"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.",effect:function(e){return"Reload Speed: +"+function(e){switch(e){case 1:return 7;case 2:return 14;case 3:return 19;default:return 0}}(e)+"%\nWeapon Swap Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%\nMode Switch Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%"}},"Violent Tapestry":{ranks:5,text:"Applying a Status Effect grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.",effect:function(e){return"StatusEffect Chance: +"+a(e,.6)+"% per Rush stack consumed\nMaximum Rush Stacks: 10\nDuration: 20 seconds"}}},2:{Alacrity:{ranks:5,text:"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.",effect:function(e){return"Reload Speed: +"+a(e,.4)+"% per Rush stack\nAdditional Reload Speed: +"+function(e){switch(e){case 1:return.6;case 2:return 1.2;case 3:return 1.8;case 4:return 2.3;case 5:return 2.9;default:return 0}}(e)+"% per Rush stack consumed\nDuration: 8 seconds"}},Transcend:{ranks:3,text:"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.",effect:function(e){return"Accuracy: +"+function(e){switch(e){case 1:return 17;case 2:return 29;case 3:return 38;default:return 0}}(e)+"%\nCritical Hit Damage: +"+a(e,9)+"%\nDuration: 12 seconds"}},Restless:{ranks:5,text:"Amara gains increased Action Skill Cooldown Rate.",effect:function(e){return"Action Skill Cooldown Rate: +"+a(e,5)+"%"}},"Soul Sap":{ranks:0,text:"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.",effect:function(){return"Action Skill Life Steal: 30% of damage dealt"},type:i.a.AUGMENT_CHEVRON}},3:{Deliverance:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,86)+" (increases with character level)\nElemental Projectiles: 3 per enemy or object hit\nCooldown: 28 seconds"},type:i.a.AUGMENT_ACTION_SKILL},Ascendant:{ranks:1,text:"All Action Skill Augments gain increased effects.",effect:function(){return"Soul Sap Life Steal: +20%\nAllure Radius: +100%\nGlamour Duration: +50%\nStillness of Mind: Breaks 0.75 sec after taking dmg\nRevelation Damage: +25%"}},"Stillness of Mind":{ranks:0,text:"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.",effect:function(){return"Phaselock Duration: 6 seconds\nAction Skill Damage: -25%\nAction Skill Cooldown: +15%"},type:i.a.AUGMENT_CHEVRON}},4:{Reverberation:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astral Projection deals increased damage for every enemy it hits. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level)\nDamage Bonus: +50% per enemy hit\nCooldown: 30 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"From Rest":{ranks:3,text:"Amara gains improved Fire Rate and Charge Time.",effect:function(e){return"Fire Rate: +"+a(e,4)+"%\nCharge Time: +"+function(e){switch(e){case 1:return 21;case 2:return 34;case 3:return 44;default:return 0}}(e)+"%"}},"Laid Bare":{ranks:3,text:"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.",effect:function(e){return"Damage Increase: +"+a(e,8.333)+"%\nDuration: 8 seconds"}},Wrath:{ranks:3,text:"Amara gains increased Gun Damage. This effect is increased after she activates her Action Skill for a few seconds.",effect:function(e){return"Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"%\nAdditional Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"%\nDuration: 8 seconds"}}},5:{Remnant:{ranks:3,text:"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.",effect:function(e){return"Remnant Base Damage: "+r(e,0,9)+" (increases with character level)"}},Awakening:{ranks:3,text:"Amara's Rush stacks gain increased effectiveness.",effect:function(e){return"Rush Stack Effectiveness: +"+a(e,10)+"%"}},Tandava:{ranks:0,text:"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,91)+" (increases with character level)\nCooldown: 35 seconds"},type:i.a.AUGMENT_ACTION_SKILL}},6:{Avatar:{ranks:1,text:"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.",effect:function(){return"Maximum Rush Stacks: +10"}}}},"Fist of the Elements":{0:{Phasegrasp:{text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Skill Duration: 7 seconds\nCooldown: 16 seconds\nGrasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.ACTION_SKILL,ranks:0}},1:{Anima:{ranks:5,text:"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.",effect:function(e){return"Action Skill Status Effect Damage: +"+a(e,8)+"%\nOther Status Effect Damage: +"+a(e,4)+"%\nStatus Effect Duration: +"+a(e,20)+"%"}},"Steady Hands":{ranks:3,text:"Amara gains increased Weapon Handling and Accuracy.",effect:function(e){return"Handling: +"+function(e){switch(e){case 1:return 14;case 2:return 24;case 3:return 32;default:return 0}}(e)+"%\nAccuracy: +"+function(e){switch(e){case 1:return 13;case 2:return 23;case 3:return 31;default:return 0}}(e)+"%"}},Infusion:{ranks:5,text:"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.",effect:function(e){return"Converted Damage: "+a(e,8)+"%"}}},2:{Tempest:{ranks:5,text:"Amara deals increased Elemental Damage. Shock Damage is further increased.",effect:function(e){return"Shock Damage: +"+a(e,8)+"%\nOther Elemental Damage: +"+a(e,6)+"%"}},"Illuminated Fist":{ranks:1,text:"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.",effect:function(){return"Melee Damage: +75%"}},Wildfire:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.",effect:function(e){return"Spread Chance: +"+a(e,8)+"%"}},Soulfire:{ranks:0,text:"Converts Amara's Action Skill to Incendiary Damage.",effect:function(){return"Action Skill Element: Incendiary."},type:i.a.AUGMENT_DIAMOND}},3:{"The Eternal Fist":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Bonus Targets: Up to +4\nDuration: 7 seconds\nCooldown: 20 seconds\nGrasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Dread:{ranks:1,text:"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.",effect:function(){return"Gun Damage: +15%\nDuration: 8 seconds"}},Allure:{ranks:0,text:"Amara's Action Skill creates a singularity that pulls in enemies.",effect:function(){return"Duration: 2.5 seconds\nAction Skill Damage: -20%"},type:i.a.AUGMENT_CHEVRON}},4:{Indiscriminate:{ranks:3,text:"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Ricochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.",effect:function(e){return"Ricochet Chance: +"+a(e,10)+"%\nRicochet Damage: -50%\nAction Skill Ricochet Chance: +"+a(e,20)+"%\nAction Skill Ricochet Damage: -25%"}},"Deep Well":{ranks:1,text:"Amara gains increased Magazine Size with elemental weapons.",effect:function(){return"Magazine Size: +20%"}},Catharsis:{ranks:3,text:"Whenever Amara triggers an elemental effect on an enemy, when that enemy dies that enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.",effect:function(e){return"Damage: "+r(e,0,4)+" (increases with character level)\nCooldown: 8 seconds"}},"Ties That Bind":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Linked Damage: 35% of damage dealt\nDuration: 7 seconds\nCooldown: 18 seconds\nGrasp Immune Damage: "+r(e,0,34)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL}},5:{"Fist Over Matter":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,35)+" (increases with character level)\nDuration: 7 seconds\nCooldown: 28 seconds\nGrasp Immune Damage: "+r(e,0,39)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Sustainment:{ranks:5,text:"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.",effect:function(e){return"Elemental Weapon Life Steal: +"+a(e,4)+"% of damage dealt"}},Conflux:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.",effect:function(e){return"Extra Status Effect Chance: +"+a(e,7)+"%"}}},6:{"Forceful Expression":{ranks:1,text:"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.",effect:function(){return"Bonus Elemental Damage: +18% of damage dealt"}}}}}},Fl18:function(e,n,t){"use strict";(function(e){var a=t("laFY"),r=t.n(a),i=e("span",null,e("a",{href:"https://borderlands.com/"},"Official Borderlands website")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com"},"Source Code")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/bug"},e("img",{alt:"GitHub issues: bugs",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/bug"}))," ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/enhancement"},e("img",{alt:"GitHub issues: enhancements",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/enhancement"}))," ",e("img",{alt:"GitHub contributors",src:"https://img.shields.io/github/contributors/seigler/bl3skills.com"}));n.a=function(){return e("footer",{class:r.a.footer},i)}}).call(this,t("gDde").h)},G9Up:function(e,n,t){"use strict";(function(e){var a=t("Y3FI"),r=t("NZ6x"),i=t("cY+X"),s=t("rFP/"),o=t("x3c/"),c=t("cQx2"),l=e(a.b,null,e(r.a,{path:"/"}),e(i.a,{path:"/operative"}),e(s.a,{path:"/siren"}),e(o.a,{path:"/beastmaster"}),e(c.a,{path:"/gunner"}));n.a=function(){return l}}).call(this,t("gDde").h)},J3pd:function(e,n,t){"use strict";(function(e){function a(){return(a=Object.assign||function(e){for(var n=1;n=5*o-5,level:Object(d.a)(t.state),image:"../../assets/hunters/"+g+"/"+r+o+l+".png",onChange:y(c,r,n,o)}))}))})))}),S=Object(d.a)(this.state);return e("div",null,e("div",{class:h.a.header},e("h1",{class:h.a.title},c,e("div",{class:h.a.subtitle},"the ",g)),e("div",{class:h.a.sidepanel},e("div",{class:h.a.level+" "+(S>50?S>61?h.a.overlevelB:h.a.overlevelA:"")},"Level ",S),e("div",{class:h.a.reset},e("a",{onClick:function(){Object(l.b)(k),t.setState({invested:[0,0,0],skills:k||{}})}},"Reset"))),e(o.a,{path:p})),e("main",null,e("div",{class:h.a.VaultHunter,onContextMenu:r},e("div",{class:h.a.trees},v))),m)},t}(i.Component)}).call(this,t("gDde").h)},LMbI:function(e,n){"use strict";n.a={ACTION_SKILL:1,AUGMENT_CHEVRON:2,AUGMENT_DIAMOND:3,AUGMENT_ACTION_SKILL:4}},MKmk:function(e){e.exports={VaultHunter:"_2zgqJ",header:"_1Jomm",title:"_17kLY",subtitle:"_3J3hw",sidepanel:"_2UO55",level:"xH9ts",reset:"K9CBr",overlevelA:"_1LE8c",overlevelB:"_1vOfn",trees:"_3ek45",tier:"_3Ch4X",treeName:"_1WAM2",tree:"gRWZY",skills:"_2Su0b",green:"-Pl7G",blue:"_1nm1I",red:"_3T1pZ"}},NZ6x:function(e,n,t){"use strict";(function(e){var a=t("Y3FI"),r=t("Fl18"),i=t("odKX"),s=t.n(i),o=e(r.a,null);n.a=function(){return e("div",null,e("div",{class:s.a.splash},e("div",{class:s.a.wrapper},e("h1",null,e("div",{class:s.a.disclaimer},"(Unofficial)"),"Borderlands 3 skill calculator"),[{name:"Zane",job:"the Operative",path:"/operative"},{name:"Amara",job:"the Siren",path:"/siren"},{name:"FL4K",job:"the Beastmaster",path:"/beastmaster"},{name:"Moze",job:"the Gunner",path:"/gunner"}].map(function(n){return e(a.a,{class:s.a.link,href:n.path},e("div",{class:s.a.name},n.name,e("div",{class:s.a.job},n.job)))}))),o)}}).call(this,t("gDde").h)},QfWi:function(e,n,t){"use strict";t.r(n);var a=t("gDde"),r=t("G9Up"),i=(t("pyAK"),document.querySelector("#app"));Object(a.render)(Object(a.h)(r.a,null),i,i.firstElementChild);t("/Yqc").install()},Y3FI:function(e,n,t){"use strict";function a(e,n){for(var t in n)e[t]=n[t];return e}function r(e,n){return e.rankn.rank?-1:e.index-n.index}function i(e,n){return e.index=n,e.rank=function(e){return e.attributes.default?0:(n=e.attributes.path,s(n).map(o).join(""));var n}(e),e.attributes}function s(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")}function o(e){return":"==e.charAt(0)?1+"*+?".indexOf(e.charAt(e.length-1))||4:5}function c(){var e;return""+((e=k&&k.location?k.location:k&&k.getCurrentLocation?k.getCurrentLocation():"undefined"!=typeof location?location:S).pathname||"")+(e.search||"")}function l(e,n){return void 0===n&&(n=!1),"string"!=typeof e&&e.url&&(n=e.replace,e=e.url),function(e){for(var n=y.length;n--;)if(y[n].canRoute(e))return!0;return!1}(e)&&function(e,n){void 0===n&&(n="push"),k&&k[n]?k[n](e):"undefined"!=typeof history&&history[n+"State"]&&history[n+"State"](null,null,e)}(e,n?"replace":"push"),u(e)}function u(e){for(var n=!1,t=0;t0},n.prototype.routeTo=function(e){return this._didRoute=!1,this.setState({url:e}),this.updating?this.canRoute(e):(this.forceUpdate(),this._didRoute)},n.prototype.componentWillMount=function(){y.push(this),this.updating=!0},n.prototype.componentDidMount=function(){var e=this;k&&(this.unlisten=k.listen(function(n){e.routeTo(""+(n.pathname||"")+(n.search||""))})),this.updating=!1},n.prototype.componentWillUnmount=function(){"function"==typeof this.unlisten&&this.unlisten(),y.splice(y.indexOf(this),1)},n.prototype.componentWillUpdate=function(){this.updating=!0},n.prototype.componentDidUpdate=function(){this.updating=!1},n.prototype.getMatchingChildren=function(e,n,t){return e.filter(i).sort(r).map(function(e){var r=function(e,n,t){var a,r=/(?:\?([^#]*))?(#.*)?$/,i=e.match(r),o={};if(i&&i[1])for(var c=i[1].split("&"),l=0;l2;)R.push(arguments[i]);for(n&&null!=n.children&&(R.length||R.push(n.children),delete n.children);R.length;)if((a=R.pop())&&void 0!==a.pop)for(i=a.length;i--;)R.push(a[i]);else"boolean"==typeof a&&(a=null),(r="function"!=typeof e)&&(null==a?a="":"number"==typeof a?a+="":"string"!=typeof a&&(r=!1)),r&&t?s[s.length-1]+=a:s===_?s=[a]:s.push(a),t=r;var o=new M;return o.nodeName=e,o.children=s,o.attributes=null==n?void 0:n,o.key=null==n?void 0:n.key,void 0!==C.vnode&&C.vnode(o),o}function t(e,n){for(var t in n)e[t]=n[t];return e}function a(e,n){null!=e&&("function"==typeof e?e(n):e.current=n)}function r(e){!e.__d&&(e.__d=!0)&&1==T.push(e)&&(C.debounceRendering||E)(i)}function i(){for(var e;e=T.pop();)e.__d&&A(e)}function s(e,n,t){return"string"==typeof n||"number"==typeof n?void 0!==e.splitText:"string"==typeof n.nodeName?!e._componentConstructor&&o(e,n.nodeName):t||e._componentConstructor===n.nodeName}function o(e,n){return e.__n===n||e.nodeName.toLowerCase()===n.toLowerCase()}function c(e){var n=t({},e.attributes);n.children=e.children;var a=e.nodeName.defaultProps;if(void 0!==a)for(var r in a)void 0===n[r]&&(n[r]=a[r]);return n}function l(e){var n=e.parentNode;n&&n.removeChild(e)}function u(e,n,t,r,i){if("className"===n&&(n="class"),"key"===n);else if("ref"===n)a(t,null),a(r,e);else if("class"!==n||i)if("style"===n){if(r&&"string"!=typeof r&&"string"!=typeof t||(e.style.cssText=r||""),r&&"object"==typeof r){if("string"!=typeof t)for(var s in t)s in r||(e.style[s]="");for(var s in r)e.style[s]="number"==typeof r[s]&&!1===N.test(s)?r[s]+"px":r[s]}}else if("dangerouslySetInnerHTML"===n)r&&(e.innerHTML=r.__html||"");else if("o"==n[0]&&"n"==n[1]){var o=n!==(n=n.replace(/Capture$/,""));n=n.toLowerCase().substring(2),r?t||e.addEventListener(n,d,o):e.removeEventListener(n,d,o),(e.__l||(e.__l={}))[n]=r}else if("list"!==n&&"type"!==n&&!i&&n in e){try{e[n]=null==r?"":r}catch(e){}null!=r&&!1!==r||"spellcheck"==n||e.removeAttribute(n)}else{var c=i&&n!==(n=n.replace(/^xlink:?/,""));null==r||!1===r?c?e.removeAttributeNS("http://www.w3.org/1999/xlink",n.toLowerCase()):e.removeAttribute(n):"function"!=typeof r&&(c?e.setAttributeNS("http://www.w3.org/1999/xlink",n.toLowerCase(),r):e.setAttribute(n,r))}else e.className=r||""}function d(e){return this.__l[e.type](C.event&&C.event(e)||e)}function f(){for(var e;e=F.shift();)C.afterMount&&C.afterMount(e),e.componentDidMount&&e.componentDidMount()}function h(e,n,t,a,r,i){H++||(L=null!=r&&void 0!==r.ownerSVGElement,G=null!=e&&!("__preactattr_"in e));var s=m(e,n,t,a,i);return r&&s.parentNode!==r&&r.appendChild(s),--H||(G=!1,i||f()),s}function m(e,n,t,a,r){var i=e,s=L;if(null!=n&&"boolean"!=typeof n||(n=""),"string"==typeof n||"number"==typeof n)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=n&&(e.nodeValue=n):(i=document.createTextNode(n),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0))),i.__preactattr_=!0,i;var c=n.nodeName;if("function"==typeof c)return w(e,n,t,a);if(L="svg"===c||"foreignObject"!==c&&L,c+="",(!e||!o(e,c))&&(i=function(e,n){var t=n?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return t.__n=e,t}(c,L),e)){for(;e.firstChild;)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0)}var l=i.firstChild,u=i.__preactattr_,d=n.children;if(null==u){u=i.__preactattr_={};for(var f=i.attributes,h=f.length;h--;)u[f[h].name]=f[h].value}return!G&&d&&1===d.length&&"string"==typeof d[0]&&null!=l&&void 0!==l.splitText&&null==l.nextSibling?l.nodeValue!=d[0]&&(l.nodeValue=d[0]):(d&&d.length||null!=l)&&g(i,d,t,a,G||null!=u.dangerouslySetInnerHTML),y(i,n.attributes,u),L=s,i}function g(e,n,t,a,r){var i,o,c,u,d,f=e.childNodes,h=[],g={},k=0,y=0,v=f.length,S=0,D=n?n.length:0;if(0!==v)for(var A=0;A2?[].slice.call(arguments,2):e.children)},createRef:function(){return{}},Component:b,render:function(e,n,t){return h(t,e,{},!1,n,!1)},rerender:i,options:C}}()},gqmc:function(e,n,t){"use strict";function a(e){for(var n=0,t=[0,0,0],a=0,r=0,i=Object.values(e);rh.ranks)return!1;u+=h.invested||0}if(u>0&&s+5<5*o)return!1;s+=u,o+=1}t[a]=s,n+=s,a+=1}return!(n>69)&&t}function r(e){for(var n=1;n0)?o.a.usable:""].join(" "),onClick:t,onContextMenu:t},e("div",{class:o.a.image},e("img",{src:b,alt:a(s)})),w&&h>0&&e("div",{class:o.a.ranks},g,"/",h),e("div",{class:o.a.description},e("h3",{class:o.a.skillTitle},s),d,g>0&&e("div",{class:o.a.effect},"Current Effect:",c,v(g,k)),null!==D&&e("div",{class:o.a.effect},v(1,k)),null==D&&g\n {\n pages.map(page => (\n path === page.path ? null : {page.name}\n ))\n }\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Arms Deal Splash Damage Resistance\nfunction getArmsDealSplashDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Helping Hand(s) Damage Resistance\nfunction getHelpingHandsDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Mindfulness Shield Regeneration Delay\nfunction getMindfulnessShieldRegenerationDelay(rank) {\n switch (rank) {\n case 1:\n return 9;\n case 2:\n return 17;\n case 3:\n return 23;\n default:\n return 0;\n }\n}\n\n// One With Nature Elemental Damage Resistance\nfunction getOneWithNatureElementalDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Reload Speed\nfunction getFastHandsReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 7;\n case 2:\n return 14;\n case 3:\n return 19;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Weapon Swap Speed\nfunction getFastHandsWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Mode Switch Speed\nfunction getFastHandsModeSwitchSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Alacrity Reload Speed After Action Skill\nfunction getAlacrityReloadSpeedAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 0.6;\n case 2:\n return 1.2;\n case 3:\n return 1.8;\n case 4:\n return 2.3;\n case 5:\n return 2.9;\n default:\n return 0;\n }\n}\n\n// Transcend Accuracy\nfunction getTranscendAccuracy(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n default:\n return 0;\n }\n}\n\n// From Rest Charge Time\nfunction getFromRestChargeTime(rank) {\n switch (rank) {\n case 1:\n return 21;\n case 2:\n return 34;\n case 3:\n return 44;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage\nfunction getWrathGunDamage(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage After Action Skill\nfunction getWrathGunDamageAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Steady Hands Handling\nfunction getSteadyHandsHandling(rank) {\n switch (rank) {\n case 1:\n return 14;\n case 2:\n return 24;\n case 3:\n return 32;\n default:\n return 0;\n }\n}\n\n// Steady Hands Accuracy\nfunction getSteadyHandsAccuracy(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Brawl\": {\n \"0\": {\n \"Phaseslam\": {\n text: \"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 98)} (increases with character level)\\nCooldown: 35 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Root to Rise\": {\n ranks: 5,\n text: \"Amara gains increased Maximum Health.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 8)}%`,\n },\n \"Personal Space\": {\n ranks: 3,\n text: \"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.\",\n effect: (rank, level) => `Bonus Damage: Up to +${percent(rank, 18)}% of damage dealt`,\n },\n \"Clarity\": {\n ranks: 5,\n text: \"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.\",\n effect: (rank, level) => `Health Regen: Up to +${percent(rank, 1)}% of Missing Health/sec\\nAdditional Regen: Up to +${percent(rank, 1)}% of Missing Health/sec\\nDuration: 5 seconds`,\n },\n },\n \"2\": {\n \"Arms Deal\": {\n ranks: 5,\n text: \"Amara deals increased Splash Damage and takes reduced Splash Damage.\",\n effect: (rank, level) => `Splash Damage: +${percent(rank, 4)}%\\nSplash Damage Resistance: +${getArmsDealSplashDamageResistance(rank)}%`,\n },\n \"Samsara\": {\n ranks: 3,\n text: \"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${percent(rank, 1.7)}% per stack\\nHealth Regen: +${percent(rank, 1.7)}% of Missing Health/sec per stack\\nMaximum Stacks: 5\\nDuration: 20 seconds`,\n },\n \"Helping Hand(s)\": {\n ranks: 5,\n text: \"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Resistance.\",\n effect: (rank, level) => `Damage Resistance: +${getHelpingHandsDamageResistance(rank)}%\\nDuration: 15 seconds`,\n },\n \"Blight Tiger\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Corrosive Damage.\",\n effect: (rank, level) => `Action Skill Element: Corrosive.`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"Fracture\": {\n ranks: 0,\n text: \"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level)\\nCooldown: 28 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Mindfulness\": {\n ranks: 3,\n text: \"Whenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Shield Regeneration Delay: -${getMindfulnessShieldRegenerationDelay(rank)}% per stack\\nMovement Speed: +${percent(rank, 1.4)}% per stack\\nMaximum Stacks: 25\\nDuration: 5 seconds`,\n },\n \"Find Your Center\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.\",\n effect: (rank, level) => `Melee Damage: +100%\\nMelee Range: +75%\\nDuration: 20 seconds`,\n },\n \"Vigor\": {\n ranks: 3,\n text: \"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.\",\n effect: (rank, level) => `Team Movement Speed: +${percent(rank, 3.333)}%\\nDuration: 8 seconds`,\n },\n \"Revelation\": {\n ranks: 0,\n text: \"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.\",\n effect: (rank, level) => `Nova Damage: ${flat(rank, level, 41)} (increases with character level)\\nAction Skill Damage: -15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Downfall\": {\n ranks: 0,\n text: \"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam. Element: Shock.\",\n effect: (rank, level) => `Beam Damage: ${flat(rank, level, 14)} per second (increases with character level)\\nSlam Damage: ${flat(rank, level, 95)} (increases with character level)\\nCooldown: 47 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"One With Nature\": {\n ranks: 5,\n text: \"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 5)}%\\nElemental Damage Resistance: +${getOneWithNatureElementalDamageResistance(rank)}%`,\n },\n },\n \"5\": {\n \"Do Unto Others\": {\n ranks: 1,\n text: \"Whenever an enemy damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.\",\n effect: (rank, level) => `Cooldown: 8 seconds`,\n },\n \"Jab Cross\": {\n ranks: 5,\n text: \"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.\",\n effect: (rank, level) => `Action Skill Damage: +${percent(rank, 15)}%\\nGun Damage: +${percent(rank, 3)}%\\nDuration: 10 seconds`,\n },\n \"Guardian Angel\": {\n ranks: 1,\n text: \"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.\",\n effect: (rank, level) => `Health Restored: 50% of Maximum Health\\nCooldown: 120 seconds`,\n },\n \"Glamour\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.\",\n effect: (rank, level) => `Confuse Duration: 8 seconds\\nAction Skill Damage: -10%\\nAction Skill Cooldown: +20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"6\": {\n \"Blitz\": {\n ranks: 1,\n text: \"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.\",\n effect: (rank, level) => `Melee Damage: +100%\\nCooldown: 8 seconds`,\n },\n },\n },\n \"Mystical Assault\": {\n \"0\": {\n \"Phasecast\": {\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 92)}\\nCooldown: 28 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Do Harm\": {\n ranks: 5,\n text: \"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.\",\n effect: (rank, level) => `Action Skill Dmg: +${percent(rank, 0.9)}% per Rush stack consumed\\nMaximum Rush Stacks: 10\\nDuration: 20 seconds`,\n },\n \"Fast Hand(s)\": {\n ranks: 3,\n text: \"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.\",\n effect: (rank, level) => `Reload Speed: +${getFastHandsReloadSpeed(rank)}%\\nWeapon Swap Speed: +${getFastHandsWeaponSwapSpeed(rank)}%\\nMode Switch Speed: +${getFastHandsModeSwitchSpeed(rank)}%`,\n },\n \"Violent Tapestry\": {\n ranks: 5,\n text: \"Applying a Status Effect grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.\",\n effect: (rank, level) => `StatusEffect Chance: +${percent(rank, 0.6)}% per Rush stack consumed\\nMaximum Rush Stacks: 10\\nDuration: 20 seconds`,\n },\n },\n \"2\": {\n \"Alacrity\": {\n ranks: 5,\n text: \"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.\",\n effect: (rank, level) => `Reload Speed: +${percent(rank, 0.4)}% per Rush stack\\nAdditional Reload Speed: +${getAlacrityReloadSpeedAfterActionSkill(rank)}% per Rush stack consumed\\nDuration: 8 seconds`,\n },\n \"Transcend\": {\n ranks: 3,\n text: \"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.\",\n effect: (rank, level) => `Accuracy: +${getTranscendAccuracy(rank)}%\\nCritical Hit Damage: +${percent(rank, 9)}%\\nDuration: 12 seconds`,\n },\n \"Restless\": {\n ranks: 5,\n text: \"Amara gains increased Action Skill Cooldown Rate.\",\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Soul Sap\": {\n ranks: 0,\n text: \"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.\",\n effect: (rank, level) => `Action Skill Life Steal: 30% of damage dealt`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"3\": {\n \"Deliverance\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 86)} (increases with character level)\\nElemental Projectiles: 3 per enemy or object hit\\nCooldown: 28 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Ascendant\": {\n ranks: 1,\n text: \"All Action Skill Augments gain increased effects.\",\n effect: (rank, level) => `Soul Sap Life Steal: +20%\\nAllure Radius: +100%\\nGlamour Duration: +50%\\nStillness of Mind: Breaks 0.75 sec after taking dmg\\nRevelation Damage: +25%`,\n },\n \"Stillness of Mind\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.\",\n effect: (rank, level) => `Phaselock Duration: 6 seconds\\nAction Skill Damage: -25%\\nAction Skill Cooldown: +15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Reverberation\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astral Projection deals increased damage for every enemy it hits. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level)\\nDamage Bonus: +50% per enemy hit\\nCooldown: 30 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"From Rest\": {\n ranks: 3,\n text: \"Amara gains improved Fire Rate and Charge Time.\",\n effect: (rank, level) => `Fire Rate: +${percent(rank, 4)}%\\nCharge Time: +${getFromRestChargeTime(rank)}%`,\n },\n \"Laid Bare\": {\n ranks: 3,\n text: \"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.\",\n effect: (rank, level) => `Damage Increase: +${percent(rank, 8.333)}%\\nDuration: 8 seconds`,\n },\n \"Wrath\": {\n ranks: 3,\n text: \"Amara gains increased Gun Damage. This effect is increased after she activates her Action Skill for a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${getWrathGunDamage(rank)}%\\nAdditional Gun Damage: +${getWrathGunDamageAfterActionSkill(rank)}%\\nDuration: 8 seconds`,\n },\n },\n \"5\": {\n \"Remnant\": {\n ranks: 3,\n text: \"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.\",\n effect: (rank, level) => `Remnant Base Damage: ${flat(rank, level, 9)} (increases with character level)`,\n },\n \"Awakening\": {\n ranks: 3,\n text: \"Amara's Rush stacks gain increased effectiveness.\",\n effect: (rank, level) => `Rush Stack Effectiveness: +${percent(rank, 10)}%`,\n },\n \"Tandava\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 91)} (increases with character level)\\nCooldown: 35 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"6\": {\n \"Avatar\": {\n ranks: 1,\n text: \"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.\",\n effect: (rank, level) => `Maximum Rush Stacks: +10`,\n },\n },\n },\n \"Fist of the Elements\": {\n \"0\": {\n \"Phasegrasp\": {\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Skill Duration: 7 seconds\\nCooldown: 16 seconds\\nGrasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Anima\": {\n ranks: 5,\n text: \"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.\",\n effect: (rank, level) => `Action Skill Status Effect Damage: +${percent(rank, 8)}%\\nOther Status Effect Damage: +${percent(rank, 4)}%\\nStatus Effect Duration: +${percent(rank, 20)}%`,\n },\n \"Steady Hands\": {\n ranks: 3,\n text: \"Amara gains increased Weapon Handling and Accuracy.\",\n effect: (rank, level) => `Handling: +${getSteadyHandsHandling(rank)}%\\nAccuracy: +${getSteadyHandsAccuracy(rank)}%`,\n },\n \"Infusion\": {\n ranks: 5,\n text: \"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.\",\n effect: (rank, level) => `Converted Damage: ${percent(rank, 8)}%`,\n },\n },\n \"2\": {\n \"Tempest\": {\n ranks: 5,\n text: \"Amara deals increased Elemental Damage. Shock Damage is further increased.\",\n effect: (rank, level) => `Shock Damage: +${percent(rank, 8)}%\\nOther Elemental Damage: +${percent(rank, 6)}%`,\n },\n \"Illuminated Fist\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.\",\n effect: (rank, level) => `Melee Damage: +75%`,\n },\n \"Wildfire\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.\",\n effect: (rank, level) => `Spread Chance: +${percent(rank, 8)}%`,\n },\n \"Soulfire\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Incendiary Damage.\",\n effect: (rank, level) => `Action Skill Element: Incendiary.`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"The Eternal Fist\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Bonus Targets: Up to +4\\nDuration: 7 seconds\\nCooldown: 20 seconds\\nGrasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Dread\": {\n ranks: 1,\n text: \"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.\",\n effect: (rank, level) => `Gun Damage: +15%\\nDuration: 8 seconds`,\n },\n \"Allure\": {\n ranks: 0,\n text: \"Amara's Action Skill creates a singularity that pulls in enemies.\",\n effect: (rank, level) => `Duration: 2.5 seconds\\nAction Skill Damage: -20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Indiscriminate\": {\n ranks: 3,\n text: \"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Ricochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.\",\n effect: (rank, level) => `Ricochet Chance: +${percent(rank, 10)}%\\nRicochet Damage: -50%\\nAction Skill Ricochet Chance: +${percent(rank, 20)}%\\nAction Skill Ricochet Damage: -25%`,\n },\n \"Deep Well\": {\n ranks: 1,\n text: \"Amara gains increased Magazine Size with elemental weapons.\",\n effect: (rank, level) => `Magazine Size: +20%`,\n },\n \"Catharsis\": {\n ranks: 3,\n text: \"Whenever Amara triggers an elemental effect on an enemy, when that enemy dies that enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 4)} (increases with character level)\\nCooldown: 8 seconds`,\n },\n \"Ties That Bind\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Linked Damage: 35% of damage dealt\\nDuration: 7 seconds\\nCooldown: 18 seconds\\nGrasp Immune Damage: ${flat(rank, level, 34)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"5\": {\n \"Fist Over Matter\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 35)} (increases with character level)\\nDuration: 7 seconds\\nCooldown: 28 seconds\\nGrasp Immune Damage: ${flat(rank, level, 39)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Sustainment\": {\n ranks: 5,\n text: \"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.\",\n effect: (rank, level) => `Elemental Weapon Life Steal: +${percent(rank, 4)}% of damage dealt`,\n },\n \"Conflux\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.\",\n effect: (rank, level) => `Extra Status Effect Chance: +${percent(rank, 7)}%`,\n },\n },\n \"6\": {\n \"Forceful Expression\": {\n ranks: 1,\n text: \"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.\",\n effect: (rank, level) => `Bonus Elemental Damage: +18% of damage dealt`,\n },\n },\n },\n};\n\nexport default skills;\n","import style from './index.css';\n\nexport default function () {\n return (\n \n );\n}\n","import { Router } from 'preact-router';\n\nimport Home from '@pages/Home';\nimport Operative from '@pages/Operative';\nimport Siren from '@pages/Siren';\nimport Beastmaster from '@pages/Beastmaster';\nimport Gunner from '@pages/Gunner';\n\nconst App = () =>\n (\n \n \n \n \n \n );\n\nexport default App;\n","// import { useReducer } from 'preact/hooks'; // Downgraded from Preact 10 for compat with @pwa/cli\nimport { Component } from 'preact';\nimport Skill from '@components/Skill';\nimport Nav from '@components/Nav';\nimport Footer from '@components/Footer';\nimport { getHash, setHash } from './hashHandler';\nimport reducer from './reducer';\nimport { getLevel } from './selectors';\nimport style from './index.css';\n\nfunction contextKiller (event) {\n event.preventDefault();\n return false;\n}\n\nexport default class VaultHunter extends Component {\n constructor (props) {\n super(props);\n this.state = {\n invested: [0, 0, 0],\n skills: props.skills || {},\n };\n }\n\n componentDidMount () {\n this.setState(reducer(this.state, {\n type: 'loadSkills',\n skills: getHash(this.state.skills),\n }));\n }\n\n render ({\n name = 'Unnamed',\n discipline = 'Classless',\n path,\n skills: initialSkills,\n }) {\n const skillChangeListenerFactory = (skillName, treeIndex, treeName, tierIndex) => {\n return (oldValue, newValue) => {\n this.setState(reducer(this.state, {\n type: 'skillChange',\n skillName,\n treeIndex,\n treeName,\n tierIndex,\n newValue,\n oldValue,\n }));\n };\n };\n\n const resetSkills = () => {\n setHash(initialSkills);\n this.setState({\n invested: [0, 0, 0],\n skills: initialSkills || {},\n });\n };\n\n const trees =\n Object.keys(this.state.skills).map((treeName, treeIndex) => {\n return (\n
\n \n

{ treeName }

\n
\n { Object.keys(this.state.skills[treeName]).map((tier, tierIndex) =>\n
\n { Object.keys(this.state.skills[treeName][tier]).map((skillName, skillIndex) =>\n = 5 * tierIndex - 5}\n level={getLevel(this.state)}\n image={`../../assets/hunters/${discipline}/${treeIndex}${tierIndex}${skillIndex}.png`}\n onChange={skillChangeListenerFactory(skillName, treeIndex, treeName, tierIndex)}\n />\n ) }\n
\n ) }\n
\n
\n );\n });\n\n const level = getLevel(this.state);\n\n return (\n
\n
\n

{ name }\n
the { discipline }
\n

\n
\n
50 ? level > 61 ? style.overlevelB : style.overlevelA : ''}`}>Level { level }
\n \n
\n
\n
\n
\n
\n { trees }\n
\n
\n
\n
\n
\n );\n }\n}\n","export default {\n ACTION_SKILL: 1,\n AUGMENT_CHEVRON: 2,\n AUGMENT_DIAMOND: 3,\n AUGMENT_ACTION_SKILL: 4,\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"VaultHunter\":\"_2zgqJ\",\"header\":\"_1Jomm\",\"title\":\"_17kLY\",\"subtitle\":\"_3J3hw\",\"sidepanel\":\"_2UO55\",\"level\":\"xH9ts\",\"reset\":\"K9CBr\",\"overlevelA\":\"_1LE8c\",\"overlevelB\":\"_1vOfn\",\"trees\":\"_3ek45\",\"tier\":\"_3Ch4X\",\"treeName\":\"_1WAM2\",\"tree\":\"gRWZY\",\"skills\":\"_2Su0b\",\"green\":\"-Pl7G\",\"blue\":\"_1nm1I\",\"red\":\"_3T1pZ\"};","import { Link } from 'preact-router';\nimport Footer from '@components/Footer';\nimport style from './index.css';\n\nexport default function () {\n const pages = [\n { name: 'Zane', job: 'the Operative', path: '/operative' },\n { name: 'Amara', job: 'the Siren', path: '/siren' },\n { name: 'FL4K', job: 'the Beastmaster', path: '/beastmaster' },\n { name: 'Moze', job: 'the Gunner', path: '/gunner' },\n ];\n return (\n
\n
\n
\n

(Unofficial)
Borderlands 3 skill calculator

\n { pages.map(page => {\n return (\n \n
\n {page.name}\n
\n {page.job}\n
\n
\n \n );\n }) }\n
\n
\n
\n
\n );\n}\n","import { h, render } from 'preact';\nimport App from '@components/App';\nimport './index.css';\n\nlet elem = document.querySelector('#app');\nlet root = render(, elem, elem.firstElementChild);\n\nif (process.env.NODE_ENV === 'development' && module.hot) {\n // enable preact devtools\n require('preact/debug');\n // respond to HMR updates\n module.hot.accept('@components/App', New => {\n New = require('@components/App').default;\n root = render(, elem, root);\n });\n} else if (process.env.NODE_ENV === 'production') {\n // Service Worker registration\n require('offline-plugin/runtime').install();\n}\n","import { Component, cloneElement, h } from 'preact';\n\nvar EMPTY$1 = {};\n\nfunction assign(obj, props) {\n\t// eslint-disable-next-line guard-for-in\n\tfor (var i in props) {\n\t\tobj[i] = props[i];\n\t}\n\treturn obj;\n}\n\nfunction exec(url, route, opts) {\n\tvar reg = /(?:\\?([^#]*))?(#.*)?$/,\n\t\tc = url.match(reg),\n\t\tmatches = {},\n\t\tret;\n\tif (c && c[1]) {\n\t\tvar p = c[1].split('&');\n\t\tfor (var i=0; i b.rank) ? -1 :\n\t\t(a.index - b.index)\n\t);\n}\n\n// filter out VNodes without attributes (which are unrankeable), and add `index`/`rank` properties to be used in sorting.\nfunction prepareVNodeForRanking(vnode, index) {\n\tvnode.index = index;\n\tvnode.rank = rankChild(vnode);\n\treturn vnode.attributes;\n}\n\nfunction segmentize(url) {\n\treturn url.replace(/(^\\/+|\\/+$)/g, '').split('/');\n}\n\nfunction rankSegment(segment) {\n\treturn segment.charAt(0)==':' ? (1 + '*+?'.indexOf(segment.charAt(segment.length-1))) || 4 : 5;\n}\n\nfunction rank(path) {\n\treturn segmentize(path).map(rankSegment).join('');\n}\n\nfunction rankChild(vnode) {\n\treturn vnode.attributes.default ? 0 : rank(vnode.attributes.path);\n}\n\nvar customHistory = null;\n\nvar ROUTERS = [];\n\nvar subscribers = [];\n\nvar EMPTY = {};\n\nfunction isPreactElement(node) {\n\treturn node.__preactattr_!=null || typeof Symbol!=='undefined' && node[Symbol.for('preactattr')]!=null;\n}\n\nfunction setUrl(url, type) {\n\tif ( type === void 0 ) type='push';\n\n\tif (customHistory && customHistory[type]) {\n\t\tcustomHistory[type](url);\n\t}\n\telse if (typeof history!=='undefined' && history[type+'State']) {\n\t\thistory[type+'State'](null, null, url);\n\t}\n}\n\n\nfunction getCurrentUrl() {\n\tvar url;\n\tif (customHistory && customHistory.location) {\n\t\turl = customHistory.location;\n\t}\n\telse if (customHistory && customHistory.getCurrentLocation) {\n\t\turl = customHistory.getCurrentLocation();\n\t}\n\telse {\n\t\turl = typeof location!=='undefined' ? location : EMPTY;\n\t}\n\treturn (\"\" + (url.pathname || '') + (url.search || ''));\n}\n\n\n\nfunction route(url, replace) {\n\tif ( replace === void 0 ) replace=false;\n\n\tif (typeof url!=='string' && url.url) {\n\t\treplace = url.replace;\n\t\turl = url.url;\n\t}\n\n\t// only push URL into history if we can handle it\n\tif (canRoute(url)) {\n\t\tsetUrl(url, replace ? 'replace' : 'push');\n\t}\n\n\treturn routeTo(url);\n}\n\n\n/** Check if the given URL can be handled by any router instances. */\nfunction canRoute(url) {\n\tfor (var i=ROUTERS.length; i--; ) {\n\t\tif (ROUTERS[i].canRoute(url)) { return true; }\n\t}\n\treturn false;\n}\n\n\n/** Tell all router instances to handle the given URL. */\nfunction routeTo(url) {\n\tvar didRoute = false;\n\tfor (var i=0; i 0;\n\t};\n\n\t/** Re-render children with a new URL to match against. */\n\tRouter.prototype.routeTo = function routeTo (url) {\n\t\tthis._didRoute = false;\n\t\tthis.setState({ url: url });\n\n\t\t// if we're in the middle of an update, don't synchronously re-route.\n\t\tif (this.updating) { return this.canRoute(url); }\n\n\t\tthis.forceUpdate();\n\t\treturn this._didRoute;\n\t};\n\n\tRouter.prototype.componentWillMount = function componentWillMount () {\n\t\tROUTERS.push(this);\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidMount = function componentDidMount () {\n\t\tvar this$1 = this;\n\n\t\tif (customHistory) {\n\t\t\tthis.unlisten = customHistory.listen(function (location) {\n\t\t\t\tthis$1.routeTo((\"\" + (location.pathname || '') + (location.search || '')));\n\t\t\t});\n\t\t}\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.componentWillUnmount = function componentWillUnmount () {\n\t\tif (typeof this.unlisten==='function') { this.unlisten(); }\n\t\tROUTERS.splice(ROUTERS.indexOf(this), 1);\n\t};\n\n\tRouter.prototype.componentWillUpdate = function componentWillUpdate () {\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidUpdate = function componentDidUpdate () {\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.getMatchingChildren = function getMatchingChildren (children, url, invoke) {\n\t\treturn children\n\t\t\t.filter(prepareVNodeForRanking)\n\t\t\t.sort(pathRankSort)\n\t\t\t.map( function (vnode) {\n\t\t\t\tvar matches = exec(url, vnode.attributes.path, vnode.attributes);\n\t\t\t\tif (matches) {\n\t\t\t\t\tif (invoke !== false) {\n\t\t\t\t\t\tvar newProps = { url: url, matches: matches };\n\t\t\t\t\t\tassign(newProps, matches);\n\t\t\t\t\t\tdelete newProps.ref;\n\t\t\t\t\t\tdelete newProps.key;\n\t\t\t\t\t\treturn cloneElement(vnode, newProps);\n\t\t\t\t\t}\n\t\t\t\t\treturn vnode;\n\t\t\t\t}\n\t\t\t}).filter(Boolean);\n\t};\n\n\tRouter.prototype.render = function render (ref, ref$1) {\n\t\tvar children = ref.children;\n\t\tvar onChange = ref.onChange;\n\t\tvar url = ref$1.url;\n\n\t\tvar active = this.getMatchingChildren(children, url, true);\n\n\t\tvar current = active[0] || null;\n\t\tthis._didRoute = !!current;\n\n\t\tvar previous = this.previousUrl;\n\t\tif (url!==previous) {\n\t\t\tthis.previousUrl = url;\n\t\t\tif (typeof onChange==='function') {\n\t\t\t\tonChange({\n\t\t\t\t\trouter: this,\n\t\t\t\t\turl: url,\n\t\t\t\t\tprevious: previous,\n\t\t\t\t\tactive: active,\n\t\t\t\t\tcurrent: current\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\treturn Router;\n}(Component));\n\nvar Link = function (props) { return (\n\th('a', assign({ onClick: handleLinkClick }, props))\n); };\n\nvar Route = function (props) { return h(props.component, props); };\n\nRouter.subscribers = subscribers;\nRouter.getCurrentUrl = getCurrentUrl;\nRouter.route = route;\nRouter.Router = Router;\nRouter.Route = Route;\nRouter.Link = Link;\n\nexport { subscribers, getCurrentUrl, route, Router, Route, Link };export default Router;\n//# sourceMappingURL=preact-router.es.js.map\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\n/* These three skills dont follow a linear patch for some increases. Data came from official builder.\nhttps://borderlands.com/en-US/characters/fl4k/#-\nMight be different in game but I haven't played FL4K yet!\nThere are probably diminishing return algorithms for these but this was quicker than figuring that out. */\n\n// Hunter's Eye Damage Resistance\nfunction getHuntersEyeDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 5.3;\n case 2:\n return 10.1;\n case 3:\n return 14.4;\n case 4:\n return 18.3;\n case 5:\n return 21.9;\n default:\n return 0;\n }\n}\n\n// Ambush Predator Handling\nfunction getAmbushPredatorHandling(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n case 4:\n return 44;\n case 5:\n return 50;\n default:\n return 0;\n }\n}\n\n// The Most Dangerous Game Handling\nfunction getMostDangerousGameHandling(rank) {\n switch (rank) {\n case 1:\n return 14.3;\n case 2:\n return 25.0;\n case 3:\n return 33.3;\n default:\n return 0;\n }\n}\n\n// Furious Attack Handling\nfunction getFuriousAttackHandling(rank) {\n switch (rank) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 3:\n return 2.9;\n case 4:\n return 3.8;\n case 5:\n return 4.8;\n default:\n return 0;\n }\n}\n\n// Turn Tail And Run Damage Resistance\nfunction getTurnTailAndRunDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 6.5;\n case 2:\n return 12.3;\n case 3:\n return 17.4;\n default:\n return 0;\n }\n}\n\n// Interplanetary Stalker Beast Movement Speed\nfunction getInterplanetaryStalkerBeastMovementSpeed(rank) {\n switch (rank) {\n case 1:\n return 2;\n case 2:\n return 3;\n case 3:\n return 5;\n case 4:\n return 6;\n case 5:\n return 7;\n default:\n return 0;\n }\n}\n\n// Second Intention Critical Kill Reload Speed\nfunction getSecondIntentionCriticalKillReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 6;\n case 2:\n return 11;\n case 3:\n return 15;\n case 4:\n return 19;\n case 5:\n return 23;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Stalker\": {\n \"0\": {\n \"Jabber Sidekick\": {\n text: \"FL4K is joined by a loyal Jabber companion, armed with a Pistol. While accompanied by the Jabber, FL4K's Movement Speed is increased. Hold [Pet Skill key] to issue an Attack Command, which will cause the Jabber to throw a Radiation Barrel at enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%`,\n },\n \"Fade Away\": {\n text: \"FL4K cloaks, turning invisible. FL4K can fire 3 shots while cloaked, and each shot is automatically a Critical Hit. While cloaked, FL4K has increased Movement Speed and Health Regeneration.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Fade Away Bonus Damage: 200% of damage dealt\\nCloaked Movement Speed: +25%\\nHealth Regeneration: +3% of Max Health per second\\nDuration: 15 seconds\\nCooldown: 45 seconds`,\n },\n },\n \"1\": {\n \"Self-Repairing System\": {\n text: \"FL4K's Maximum Health is increased, and they constantly regenerate health.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Health: +${percent(rank, 6)}%\\nHealth Regeneration: +${percent(rank, 0.3)}% of Max Health/sec`,\n },\n \"Sic'Em\": {\n text: \"Attack Command has lowered Cooldown and increased Damage.\",\n ranks: 3,\n effect: (rank, level) => `Attack Command Damage: +${percent(rank, 10)}%\\nAttack Command Cooldown: -${percent(rank, 10)}%`,\n },\n \"Furious Attack\": {\n text: \"Hunter Skill. After shooting an enemy, FL4K gains a stack of Furious Attack. For each stack of Furious Attack, FL4K's Handling and Gun Damage are increased, and their pet gains increased Damage per stack. Stacks decay after a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 0.4)}% per stack\\nHandling: +${getFuriousAttackHandling(rank)}% per stack\\nPet Damage: +${percent(rank, 0.6)}% per stack\\nMaximum Stacks: 10\\nDuration: 4 seconds`,\n },\n },\n \"2\": {\n \"Guerrillas In The Mist\": {\n text: \"Fade Away no longer ends after FL4K attacks, at the cost of Critical Hit Damage and Fade Away duration being reduced.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Fade Away Bonus Damage: 25% of damage dealt\\nFade Away Duration: 5 seconds`,\n },\n \"Eager To Impress\": {\n text: \"Kill Skill. Whenever FL4K kills an enemy, Action Skill Cooldown Time is reduced. Whenever FL4K's pet kills an enemy, Action Skill Cooldown Time is reduced even more and Attack Command's duration is refreshed.\",\n ranks: 5,\n effect: (rank, level) => `FL4K Kill Action Skill Cooldown: -${percent(rank, 0.25)} seconds\\nPet Kill Action Skill Cooldown: -${percent(rank, 0.5)} seconds`,\n },\n \"All My BFF's\": {\n text: \"Allies share a portion of FL4K's total Health Regeneration. FL4K's pet shares twice the amount of Health Regeneration.\",\n ranks: 3,\n effect: (rank, level) => `Allies' Health Regen: +${Math.round(percent(rank, 16.666))}% of FL4K's Health Regen\\nPet Health Regen: +${Math.round(percent(rank, 33.333))}% of FL4K's Health Regen`,\n },\n \"Overclocked\": {\n text: \"FL4K gains increased Fire Rate. FL4K gains even more Fire Rate after reloading.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 2)}%\\nAdditional Fire Rate: +${percent(rank, 2)}%\\nDuration: 4 seconds`,\n },\n },\n \"3\": {\n \"Not My Circus\": {\n text: \"After Fade Away ends, FL4K's pet will Taunt, drawing the attention of all enemies in a huge radius. For a few seconds after Taunting, the pet gains powerful Damage Resistance.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Pet Taunt Duration: 6 seconds\\nPet Damage Resistance: +80%`,\n },\n \"Lick The Wounds\": {\n text: \"When FL4K is in Fight For Your Life, their pet will attempt to revive them. If it does, it gains increased Damage for a short time.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage: +30%\\nDuration: 60 seconds`,\n },\n \"Turn Tail And Run\": {\n text: \"While moving, FL4K constantly regenerates health and gains Damage Resistance.\\nWhile still, FL4K gains Gun Damage and Fire Rate.\",\n ranks: 3,\n effect: (rank, level) => `Damage Resistance: +${getTurnTailAndRunDamageResistance(rank)}% while moving\\nHealth Regen: +${percent(rank, 0.3)}% of Max Health/sec while moving\\nGun Damage: +${percent(rank, 8.333)}% while still\\nFire Rate: +${percent(rank, 4)}% while still`,\n },\n \"Beefcake Jabber\": {\n text: \"FL4K's Jabber evolves into a Beefcake, discarding its pistol and equipping a Shotgun. While accompanied by the Beefcake, FL4K gains increased Movement Speed and Maximum Health. When FL4K issues an Attack Command, the Beefcake will summon a melee weapon to deliver a powerful attack that knocks enemies back.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%\\nMaximum Health: +10%`,\n },\n },\n \"4\": {\n \"Until You Are Dead\": {\n text: \"The Health Regeneration and Movement Speed of Fade Away persists for a short time after the skill has ended.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Duration: 10 seconds after Fade Away ends`,\n },\n \"The Fast And The Furryous\": {\n text: \"While above half health, FL4K's Gun Damage and Movement Speed are increased, and their pet gains increased Damage.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${Math.round(percent(rank, 8.333))}%\\nMovement Speed: +${percent(rank, 3.333)}%\\nPet Damage: +${percent(rank, 10)}%`,\n },\n \"Hidden Machine\": {\n text: \"When an enemy has no target or is attacking a different target, FL4K deals increased damage against them.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 6)}%`,\n },\n \"Gunslinger Jabber\": {\n text: \"FL4K's Jabber upgrades his gear and equips an SMG. While accompanied by the Gunslinger, FL4K gains increased Movement Speed and Critical Hit Damage. When FL4K issues an Attack Command, the Gunslinger equips a Rocket Launcher to attack the target.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%\\nCritical Hit Damage: +5%`,\n },\n },\n \"5\": {\n \"Unblinking Eye\": {\n text: \"During Fade Away, successive hits on the same target increase FL4K's Critical Damage per hit. Unblinking Eye resets every 3 hits.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Additional Fade Away Bonus Damage: +75% of damage dealt per hit`,\n },\n \"Rage And Recover\": {\n text: \"Kill Skill. After killing an enemy, FL4K and FL4K's pet regenerate health for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: +${percent(rank, 1.6)}% of Missing Health/sec\\nPet Health Regen: +${percent(rank, 1.6)}% of Missing Health/sec\\nDuration: 3 seconds`,\n },\n },\n \"6\": {\n \"The Power Inside\": {\n text: \"FL4K and FL4K's pet gain increased Damage when FL4K activates an Action Skill. If FL4K is at full health, the increased Damage is doubled.\",\n ranks: 1,\n effect: (rank, level) => `Damage: +25%\\nPet Damage: +25%\\nDuration: 15 seconds`,\n },\n },\n },\n \"Master\": {\n \"0\": {\n \"Guard Skag\": {\n text: \"FL4K is joined by a loyal Skag companion, which will increase FL4K's Damage. Hold [Pet Skill key] to issue an Attack Command, which will cause the Skag to vomit acid onto enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%`,\n },\n \"Gamma Burst\": {\n text: \"FL4K creates a Rift at a target location, teleporting their pet through the Rift and dealing Radiation Damage to nearby enemies. Additionally, FL4K's pet becomes irradiated, growing in size and dealing bonus Radiation Damage when it attacks. Using Gamma Burst while FL4K's pet is downed or dead will revive the pet at the targeted location with 30% of its health, but will double Action Skill Cooldown Time.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage 56: (increases with character level)\\nDuration: 20 seconds\\nCooldown: 30 seconds`,\n },\n },\n \"1\": {\n \"Ferocity\": {\n text: \"FL4K's Pet deals increased damage.\",\n ranks: 5,\n effect: (rank, level) => `Pet Damage: +${percent(rank, 10)}%`,\n },\n \"Persistence Hunter\": {\n text: \"Increases FL4K's Gun Damage and Action Skill Duration.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}%\\nAction Skill Duration: +${percent(rank, 15)}%`,\n },\n \"Go For The Eyes!\": {\n text: \"When FL4K's pet attacks an enemy, the first melee attack is an automatic Critical Hit that deals increased damage.\",\n ranks: 5,\n effect: (rank, level) => `Pet Critical Hit Damage: ${percent(rank, 15)}%`,\n },\n },\n \"2\": {\n \"Atomic Aroma\": {\n text: \"While Gamma Burst is active, FL4K's pet is surrounded by a Radiation Aura, constantly damaging all nearby enemies.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Radiation Damage: 4 per second (increases with character level)`,\n },\n \"Who Rescued Who?\": {\n text: \"Whenever FL4K's Pet deals damage, FL4K regenerates health for a few seconds. Whenever FL4K deals damage to an enemy, their Pet's health is restored for a portion of the damage dealt.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: +${percent(rank, 0.4)}% of Max Health/sec\\nPet Health Restored: +${percent(rank, 1)}% of damage dealt`,\n },\n \"He Bites!\": {\n text: \"When FL4K's pet takes damage, the pet returns some of that damage to the attacker.\",\n ranks: 3,\n effect: (rank, level) => `Damage Returned: ${percent(rank, 5)}% of damage received`,\n },\n \"Frenzy\": {\n text: \"Hunter Skill. When FL4K's pet deals damage, FL4K and their pet gain a stack of Frenzy. Each stack of Frenzy increases Damage. The stacks decay after a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 0.8)}% per stack\\nPet Damage: +${percent(rank, 0.8)}% per stack\\nMaximum Stacks: 10`,\n },\n },\n \"3\": {\n \"Empathic Rage\": {\n text: \"For the duration of Gamma Burst, Damage dealt by FL4K is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Damage: +20%`,\n },\n \"Psycho Head On A Stick\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, their pet gains increased Movement Speed and Damage for a few seconds.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage: +20%\\nPet Movement Speed: +12%\\nDuration: 8 seconds`,\n },\n \"Hive Mind\": {\n text: \"When FL4K takes damage, a portion of all damage they take is inflicted on their pet instead.\",\n ranks: 3,\n effect: (rank, level) => `Damage Shared: ${percent(rank, 5)}%`,\n },\n \"Great Horned Skag\": {\n text: \"FL4K's Skag evolves into a larger Great Horned Skag, which will increase FL4K's Damage and Gun Damage. When FL4K issues an Attack Command, the Great Horned Skag will charge at enemies and knock them into the air.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%\\nGun Damage: +10%`,\n },\n },\n \"4\": {\n \"Endurance\": {\n text: \"When FL4K or FL4K's pet kills an enemy while Gamma Burst is active, the duration of Gamma Burst is extended and pet damage is increased. These effects can stack up to 5 times.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Gamma Burst Duration: +3 seconds per kill\\nPet Damage: +10% per kill\\nMaximum Stacks: 5`,\n },\n \"Barbaric Yawp\": {\n text: \"Increases the power of Pet Bonuses granted to FL4K.\",\n ranks: 5,\n effect: (rank, level) => `Pet Bonuses: +${percent(rank, 40)}%`,\n },\n \"Mutated Defenses\": {\n text: \"When FL4K's pet is at low health, it gains Damage Resistance and regenerates health. This skill has a long cooldown.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage Resistance: +30%\\nPet Health Regen: +6.667% of Max Health/sec\\n Duration: 6 seconds\\nCooldown: 15 seconds`,\n },\n \"Eridian Skag\": {\n text: \"FL4K's Skag evolves into an Eridian Skag, which will increase FL4K's Damage and Fire Rate. When FL4K issues an Attack Command, their Eridian Skag pulls nearby enemies in by generating a Singularity.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%\\nFire Rate: +5%`,\n },\n },\n \"5\": {\n \"Burst Aid\": {\n text: \"After using Gamma Burst, the Rift remains for the duration of the skill. While standing near the Rift, FL4K and their allies rapidly Regenerate Health.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Team Health Regeneration: +20% of Max Health/sec`,\n },\n \"Pack Tactics\": {\n text: \"All damage dealt by FL4K and their pet is increased. Additionally, the Maximum Health of both FL4K and their pet is increased.\",\n ranks: 3,\n effect: (rank, level) => `Damage: +${percent(rank, 7)}%\\nMaximum Health: +${percent(rank, 5)}%\\nPet Damage: +${percent(rank, 7)}%\\nPet Maximum Health: +${percent(rank, 5)}%`,\n },\n \"Shared Spirit\": {\n text: \"While FL4K is at low health, a portion of all damage they take is inflicted on their pet instead.\",\n ranks: 1,\n effect: (rank, level) => `Damage Shared: 50%`,\n },\n },\n \"6\": {\n \"Dominance\": {\n text: \"Melee Override Skill. FL4K establishes dominance over an enemy, turning it into an ally for a short time. If the enemy is a Beast, the duration is doubled. While under the effects of Domiance, the enemy constantly loses health until it dies or the effect ends. Only one enemy can be dominated at a time. An enemy can only be dominated once.\",\n ranks: 1,\n effect: (rank, level) => `Duration: 12 seconds\\nTarget Loses 2% of Maximum Health per second`,\n },\n },\n },\n \"Hunter\": {\n \"0\": {\n \"Spiderant Centurion\": {\n text: \"FL4K is joined by a loyal Spiderant companion, which will cause FL4K to constant regenerate health. Hold [Pet Skill key] to issue an Attack Command, which will cause the Spiderant to charge into enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: 1% of Max Health per second`,\n },\n \"Rakk Attack!\": {\n text: \"FL4K sends forward 2 Rakk to dive-bomb enemies. This skill has multiple charges. Element: Incendiary.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage: 35 (increases with character level)\\nElement Status Effect Chance: 100%\\nCooldown: 18 seconds`,\n },\n },\n \"1\": {\n \"Interplanetary Stalker\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, they gain a stack of Interplanetary Stalker. For each stack of Interplanetary Stalker, they and their pet gain a bonus to all damage dealt. Additionally, they gain a unique stacking bonus depending on the type of enemy killed. Each unique bonus can stack up to 3 times. Each stack decays after a short time.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 2)}% per stack\\nPet Damage: +${percent(rank, 1)}% per stack\\nHuman Bonus: +${percent(rank, 3)}% Action Skill Damage per stack\\nRobot Bonus: +${percent(rank, 1.5)}% Corrosive Damage per stack\\nBeast Bonus: +${getInterplanetaryStalkerBeastMovementSpeed(rank)}% Movement Speed per stack\\nMaximum Stacks: 3`,\n },\n \"Leave No Trace\": {\n text: \"When FL4K scores a Critical Hit, there is a chance for 1 ammo to be added to their magazine.\",\n ranks: 3,\n effect: (rank, level) => `Ammo Chance: +${percent(rank, 12)}%\\nCooldown: 0.3 seconds`,\n },\n \"Second Intention\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, they gain increased Reload Speed. This bonus is increased if FL4K scores a Critical Kill.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed: +${Math.ceil(percent(rank, 2.6))}%\\nCritical Kill Reload Speed: +${getSecondIntentionCriticalKillReloadSpeed(rank)}%\\nDuration: 5 seconds`,\n },\n },\n \"2\": {\n \"Rakk Open A Cold One\": {\n text: \"Converts FL4K's Rakk to Cryo Damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Rakk Attack! Element: Cryo`,\n },\n \"Hunter's Eye\": {\n text: \"FL4K gains bonuses when fighting different types of enemies.\",\n ranks: 5,\n effect: (rank, level) => `Human Bonus: +${percent(rank, 2.48)}% Critical Hit Damage\\nRobot Bonus: +${percent(rank, 6)}% Armor Damage\\nBeast Bonus: +${getHuntersEyeDamageResistance(rank)}% Damage Resistance`,\n },\n \"Head Count\": {\n text: \"Whenever FL4K scores a Critical Hit, there is a chance their Action Skill Cooldown is reduced.\",\n ranks: 3,\n effect: (rank, level) => `Cooldown Reduction Chance: +${percent(rank, 10)}%\\nAction Skill Cooldown: -2 seconds`,\n },\n \"Ambush Predator\": {\n text: \"While there are no enemies nearby, FL4K's Weapon Handling and Critical Hit Damage are increased.\",\n ranks: 5,\n effect: (rank, level) => `Critical Hit Damage: +${percent(rank, 4)}%\\nHandling: +${getAmbushPredatorHandling(rank)}%`,\n },\n },\n \"3\": {\n \"Falconer's Feast\": {\n text: \"When FL4K's Rakk damage an enemy, a portion of FL4K's health is restored.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Health Restored: 7% of Maximum Health`,\n },\n \"Two F4ng\": {\n text: \"FL4K has a chance to fire an extra projectile per shot.\",\n ranks: 5,\n effect: (rank, level) => `Extra Projectile Chance: +${percent(rank, 5)}%`,\n },\n \"Spiderant Scorcher\": {\n text: \"FL4K's Spiderant evolves into a Scorcher, occasionally dealing Incendiary Damage to all enemies nearby. While accompanied by the Scorcher, FL4K constantly regenerates health and deals increased Elemental Damage. When FL4K issues an Attack Command, the Scorcher will charge enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: +1% of Max Health per second\\nElemental Damage: +10%`,\n },\n },\n \"4\": {\n \"Flock'N'Load\": {\n text: \"FL4K sends forward additional Rakk.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Additional Rakk: +2`,\n },\n \"Big Game\": {\n text: \"FL4K's Hunter Skills become much more effective and have a longer duration.\",\n ranks: 3,\n effect: (rank, level) => `Hunter Skill Effects: +${percent(rank, 10)}%\\nHunter Skill Duration: +${Math.round(percent(rank, 33.333))}%`,\n },\n \"The Most Dangerous Game\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills a Badass or stronger enemy, they gain increased Critical Hit Damage, Gun Damage, and Handling for a long time and their pet receives increased Damage for a long time. Additionally, they receive a cash reward from the Intergalactic Bureau of Bounty Hunting.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3.333)}%\\nCritical Hit Damage: +${Math.round(percent(rank, 8.333))}%\\nHandling: +${getMostDangerousGameHandling(rank)}%\\nPet Damage: +${percent(rank, 9)}%\\nDuration: 120 seconds`,\n },\n \"Spiderant Countess\": {\n text: \"FL4K's Spiderant evolves into a Countess, which will cause FL4K to constantly regenerate health and gain Damage Resistance. When FL4K issues an Attack Command, the Countess will burrow underground and then emerge dealing Corrosive Damage in an area.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: +1% of Max Health per second\\nDamage Resistance: +5%`,\n },\n },\n \"5\": {\n \"Rakkcelerate\": {\n text: \"FL4K's Rakk have increased Cooldown Rate and gain an Additional Charge.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Rakk Attack! Cooldown Rate: +20%\\nMaximum Rakk Attack! Charges: +1`,\n },\n \"Galactic Shadow\": {\n text: \"FL4K deals increased Critical Hit Damage, and enemies are less likely to attack them.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Damage: +15%`,\n },\n \"Grim Harvest\": {\n text: \"FL4K gains increased Gun Damage and Action Skill Damage. FL4K's pet gains increased Damage.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%\\nAction Skill Damage: +${percent(rank, 5)}%\\nPet Damage: +${percent(rank, 7)}%`,\n },\n },\n \"6\": {\n \"Megavore\": {\n text: \"FL4K gains a chance to score a Critical Hit with weapons against any part of enemies.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Chance: +20%`,\n },\n },\n },\n};\n\nexport default skills;\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Gunner ({ path }) {\n return (\n \n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Operative ({ path }) {\n return (\n \n );\n}\n","export function getLevel (state) {\n return state.invested.reduce((total, current) => total + current, 2);\n};\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\nfunction percentTwoDecimals (rank, unit) {\n return Math.round(rank * unit * 100) / 100;\n}\n\n// Matched Set Heat Per Shot\nfunction getMatchedSetHeatPerShot(rank) {\n switch (rank) {\n case 1:\n return 2;\n case 2:\n return 4;\n case 3:\n return 6;\n case 4:\n return 9;\n case 5:\n return 11;\n default:\n return 0;\n }\n}\n\n// Scrappy Handling\nfunction getScrappyHandling(rank) {\n switch (rank) {\n case 1:\n return 10.7;\n case 2:\n return 19.4;\n case 3:\n return 26.5;\n case 4:\n return 32.4;\n case 5:\n return 37.5;\n default:\n return 0;\n }\n}\n\n// Scrappy Weapon Swap Speed\nfunction getScrappyWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 27.5;\n case 3:\n return 36.3;\n case 4:\n return 43.2;\n case 5:\n return 48.7;\n default:\n return 0;\n }\n}\n\n// Scrappy Mode Switch Speed\nfunction getScrappyModeSwitchSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 27.5;\n case 3:\n return 36.3;\n case 4:\n return 43.2;\n case 5:\n return 48.7;\n default:\n return 0;\n }\n}\n\n// Armored Infantry Damage Resistance\nfunction getArmoredInfantryDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 3;\n case 2:\n return 6;\n case 3:\n return 8;\n case 4:\n return 11;\n case 5:\n return 13;\n default:\n return 0;\n }\n}\n\n// Vladof Ingenuity Shock Damage Resistance\nfunction getVladofIngenuityShockDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 15;\n case 2:\n return 26;\n case 3:\n return 35;\n case 4:\n return 42;\n case 5:\n return 47;\n default:\n return 0;\n }\n}\n\n// Behind the Iron Curtain Shield Recharge Delay\nfunction getBehindTheIronCurtainShieldRechargeDelay(rank) {\n switch (rank) {\n case 1:\n return 7;\n case 2:\n return 14;\n case 3:\n return 19;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Bottomless Mags\": {\n \"0\": {\n \"Minigun\": {\n text: \"The Minigun is capable of sustained rapid fire. Firing for long periods causes the Minigun to overheat, rendering it inoperable for a few seconds. Element: Non-Elemental.\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `Put a little lead in the air and see what falls over.`,\n },\n },\n \"1\": {\n \"Cloud of Lead\": {\n text: \"Occasionally, Moze's and Iron Bear's shots will deal additional Incendiary Damage and won't consume ammo.\",\n ranks: 5,\n effect: (rank, level) => `Effects are triggered every ${9 - rank} shots\\nBonus Incendiary Damage: +${percentTwoDecimals(rank, 2.25)}%`,\n },\n \"Dakka Bear\": {\n text: \"Adds a manned turret to the back of Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Fasten your seatbelt, it's going to be a bumpy ride.`,\n },\n \"Matched Set\": {\n text: \"Moze's currently equipped weapon gains a stacking bonus to Magazine Size and Decreased Heat Per Shot for every piece of equipped gear that has a matching manufacturer.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 2)}% per matched gear\\nHeat Per Shot: -${getMatchedSetHeatPerShot(rank)}% per matched gear`,\n },\n },\n \"2\": {\n \"Let Off Some Steam\": {\n text: \"Minigun deals more damage as heat increases, and can be fired for longer before overheating.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Damage: Up to +80%\\nMinigun Heat Capacity: +35%`,\n },\n \"Stoke the Embers\": {\n text: \"Increases Moze and Iron Bear's Incendiary Damage.\",\n ranks: 3,\n effect: (rank, level) => `Incendiary Damage: +${percent(rank, 10)}%`,\n },\n \"Redistribution\": {\n text: \"After Moze scores a Critical Hit, she regenerates ammo for a few seconds.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +5% of Magazine Size/sec\\nDuration: 3 seconds`,\n },\n \"Scrappy\": {\n text: \"While moving, Moze's Handling, Weapon Swap and Mode Switch Speed are increased.\",\n ranks: 5,\n effect: (rank, level) => `Handling: +${getScrappyHandling(rank)}%\\nWeapon Swap Speed: +${getScrappyWeaponSwapSpeed(rank)}%\\nMode Switch Speed: +${getScrappyModeSwitchSpeed(rank)}%`,\n },\n \"Salamander\": {\n text: \"The Salamander is a flamethrower that deals Incendiary Damage to enemies at close range. Though the Salamander has infinite ammo, it drains Fuel with use.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Fire... for effect.`,\n },\n },\n \"3\": {\n \"General Winter\": {\n text: \"Minigun fires Cryo rounds which reduce Heat Gain and Fuel Drain, but deal reduced damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Element: Cryo\\nMinigun Fuel Drain: -40%\\nMinigun Damage: -30%\\nMinigun Cryo Efficiency: +20%`,\n },\n \"Rushin' Offensive\": {\n text: \"Moze can sprint and shoot at the same time.\",\n ranks: 1,\n effect: (rank, level) => `I don't want any messages saying \"I'm holding my position.\"`,\n },\n \"Scorching RPM's\": {\n text: \"Moze gains increased Fire Rate and Critical Hit Damage. Iron Bear gains increased Hard Point damage.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 3)}%\\nCritical Hit Damage: +${percent(rank, 4)}%\\nIron Bear Damage: +${percent(rank, 5)}%`,\n },\n \"Fuel Economy\": {\n text: \"Reduces Salamander's Fuel Drain. Additionally, Iron Bear's Movement Speed is increased after damaging an enemy with Salamander.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Salamander Fuel Drain: -25%\\nIron Bear Movement Speed: +25%\\nMovement Speed Duration: 3 seconds`,\n },\n },\n \"4\": {\n \"Exploding. Bullets.\": {\n text: \"Minigun fires Explosive Rounds that deal increased Splash Damage, but its Fire Rate is decreased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Damage: +126%\\nMinigun Fire Rate: -75%`,\n },\n \"The Iron Bank\": {\n text: \"Increases Moze's Magazine Size.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 7)}%`,\n },\n \"Specialist Bear\": {\n text: \"Equipping two of the same Weapons on Iron Bear increases the damage they deal.\",\n ranks: 1,\n effect: (rank, level) => `Iron Bear Damage: +${percent(rank, 25)}%`,\n },\n \"Chemical Warfare\": {\n text: \"Salamander now deals Corrosive Damage. Additionally, Salamander's Melt Damage is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Salamander Element: Corrosive\\nSalamander Melt Damage: +50%`,\n },\n },\n \"5\": {\n \"Some for the Road\": {\n text: \"Moze gains infinite ammo for a few seconds after exiting Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Duration: 5 seconds`,\n },\n \"Click, Click...\": {\n text: \"Moze gains increased Gun Damage as her magazine empties. The less ammo there is remaining, the greater the increase. If Moze has a COV gun equipped, she gains Gun Damage as her gun's heat increases.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: Up to +${percent(rank, 12)}%`,\n },\n \"Molten Roar\": {\n text: \"The Salamander burst-fires 3 projectiles with increased Fuel Drain, the first of which leaves a large Incendiary area.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: +25%`,\n },\n },\n \"6\": {\n \"Forge\": {\n text: \"Moze constantly regenerates ammo for her currently equipped weapon.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +5% of Magazine Size/sec`,\n },\n },\n },\n \"Demolition Woman\": {\n \"0\": {\n \"V-35 Grenade Launcher\": {\n text: \"The V-35 is a semi-automatic grenade launcher. Its grenades are not affected by Moze's equipped grenade mod. Element: Non-Elemental.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `For when the V-34 just isn't enough`,\n },\n },\n \"1\": {\n \"Fire in the Skag Den\": {\n text: \"Whenever Moze deals Splash Damage, she deals bonus Incendiary Damage.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Incendiary Damage: +${percent(rank, 3)}% of damage dealt`,\n },\n \"Deadlines\": {\n text: \"Firing Iron Bear Weapons drains less Fuel. Killing an enemy while Iron Bear is active increases Fuel. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Fuel Drain: -${percent(rank, 10)}%\\nFuel Returned: ${percent(rank, 2)}% of Maximum Fuel`,\n },\n \"Grizzled\": {\n text: \"Kill Skill. Killing an enemy reduces Moze's remaining Action Skill Cooldown Time. This skill has diminishing returns.\",\n ranks: 5,\n effect: (rank, level) => `Iron Bear Cooldown: Time -${rank * 1} seconds`,\n },\n },\n \"2\": {\n \"Shaped Charge\": {\n text: \"Direct hits with the V-35 deal increased damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `V-35 Direct Hit Damage: +35%`,\n },\n \"Means of Destruction\": {\n text: \"Whenever Moze deals Splash Damage, there is a chance to add ammo to her currently equipped weapon's magazine, with a smaller chance to return a grenade.\",\n ranks: 3,\n effect: (rank, level) => `Ammo Chance: +${percent(rank, 3.333)}%\\nGrenade Chance: +${percent(rank, 2)}%\\nCooldown: 0.3 seconds`,\n },\n \"Torgue Cross-Promotion\": {\n text: \"All Splash Damage dealt by Moze has a chance to double in size.\",\n ranks: 5,\n effect: (rank, level) => `Chance to Double Splash Radius: +${percent(rank, 3)}%`,\n },\n \"Stainless Steel Bear\": {\n text: \"Iron Bear gains additional armor and increased Maximum Fuel.\",\n ranks: 5,\n effect: (rank, level) => `Iron Bear Maximum Health: +${percent(rank, 6)}%\\nMaximum Fuel: +${percent(rank, 4)}%`,\n },\n \"Vanquisher Rocket Pod\": {\n text: \"The Vanquisher Rocket Pod is a rocket launcher capable of rapid-firing volleys of unguided explosive rockets. Element: Non-Elemental.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `If you want guidance, get a sherpa. If you want explosions, get a Vladof.`,\n },\n },\n \"3\": {\n \"Musical Chairs\": {\n text: \"Occasionally, the V-35 fires a Singularity Grenade that pulls in nearby enemies before exploding.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `V-35 Singularity: Every 7th grenade`,\n },\n \"Pull the Holy Pin\": {\n text: \"Moze's grenades have a chance to score a Critical Hit, dealing greatly increased damage. Sources of Critical Hit Damage do not affect grenade Critical Hits.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Critical Hit Chance: +${percent(rank, 10)}%`,\n },\n \"Auto Bear\": {\n text: \"After Moze exits Iron Bear, it will remain deployed in place for a short time. While Auto Bear remains active, it will target and attack nearby enemies until its duration ends, then it will charge at an enemy and self-destruct.\",\n ranks: 1,\n effect: (rank, level) => `Auto Bear Duration: 15 seconds`,\n },\n \"Active Tracking\": {\n text: \"The Vanquisher Rocket Pod now fires homing rockets and has increased Reload Speed. Hold down [Action Skill key] and aim at enemies to designate up to 6 targets. Releasing Fire Button launches a volley of homing rockets at the designated targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Vanquisher Reload Speed: +25%`,\n },\n },\n \"4\": {\n \"Lock and Speedload\": {\n text: \"The V-35's Reload Speed is greatly increased and it now fires a 5-round burst.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `V-35 Reload Speed: +25%`,\n },\n \"Vampyr\": {\n text: \"Whenever Moze damages an enemy with a thrown grenade, for every enemy hit, she restores a portion of her missing health. Iron Bear restores health for every enemy it deals Splash Damage to.\",\n ranks: 5,\n effect: (rank, level) => `Moze Health Restored: ${percent(rank, 4)}% of Missing Health per enemy hit\\nIron Bear Health Restored: ${percent(rank, 2)}% of Missing Health per enemy hit`,\n },\n \"Why Can't I Carry All These Grenades\": {\n text: \"Increases Moze's grenade carrying capacity.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Capacity: +${rank}`,\n },\n \"Target Softening\": {\n text: \"The Vanquisher Rocket Pod deals greatly reduced damage per rocket, but fires in a 6-rocket spread. Additionally, enemies hit by Vanquisher Rocket Pod rockets take increased damage from all sources.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Vanquisher Damage: -74%\\nEnemy Damage Taken: +15%`,\n },\n },\n \"5\": {\n \"To the Last\": {\n text: \"Moze gains the ability to throw grenades while in Fight For Your Life. If she threw a grenade before gaining a Second Wind, a grenade is refunded.\",\n ranks: 1,\n effect: (rank, level) => `The greatest enemy is one with nothing to lose... and a grenade.`,\n },\n \"Explosive Punctuation\": {\n text: \"When Moze deals Splash Damage, her Action Skill Cooldown Rate is briefly increased.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Hammerdown Protocol\": {\n text: \"Instead of a volley of conventional rockets, the Vanquisher Rocket Pod launches a single rocket with a nuclear warhead, dealing massive Radiation Damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Vanquisher Element: Raditation\\nVanquisher Damage: +380%\\nVanquisher Magazine Size: 1`,\n },\n },\n \"6\": {\n \"Short Fuse\": {\n text: \"Whenever Moze deals Gun Damage, there is a chance of a secondary explosion centered on the target.\",\n ranks: 1,\n effect: (rank, level) => `Secondary Explosion Chance: 20%\\nSecondary Explosion Damage: 75% of Gun Damage`,\n },\n },\n },\n \"Shield of Retribution\": {\n \"0\": {\n \"Railgun\": {\n text: \"The Railgun fires electrified high-velocity projectiles that deal Shock Damage.\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `It's like a bullet, only bigger. And faster. And wrapped in lightning.`,\n },\n },\n \"1\": {\n \"Selfless Vengeance\": {\n text: \"Whenever Moze reloads, she loses a small portion of her health and grants additional Incendiary Damage to her and her allies' rounds for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Health Removed: ${percent(rank, 1)}% of Current Health\\nTeam Bonus Incendiary Damage: +${percent(rank, 3)}% of dmg dealt\\nDuration: 5 seconds`,\n },\n \"Security Bear\": {\n text: \"Iron Bear gains a bubble shield that reduces damage taken. The shield deactivates if it sustains too much damage, reactivating after a short cooldown.\",\n ranks: 1,\n effect: (rank, level) => `50% of Iron Bear Maximum Health added as Shields\\nBubble Recharge Delay: 5 seconds`,\n },\n \"Armored Infantry\": {\n text: \"While Moze's shields are active, she gains Damage Resistance and increased Gun Damage.\",\n ranks: 5,\n effect: (rank, level) => `Damage Resistance: +${getArmoredInfantryDamageResistance(rank)}%\\nGun Damage: +${percent(rank, 3)}%`,\n },\n },\n \"2\": {\n \"Hell on Rails\": {\n text: \"Railgun now fires superheated rounds that deal Incendiary Damge, but have increased Fuel Drain per shot.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Railgun Element: Incendiary\\nRailgun Fuel Drain: +30%`,\n },\n \"Drowning in Brass\": {\n text: \"Kill Skill. Killing an enemy grants Moze a stack of Drowning in Brass. For each stack of Drowning in Brass, Moze's Fire Rate is reduced, but Gun Damage is increased for both her and her allies.\",\n ranks: 5,\n effect: (rank, level) => `Moze Fire Rate: -${percent(rank, 0.5)}% per stack\\nTeam Gun Damage: +${percent(rank, 4)}% per stack\\nMaximum Stacks: 3\\nDuration: 15 seconds`,\n },\n \"Thin Red Line\": {\n text: \"A portion of Moze's health is Reserved and cannot be restored, but her Maximum Shield is increased by the same amount.\",\n ranks: 3,\n effect: (rank, level) => `${percent(rank, 20)}% Max Health Reserved and Added to Max Shield`,\n },\n \"Vladof Ingenuity\": {\n text: \"Moze's Maximum Shield is increased, and she gains resistance to Shock Damage.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Shield: +${percent(rank, 6)}%\\nShock Damage Resistance: +${getVladofIngenuityShockDamageResistance(rank)}%`,\n },\n \"Bear Fist\": {\n text: \"The Bear Fist is a pneumatic-driven fist that deals massive damage to a single target at close range. Element: Non-Elemental.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Vladof supports the right to bear armored bear arms.`,\n },\n },\n \"3\": {\n \"Capacitive Armature\": {\n text: \"When Railgun hits an enemy, it chains to nearby enemies, dealing reduced Shock Damage to more targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Splinter Damage: 25% of damage dealt`,\n },\n \"Full Can of Whoop-Ass\": {\n text: \"Entering Iron Bear causes Moze's and her allies' shields to immediately begin recharging at an increased Shield Recharge Rate.\",\n ranks: 1,\n effect: (rank, level) => `Team Shield Recharge Rate: +25%`,\n },\n \"Experimental Munitions\": {\n text: \"Whenever Moze and Iron Bear score a Critical Hit, they deal bonus Incendiary Damage.\",\n ranks: 1,\n effect: (rank, level) => `Bonus Incendiary Damage: +${percent(rank, 10)}% of damage dealt`,\n },\n \"Wild Swing\": {\n text: \"Whenever Bear Fist hits an enemy, it deals random Bonus Elemental Damage to that enemy and all enemies nearby.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Bear Fist Bonus Elemental Damage: +35% of damage dealt`,\n },\n },\n \"4\": {\n \"Corrosive Sabot Round\": {\n text: \"Railgun now fires a specialty round that deals reduced damage and explodes after a short delay. Railgun shots have reduced Fuel Drain and the Magazine Size is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Railgun Element:Corrosive\\nRailgun Damage: -50%\\nRailgun Fuel Drain: -50%\\nRailgun Magazine Size: +2`,\n },\n \"Behind the Iron Curtain\": {\n text: \"Moze's Shield Recharge Delay is reduced, and her Shield Recharge Rate is increased.\",\n ranks: 3,\n effect: (rank, level) => `Shield Recharge Delay: -${getBehindTheIronCurtainShieldRechargeDelay(rank)}%\\nShield Recharge Rate: +${percent(rank, 7)}%`,\n },\n \"Desperate Measures\": {\n text: \"Moze's Gun Damage and Iron Bear's Damage is increased depending on how low their health is. The lower their health, the greater the increase.\",\n ranks: 3,\n effect: (rank, level) => `Damage: Up to +${Math.round(percent(rank, 16.5))}%`,\n },\n \"Close the Distance\": {\n text: \"Instead of punching, Iron Bear now launches its Bear Fist forward and grabs enemies at greatly increased range, dealing Shock Damage and pulling them back to Iron Bear.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Step into my office.`,\n },\n },\n \"5\": {\n \"Phalanx Doctrine\": {\n text: \"Kill Skill. After killing an enemy, Moze gains a stack of Phalanx Doctrine. For every stack of Phalanx Doctrine, Moze's Maximum Shield and Gun Damage are increased. Each stack lasts 30 seconds. There is no stack limit.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Shield: +${percent(rank, 3)}% per stack\\nGun Damage: +${percent(rank, 2)}% per stack\\nDuration: 30 seconds`,\n },\n \"Force Feedback\": {\n text: \"Whenever Moze scores a Critical Kill, her shields immediately begin recharging.\",\n ranks: 1,\n effect: (rank, level) => `Just click on their heads.`,\n },\n \"Shockhammer\": {\n text: \"Bear Fist is now capable of sustained rapid fire punching. Additionally, Bear Fist has reduced Fuel Drain and deals Bonus Shock Damage with each hit.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Bear Fist Bonus Shock Damage: +19% of damage dealt\\nBear Fist Fuel Drain: -40%`,\n },\n },\n \"6\": {\n \"Tenacious Defense\": {\n text: \"Whenever Moze's shield is fully depleted, she instantly restores a portion of her shield, and her Gun Damage is increased for a short time. This skill can only trigger after Moze's shields have fully recharged.\",\n ranks: 1,\n effect: (rank, level) => `Shields Restored: 40% of Maximum Shield\\nGun Damage: +30%\\nDuration: 30 seconds`,\n },\n },\n },\n};\n\nexport default skills;\n","!function(){\"use strict\";function e(e,t){var n,o,r,i,l=W;for(i=arguments.length;i-- >2;)P.push(arguments[i]);t&&null!=t.children&&(P.length||P.push(t.children),delete t.children);while(P.length)if((o=P.pop())&&void 0!==o.pop)for(i=o.length;i--;)P.push(o[i]);else\"boolean\"==typeof o&&(o=null),(r=\"function\"!=typeof e)&&(null==o?o=\"\":\"number\"==typeof o?o+=\"\":\"string\"!=typeof o&&(r=!1)),r&&n?l[l.length-1]+=o:l===W?l=[o]:l.push(o),n=r;var a=new T;return a.nodeName=e,a.children=l,a.attributes=null==t?void 0:t,a.key=null==t?void 0:t.key,void 0!==M.vnode&&M.vnode(a),a}function t(e,t){for(var n in t)e[n]=t[n];return e}function n(e,t){null!=e&&(\"function\"==typeof e?e(t):e.current=t)}function o(n,o){return e(n.nodeName,t(t({},n.attributes),o),arguments.length>2?[].slice.call(arguments,2):n.children)}function r(e){!e.__d&&(e.__d=!0)&&1==V.push(e)&&(M.debounceRendering||D)(i)}function i(){var e;while(e=V.pop())e.__d&&x(e)}function l(e,t,n){return\"string\"==typeof t||\"number\"==typeof t?void 0!==e.splitText:\"string\"==typeof t.nodeName?!e._componentConstructor&&a(e,t.nodeName):n||e._componentConstructor===t.nodeName}function a(e,t){return e.__n===t||e.nodeName.toLowerCase()===t.toLowerCase()}function u(e){var n=t({},e.attributes);n.children=e.children;var o=e.nodeName.defaultProps;if(void 0!==o)for(var r in o)void 0===n[r]&&(n[r]=o[r]);return n}function c(e,t){var n=t?document.createElementNS(\"http://www.w3.org/2000/svg\",e):document.createElement(e);return n.__n=e,n}function p(e){var t=e.parentNode;t&&t.removeChild(e)}function s(e,t,o,r,i){if(\"className\"===t&&(t=\"class\"),\"key\"===t);else if(\"ref\"===t)n(o,null),n(r,e);else if(\"class\"!==t||i)if(\"style\"===t){if(r&&\"string\"!=typeof r&&\"string\"!=typeof o||(e.style.cssText=r||\"\"),r&&\"object\"==typeof r){if(\"string\"!=typeof o)for(var l in o)l in r||(e.style[l]=\"\");for(var l in r)e.style[l]=\"number\"==typeof r[l]&&!1===E.test(l)?r[l]+\"px\":r[l]}}else if(\"dangerouslySetInnerHTML\"===t)r&&(e.innerHTML=r.__html||\"\");else if(\"o\"==t[0]&&\"n\"==t[1]){var a=t!==(t=t.replace(/Capture$/,\"\"));t=t.toLowerCase().substring(2),r?o||e.addEventListener(t,_,a):e.removeEventListener(t,_,a),(e.__l||(e.__l={}))[t]=r}else if(\"list\"!==t&&\"type\"!==t&&!i&&t in e){try{e[t]=null==r?\"\":r}catch(e){}null!=r&&!1!==r||\"spellcheck\"==t||e.removeAttribute(t)}else{var u=i&&t!==(t=t.replace(/^xlink:?/,\"\"));null==r||!1===r?u?e.removeAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase()):e.removeAttribute(t):\"function\"!=typeof r&&(u?e.setAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase(),r):e.setAttribute(t,r))}else e.className=r||\"\"}function _(e){return this.__l[e.type](M.event&&M.event(e)||e)}function f(){var e;while(e=A.shift())M.afterMount&&M.afterMount(e),e.componentDidMount&&e.componentDidMount()}function d(e,t,n,o,r,i){H++||(R=null!=r&&void 0!==r.ownerSVGElement,B=null!=e&&!(\"__preactattr_\"in e));var l=h(e,t,n,o,i);return r&&l.parentNode!==r&&r.appendChild(l),--H||(B=!1,i||f()),l}function h(e,t,n,o,r){var i=e,l=R;if(null!=t&&\"boolean\"!=typeof t||(t=\"\"),\"string\"==typeof t||\"number\"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0))),i.__preactattr_=!0,i;var u=t.nodeName;if(\"function\"==typeof u)return N(e,t,n,o);if(R=\"svg\"===u||\"foreignObject\"!==u&&R,u+=\"\",(!e||!a(e,u))&&(i=c(u,R),e)){while(e.firstChild)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0)}var p=i.firstChild,s=i.__preactattr_,_=t.children;if(null==s){s=i.__preactattr_={};for(var f=i.attributes,d=f.length;d--;)s[f[d].name]=f[d].value}return!B&&_&&1===_.length&&\"string\"==typeof _[0]&&null!=p&&void 0!==p.splitText&&null==p.nextSibling?p.nodeValue!=_[0]&&(p.nodeValue=_[0]):(_&&_.length||null!=p)&&m(i,_,n,o,B||null!=s.dangerouslySetInnerHTML),y(i,t.attributes,s),R=l,i}function m(e,t,n,o,r){var i,a,u,c,s,_=e.childNodes,f=[],d={},m=0,b=0,y=_.length,g=0,w=t?t.length:0;if(0!==y)for(var C=0;C skill.ranks) { return false; }\n tierTotal += skill.invested || 0;\n };\n if (tierTotal > 0 && treeTotal + 5 < tierIndex * 5) { return false; }\n treeTotal += tierTotal;\n tierIndex += 1;\n };\n treeTotals[treeIndex] = treeTotal;\n totalSpent += treeTotal;\n treeIndex += 1;\n };\n if (totalSpent > (50 - 3) + 11 + 11) { return false; }\n return treeTotals;\n}\n","import deepmerge from 'deepmerge';\nimport investmentValidator from './investmentValidator';\nimport { setHash } from './hashHandler';\n\nexport default function reducer (state, action) {\n switch (action.type) {\n case 'skillChange':\n var newSkills = deepmerge(state.skills, {\n [action.treeName]: {\n [action.tierIndex + '']: {\n [action.skillName]: {\n invested: action.newValue,\n }\n }\n }\n });\n const skillChangeTotals = investmentValidator(newSkills);\n if (skillChangeTotals) {\n setHash(newSkills);\n return {\n ...state,\n invested: skillChangeTotals,\n skills: newSkills,\n };\n } else {\n return state;\n }\n case 'loadSkills':\n const loadSkillsTotals = investmentValidator(action.skills);\n if (loadSkillsTotals) {\n return {\n ...state,\n invested: loadSkillsTotals,\n skills: deepmerge(state.skills, action.skills),\n };\n } else {\n return state;\n }\n }\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"footer\":\"Eq4mJ\",\"heart\":\"_37Gl6\",\"moveHeart\":\"_34mPq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"splash\":\"_2_d3x\",\"wrapper\":\"vMurv\",\"link\":\"_3lx8i\",\"name\":\"_1SiOU\",\"job\":\"_3chgr\",\"disclaimer\":\"_3RIFV\"};","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.deepmerge = factory());\n}(this, (function () { 'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tObject.keys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tObject.keys(source).forEach(function(key) {\n\t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nreturn deepmerge_1;\n\n})));\n","import SKILLS from '@constants/skills';\nimport style from './index.css';\n\nfunction getInitials (string) {\n const numWords = (string.match(/\\s/g) || []).length + 1;\n switch (numWords) {\n case 1:\n return string.slice(0, 3);\n case 2:\n return (string.match(/^\\w{1,2}|\\s\\w{1,2}/g) || []).join('').replace(/\\s/g, '');\n default:\n return (string.match(/^\\w|\\s\\w/g) || []).join('').replace(/\\s/g, '');\n }\n}\n\nexport default function Skill ({\n name = '?',\n text = 'Long description',\n ranks = 0,\n invested = 0,\n tier = 0,\n level = 1,\n effect = (rank, level) => `Rank ${rank} effect`,\n type = null,\n enabled = true,\n image = null,\n onChange = (oldValue, newValue) => null,\n}) {\n const isAugment = [\n SKILLS.AUGMENT_CHEVRON,\n SKILLS.AUGMENT_DIAMOND,\n SKILLS.AUGMENT_ACTION_SKILL,\n ].includes(type);\n let shapeStyle = null;\n if (type === SKILLS.ACTION_SKILL) { shapeStyle = style.actionSkill; }\n if (type === SKILLS.AUGMENT_CHEVRON) { shapeStyle = style.chevron; }\n if (type === SKILLS.AUGMENT_DIAMOND) { shapeStyle = style.diamond; }\n if (type === SKILLS.AUGMENT_ACTION_SKILL) { shapeStyle = style.actionSkill; }\n function clickListener (event) {\n var newValue;\n if (event.type === 'click') {\n newValue = Math.min(invested + 1, ranks);\n } else { // (event.type === 'contextmenu')\n newValue = Math.max(invested - 1, 0);\n }\n if (enabled && invested !== newValue) {\n onChange(invested, newValue);\n }\n event.preventDefault();\n return false;\n }\n return (\n 0) ? style.usable : '',\n ].join(' ')}\n onClick={clickListener}\n onContextMenu={clickListener}\n >\n
{getInitials(name)}
\n { enabled && ranks > 0 &&
{invested}/{ranks}
}\n
\n

{name}

\n {text}\n { invested > 0 &&\n
\n Current Effect:
\n {effect(invested, level)}\n
\n }\n { type !== null &&\n
\n {effect(1, level)}\n
\n }\n { type == null && invested < ranks &&\n
\n Next Rank:
\n {effect(invested + 1, level)}\n
\n }\n
\n \n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Siren ({ path }) {\n return (\n \n );\n}\n","export function setHash (skillsState) {\n const hashparts = [];\n for (let tree of Object.values(skillsState)) {\n for (let tier of Object.values(tree)) {\n for (let skill of Object.values(tier)) {\n if (skill.type == null) {\n hashparts.push(skill.invested || 0);\n }\n };\n };\n };\n const url = window.location.href.split('#')[0] + '#' + hashparts.join('');\n window.location.replace(url);\n};\n\nexport function getHash (skillsState) {\n const hash = window.location.href.split('#')[1] || '';\n const hashparts = hash.match(/./g) || [];\n const skills = JSON.parse(JSON.stringify(skillsState));\n for (let tree of Object.keys(skills)) {\n for (let tier of Object.keys(skills[tree])) {\n for (let skill of Object.keys(skills[tree][tier])) {\n if (skills[tree][tier][skill].type == null) {\n skills[tree][tier][skill] = { invested: parseInt(hashparts.shift() || 0) };\n } else {\n skills[tree][tier][skill] = {};\n }\n };\n };\n };\n return skills;\n};\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Beastmaster ({ path }) {\n return (\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Stiff Upper Lip Damage Resistance\nfunction getStiffUpperLipDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 6;\n case 2:\n return 12;\n case 3:\n return 16;\n default:\n return 0;\n }\n}\n\n// Nerves of Steel Handling\nfunction getNervesOfSteelHandling(rank) {\n switch (rank) {\n case 1:\n return 2.4;\n case 2:\n return 4.8;\n case 3:\n return 7;\n default:\n return 0;\n }\n}\n\n// Cold Bore Weapon Swap Speed\nfunction getColdBoreWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n case 4:\n return 38;\n case 5:\n return 43;\n default:\n return 0;\n }\n}\n\n// Cool Hand Passive Reload Speed\nfunction getCoolHandPassiveReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 2.9;\n case 2:\n return 5.7;\n case 3:\n return 8.3;\n case 4:\n return 10.7;\n case 5:\n return 13;\n default:\n return 0;\n }\n}\n\n// Cool Hand After Kill Reload Speed\nfunction getCoolHandAfterKillReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 4;\n case 2:\n return 7;\n case 3:\n return 11;\n case 4:\n return 14;\n case 5:\n return 17;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Under Cover\": {\n \"0\": {\n \"Barrier\": {\n text: \"Drop a deployable Barrier that blocks incoming projectiles. Zane and his allies can shoot through the Barrier, dealing increased Gun Damage. Pressing [Action Skill key] while Barrier is active picks up and holds the Barrier, but the size and bonuses are decreased.\",\n effect: (rank, level) => `Duration: 14 seconds\\nCooldown: 24 seconds\\nGun Damage Amp: +25%`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Adrenaline\": {\n text: \"Zane gains increased Action Skill Cooldown Rate. This bonus is based on the amount of shield he has. The more percent full, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: Up to +${percent(rank, 7)}%`,\n },\n \"Hearty Stock\": {\n text: \"Zane gains increased Maximum Shield Capacity.\",\n ranks: 3,\n effect: (rank, level) => `Maximum Shield: +${percent(rank, 10)}%`,\n },\n \"Ready for Action\": {\n text: \"Zane gains improved Shield Recharge Rate and Shield Recharge Delay.\",\n ranks: 5,\n effect: (rank, level) => `Shield Recharge Delay: -${percent(rank, 7)}%\\nShield Recharge Rate: +${percent(rank, 6)}%`,\n },\n },\n \"2\": {\n \"Charged Relay\": {\n text: \"Whenever Zane or an ally touches the Barrier, they gain increased Movement Speed and Reload Speed for a few seconds.\",\n ranks: 0,\n effect: (rank, level) => `Reload Speed: +20%\\nMovement Speed: +11%\\nDuration: 8 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Brainfreeze\": {\n text: \"Whenever Zane scores a Critical Hit on an enemy, there is a chance they will be Slowed. This effect stacks until the target is Frozen.\",\n ranks: 5,\n effect: (rank, level) => `Slow Chance: ${percent(rank, 4)}%`,\n },\n \"Stiff Upper Lip\": {\n text: \"Whenever Zane is damaged, he gains Damage Resistance against that damage type.\",\n ranks: 3,\n effect: (rank, level) => `Damage Resistance: +${getStiffUpperLipDamageResistance(rank)}%`,\n },\n \"Rise to the Occasion\": {\n text: \"Zane gains Health Regeneration. The lower his shield is, the higher the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: Up to +${percent(rank, 1)}% of Max Health/sec`,\n },\n },\n \"3\": {\n \"Nanites or Some Shite\": {\n text: \"Zane and his allies gain Health Regeneration, increased Reload Speed, and greatly improved Shield Recharge Delay while near his Barrier. The lower their health, the more health is regenerated.\",\n ranks: 0,\n effect: (rank, level) => `Team Health Regen: Up to +4% of Max Health/sec\\nTeam Shield Recharge Delay: -33%\\nTeam Reload Speed: +11%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Confident Competence\": {\n text: \"While Zane's shields are active, he gains increased Gun Damage and Accuracy. These bonuses are based on the amount of shields he has. The more percent full, the greater the bonuses.\",\n ranks: 1,\n effect: (rank, level) => `Gun Damage: Up to +35%\\nAccuracy: Up to +33%`,\n },\n \"All-Rounder\": {\n text: \"Zane's Barrier becomes a dome, covering all sides.\",\n ranks: 0,\n effect: (rank, level) => `Barrier Cooldown: +20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Redistribution\": {\n text: \"Zane and allies near the Barrier gain increased Gun Damage for a few seconds after the Barrier takes damage.\",\n ranks: 0,\n effect: (rank, level) => `Team Gun Damage: +10%\\nDuration: 3 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Really Expensive Jacket\": {\n text: \"Elemental Status Effects applied to Zane have reduced duration.\",\n ranks: 1,\n effect: (rank, level) => `Status Effect Duration: -50%`,\n },\n \"Best Served Cold\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, they create a Cryo Nova, dealing damage to all nearby enemies. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Cryo Damage: ${flat(rank, level, 2)} (increases with character level)\\nCooldown: 3 seconds`,\n },\n \"Futility Belt\": {\n text: \"Zane gains resistance to non-elemental damage.\\nKill Skill. After killing an enemy, all elemental damage Zane takes is converted to non-elemental damage.\",\n ranks: 1,\n effect: (rank, level) => `Non-Elemental Damage Resistance: +15%\\nDuration: 8 seconds`,\n },\n \"Deterrence Field\": {\n text: \"Enemies that touch the Barrier take Shock Damage and are staggered.\",\n ranks: 0,\n effect: (rank, level) => `Shock Damage: ${flat(1, level, 27)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Refreshment\": {\n text: \"Whenever Zane damages a frozen enemy with his weapon, he gains some of that damage back as health.\",\n ranks: 3,\n effect: (rank, level) => `Life Steal: +${percent(rank, 8)}% of damage dealt`,\n },\n \"Calm, Cool, Collected\": {\n text: \"Whenever Zane Freezes an enemy, his shield instantly begins recharging.\\nIf Zane's shields are already full, he regenerates health for a few seconds.\\nIf Zane's health is already full, his Action Skill Cooldowns and Durations are immediately reset.\",\n ranks: 1,\n effect: (rank, level) => `Health Regeneration: +3% of Max Health per second\\nHealth Regeneration Duration: 3 seconds`,\n },\n \"Nerves of Steel\": {\n text: \"Zane gains increasing Accuracy and Handling. The longer his shield is full, the greater the bonuses.\",\n ranks: 3,\n effect: (rank, level) => `Accuracy: +${percent(rank, 2)}% per second\\nHandling: +${getNervesOfSteelHandling(rank)}% per second\\nMaximum Stacks: 15`,\n },\n },\n \"6\": {\n \"Distributed Denial\": {\n text: \"Zane's Barrier gains the effects of his currently equipped Shield Mod. Additionally, shield effects are applied to all allies near the Barrier. Bonuses to Zane are reduced.\",\n ranks: 1,\n },\n },\n },\n \"Hitman\": {\n \"0\": {\n \"SNTNL\": {\n text: \"Send into battle an automated SNTNL drone that continually flies through the environment and attacks enemies with its Machine Guns. Pressing [Action Skill key] while SNTNL is active causes it to attack the enemy under Zane's crosshairs, if any. Machine Gun Element: Non-Elemental.\",\n effect: (rank, level) => `Machine Gun Damage: ${flat(rank, level, 6)} (increases with character level)\\nDuration: 24 seconds\\nCooldown: 60 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n }\n },\n \"1\": {\n \"Violent Speed\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Movement Speed for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}%\\nDuration: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Cold Bore\": {\n text: \"Zane gains increased Weapon Swap Speed. The next shot fired after swapping weapons deals Bonus Cryo Damage.\",\n ranks: 5,\n effect: (rank, level) => `Weapon Swap Speed: +${getColdBoreWeaponSwapSpeed(rank)}%\\nBonus Cryo Damage: +${percent(rank, 6)}% of damage dealt`,\n },\n \"Violent Momentum\": {\n text: \"Zane's Gun Damage is increased while moving. The quicker he moves, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% at default walk speed`,\n },\n },\n \"2\": {\n \"Winter's Drone\": {\n text: \"Converts SNTNL's primary weapons to Cryo Damage.\",\n ranks: 0,\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `SNTNL Weapons Element: Cryo`,\n },\n \"Cool Hand\": {\n text: \"Zane gains increased Reload Speed.\\nKill Skill. After killing an enemy, Zane's Reload Speed is increased for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed: +${getCoolHandPassiveReloadSpeed(rank)}%\\nAdditional Reload Speed: +${getCoolHandAfterKillReloadSpeed(rank)}%\\nDuration: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Drone Delivery\": {\n text: \"SNTRY will occasionally drop a free grenade based on your current grenade mod while attacking enemies.\",\n ranks: 1,\n effect: (rank, level) => `Cooldown: 15 seconds`,\n },\n \"Salvation\": {\n text: \"Kill Skill. After killing an enemy, Zane's weapons gain Life Steal for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Life Steal: +${percent(rank, 2)}% of damage dealt\\nDuration: 8 seconds`,\n },\n },\n \"3\": {\n \"Bad Dose\": {\n text: \"SNTNL occasionally shoots out a beam of Radiation that weakens enemies and buffs Zane. For every weakened enemy, Zane's Movement Speed and Fire Rate are increased. Weakened enemies have decreased Movement Speed and Attack Speed.\",\n ranks: 0,\n effect: (rank, level) => `Fire Rate: +2% per affected enemy\\nMovement Speed: +6% per affected enemy\\nBeam Damage: ${flat(rank, level, 4)} (increases with character level)\\nDuration: 12 seconds\\nCooldown: 8 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Death Follows Close\": {\n text: \"All of Zane's Kill Skills gain increased effect and duration.\",\n ranks: 1,\n effect: (rank, level) => `Kill Skill Bonus: +25%\\nKill Skill Duration: +7 seconds`,\n },\n \"Static Field\": {\n text: \"SNTNL emits a static field that sends a Shock Beam to nearby enemies, draining their shields and replenishing Zane's.\",\n ranks: 0,\n effect: (rank, level) => `Shield Damage: 2/sec (increases with character level)\\nCooldown: 2 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Boomsday\": {\n text: \"SNTNL adds a rocket pod to its primary weapons, allowing it to shoot rockets as well as machine guns. Element: Non-Elemental.\",\n ranks: 0,\n effect: (rank, level) => `Rocket Damage: ${flat(rank, level, 32)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Violent Violence\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Fire Rate for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 3)}%\\nCooldown: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Playing Dirty\": {\n text: \"Kill Skill. After killing an enemy, Zane's next five shots all have a chance to fire an additional projectile.\",\n ranks: 5,\n effect: (rank, level) => `Extra Shot Chance: ${percent(rank, 10)}%`,\n },\n \"Almighty Ordnance\": {\n text: \"Hold down [Action Skill key] while SNTNL is deployed to paint a target area. SNTNL fires a missile barrage at that area, and if an enemy is killed, SNTNL's duration is reset. This can only be used once per Action Skill use.\",\n ranks: 0,\n effect: (rank, level) => `Missile Damage: ${flat(rank, level, 56)} (increases with character level)\\nMissiles per Barrage: 4`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Good Misfortune\": {\n text: \"Kill Skill. Killing an enemy increases Zane's Action Skill Duration. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Action Skill Duration Returned: +${percent(rank, 4)}% of Max Duration`,\n },\n },\n \"6\": {\n \"Seein' Red\": {\n text: \"Activating an Action Skill automatically activates all of Zane's Kill Skills.\",\n ranks: 1,\n }\n }\n },\n \"Doubled Agent\": {\n \"0\": {\n \"Digi-Clone\": {\n text: \"Spawn a Digi-Clone of Zane. The Digi-Clone stays in place, but distracts and fires at enemies. Pressing [Action Skill key] while the Digi-Clone is active causes Zane and the Digi-Clone to swap places.\",\n effect: (rank, level) => `Duration: 15 seconds\\nCooldown: 28 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Synchronicity\": {\n text: \"Zane gains increased Gun Damage for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Praemunitus\": {\n text: \"Zane and his Dig-Clone gain increased Magazine Size.\",\n ranks: 3,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 8.333)}%\\nDigi-Clone Magazine Size: +${percent(rank, 8.333)}%`,\n },\n \"Borrowed Time\": {\n text: \"Zane gains increased Action Skill Duration for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Duration: +${percent(rank, 6)}% per active Action Skill`,\n },\n },\n \"2\": {\n \"Binary System\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, a Cryo Nova is triggered around Zane and his Digi-Clone.\",\n ranks: 0,\n effect: (rank, level) => `Cryo Damage: ${flat(rank, level, 46)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Donnybrook\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, he and his Digi-Clone receive increased Gun Damage and gain Health Regeneration for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%\\Health Regeneration: +${percent(rank, 0.5)}% of Missing Health/sec\\nDigi-Clone Gun Damage: +${percent(rank, 3)}%\\nDigi-Clone Health Regen: +${percent(rank, 0.5)}% Missing Health/sec\\nDuration: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Fractal Frags\": {\n text: \"The Digi-Clone throws a copy of Zane's current grenade mod when it is first activated. If the Digi-Clone is killed, it drops a free grenade. Killing an enemy while the Digi-Clone is active gives the Digi-Clone a chance to throw a grenade.\",\n ranks: 1,\n effect: (rank, level) => `Grenade Chance: 30%`,\n },\n \"Duct Tape Mod\": {\n text: \"The first shot fired from Zane's gun has a chance to also fire a grenade. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Grenade Chance: ${percent(rank, 4)}%\\nCooldown: 8 seconds`,\n },\n },\n \"3\": {\n \"Schadenfreude\": {\n text: \"Whenever the Digi-Clone takes damage, Zane's shield is restored by a portion of that damage.\",\n ranks: 0,\n effect: (rank, level) => `Shields Restored: 100% of damage taken by Digi-Clone`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Quick Breather\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, his shield immediately begins recharging. The Digi-Clone also immediately restores health.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Health Restored: 50% of Max Health`,\n },\n \"Which One's Real?\": {\n text: \"Enemies are more likely to target the Digi-Clone for a few seconds after it's summoned and after swapping places.\",\n ranks: 0,\n effect: (rank, level) => `Duration: 4 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Dopplebanger\": {\n text: \"Hold down [Action Skill key] to end the action skill early. When Zane's Action Skill is ended, the Digi-Clone explodes, dealing Splash Damage to all nearby enemies. The more Action Skill time remaining, the greater the damage.\",\n ranks: 0,\n effect: (rank, level) => `Damage: Up to ${flat(rank, level, 280)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Pocket Full of Grenades\": {\n text: \"Kill Skill. After killing an enemy, Zane gains Grenade Regeneration for a few seconds.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Regeneration: +${percent(rank, 5)}% per second\\nDuration: 8 seconds`,\n },\n \"Old-U\": {\n text: \"Press [Action Skill key] during Fight For Your Life if Digi-Clone is active to destroy the Digi-Clone and immediately gain a Second Wind with full health.\",\n ranks: 1,\n effect: (rank, level) => `Health Restored: 100% of Maximum Health`,\n },\n \"Supersonic Man\": {\n text: \"Zane gains increased Movement Speed for each active Action Skill.\",\n ranks: 3,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Digital Distribution\": {\n text: \"If Zane takes health damage while the Digi-Clone is active, a portion of that damage is inflicted on his Digi-Clone instead.\",\n ranks: 0,\n effect: (rank, level) => `Damage Shared: 75%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Like a Ghost\": {\n text: \"Zane and his Digi-Clone gain a chance to ignore bullets. This chance is increased for a few seconds after activating an Action Skill. This effect stacks.\",\n ranks: 3,\n effect: (rank, level) => `Ignore Bullet Chance: +${percent(rank, 2)}%\\nAdditional Ignore Bullet Chance: +${percent(rank, 3)}%\\nDuration: 8 seconds`,\n },\n \"Boom. Enhance.\": {\n text: \"Whenever Zane summons his Digi-Clone, it consumes up to 3 grenades. For every grenade consumed, the Digi-Clone gains increased Gun Damage, Maximum Health, Fire Rate, Reload Speed, and Digi-Clone Duration.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Gun Damage: +20% per grenade\\nDigi-Clone Maximum Health: +81% per grenade\\nDigi-Clone Fire Rate: +5% per grenade\\nDigi-Clone Reload Speed: +31% per grenade\\nDigi-Clone Duration: +25% per grenade`,\n },\n \"Trick of the Light\": {\n text: \"Zane deals Bonus Cryo Damage to enemies that aren't targeting him.\",\n ranks: 3,\n effect: (rank, level) => `Bonus Cryo Damage: +${percent(rank, 12)}% of damage dealt`,\n },\n },\n \"6\": {\n \"Double Barrel\": {\n text: \"The Digi-Clone is equipped with a copy of Zane's Current Weapon when activated. Swapping places with the Digi-Clone causes Zane and his Digi-Clone to gain increased Gun Damage.\",\n ranks: 1,\n effect: (rank, level) => `Item Duping: +100%\\nGun Damage: +25%\\nDigi-Clone Gun Damage: +25%`,\n },\n },\n },\n};\n\nexport default skills;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/bundle.964e211b.js b/bundle.964e211b.js new file mode 100644 index 0000000..4af50a5 --- /dev/null +++ b/bundle.964e211b.js @@ -0,0 +1,2 @@ +!function(e){function n(a){if(t[a])return t[a].exports;var r=t[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,n),r.l=!0,r.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,a){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(n.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(a,r,function(n){return e[n]}.bind(null,r));return a},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="/",n(n.s=0)}({"/Yqc":function(e,n){function t(){return"serviceWorker"in navigator&&("https:"===window.location.protocol||"localhost"===window.location.hostname||0===window.location.hostname.indexOf("127."))}n.install=function(e){if(e||(e={}),t()){var n=navigator.serviceWorker.register("/sw.js",{}),a=function(e){function n(){switch(o.state){case"redundant":r("onUpdateFailed"),o.onstatechange=null;break;case"installing":a||r("onUpdating");break;case"installed":i||r("onUpdateReady");break;case"activated":r("onUpdated"),o.onstatechange=null}}function t(){switch(o.state){case"redundant":o.onstatechange=null;break;case"installing":case"installed":break;case"activated":r("onInstalled"),o.onstatechange=null}}var a,i,s,o=e.installing||e.waiting;o&&!o.onstatechange&&(e.active?(n(),s=n):(t(),s=t),a=!0,e.waiting&&(i=!0),o.onstatechange=s)},r=function(n){"function"==typeof e[n]&&e[n]({source:"ServiceWorker"})};n.then(function(e){e&&(a(e),e.onupdatefound=function(){a(e)})}).catch(function(e){return r("onError"),Promise.reject(e)})}},n.applyUpdate=function(e,n){t()&&navigator.serviceWorker.getRegistration().then(function(t){t&&t.waiting?(t.waiting.postMessage({action:"skipWaiting"}),e&&e()):n&&n()})},n.update=function(){t()&&navigator.serviceWorker.getRegistration().then(function(e){if(e)return e.update()})}},0:function(e,n,t){e.exports=t("QfWi")},"31cR":function(e){e.exports={skill:"_3JH8h",enabled:"_1mLSi",usable:"_1xemn",augment:"_3VkFk",actionSkill:"-z8wv",chevron:"_2t_-G",diamond:"_2ej0d",image:"_8ejWg",ranks:"_3DD7O",skillTitle:"_394yV",description:"_1S9-f",effect:"oiyDq"}},"9fQE":function(e,n,t){"use strict";(function(e){function a(n){var t=n.path;return e("nav",null,[{name:"Zane",path:"/operative"},{name:"Amara",path:"/siren"},{name:"FL4K",path:"/beastmaster"},{name:"Moze",path:"/gunner"}].map(function(n){return t===n.path?null:e(r.a,{href:n.path},n.name)}))}t.d(n,"a",function(){return a});var r=t("Y3FI")}).call(this,t("gDde").h)},"Et/u":function(e,n,t){"use strict";function a(e,n){return Math.round(e*n*10)/10}function r(e,n,t){return Math.floor(e*t)}var i=t("LMbI");n.a={Brawl:{0:{Phaseslam:{text:"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,98)+" (increases with character level)\nCooldown: 35 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Root to Rise":{ranks:5,text:"Amara gains increased Maximum Health.",effect:function(e){return"Maximum Health: +"+a(e,8)+"%"}},"Personal Space":{ranks:3,text:"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.",effect:function(e){return"Bonus Damage: Up to +"+a(e,18)+"% of damage dealt"}},Clarity:{ranks:5,text:"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.",effect:function(e){return"Health Regen: Up to +"+a(e,1)+"% of Missing Health/sec\nAdditional Regen: Up to +"+a(e,1)+"% of Missing Health/sec\nDuration: 5 seconds"}}},2:{"Arms Deal":{ranks:5,text:"Amara deals increased Splash Damage and takes reduced Splash Damage.",effect:function(e){return"Splash Damage: +"+a(e,4)+"%\nSplash Damage Resistance: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}},Samsara:{ranks:3,text:"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.",effect:function(e){return"Gun Damage: +"+a(e,1.7)+"% per stack\nHealth Regen: +"+a(e,1.7)+"% of Missing Health/sec per stack\nMaximum Stacks: 5\nDuration: 20 seconds"}},"Helping Hand(s)":{ranks:5,text:"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Resistance.",effect:function(e){return"Damage Resistance: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%\nDuration: 15 seconds"}},"Blight Tiger":{ranks:0,text:"Converts Amara's Action Skill to Corrosive Damage.",effect:function(){return"Action Skill Element: Corrosive."},type:i.a.AUGMENT_DIAMOND}},3:{Fracture:{ranks:0,text:"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level)\nCooldown: 28 seconds"},type:i.a.AUGMENT_ACTION_SKILL},Mindfulness:{ranks:3,text:"Whenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.",effect:function(e){return"Shield Regeneration Delay: -"+function(e){switch(e){case 1:return 9;case 2:return 17;case 3:return 23;default:return 0}}(e)+"% per stack\nMovement Speed: +"+a(e,1.4)+"% per stack\nMaximum Stacks: 25\nDuration: 5 seconds"}},"Find Your Center":{ranks:1,text:"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.",effect:function(){return"Melee Damage: +100%\nMelee Range: +75%\nDuration: 20 seconds"}},Vigor:{ranks:3,text:"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.",effect:function(e){return"Team Movement Speed: +"+a(e,3.333)+"%\nDuration: 8 seconds"}},Revelation:{ranks:0,text:"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.",effect:function(e){return"Nova Damage: "+r(e,0,41)+" (increases with character level)\nAction Skill Damage: -15%"},type:i.a.AUGMENT_CHEVRON}},4:{Downfall:{ranks:0,text:"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam. Element: Shock.",effect:function(e){return"Beam Damage: "+r(e,0,14)+" per second (increases with character level)\nSlam Damage: "+r(e,0,95)+" (increases with character level)\nCooldown: 47 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"One With Nature":{ranks:5,text:"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.",effect:function(e){return"Maximum Health: +"+a(e,5)+"%\nElemental Damage Resistance: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}}},5:{"Do Unto Others":{ranks:1,text:"Whenever an enemy damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.",effect:function(){return"Cooldown: 8 seconds"}},"Jab Cross":{ranks:5,text:"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.",effect:function(e){return"Action Skill Damage: +"+a(e,15)+"%\nGun Damage: +"+a(e,3)+"%\nDuration: 10 seconds"}},"Guardian Angel":{ranks:1,text:"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.",effect:function(){return"Health Restored: 50% of Maximum Health\nCooldown: 120 seconds"}},Glamour:{ranks:0,text:"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.",effect:function(){return"Confuse Duration: 8 seconds\nAction Skill Damage: -10%\nAction Skill Cooldown: +20%"},type:i.a.AUGMENT_CHEVRON}},6:{Blitz:{ranks:1,text:"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.",effect:function(){return"Melee Damage: +100%\nCooldown: 8 seconds"}}}},"Mystical Assault":{0:{Phasecast:{text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,92)+"\nCooldown: 28 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Do Harm":{ranks:5,text:"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.",effect:function(e){return"Action Skill Dmg: +"+a(e,.9)+"% per Rush stack consumed\nMaximum Rush Stacks: 10\nDuration: 20 seconds"}},"Fast Hand(s)":{ranks:3,text:"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.",effect:function(e){return"Reload Speed: +"+function(e){switch(e){case 1:return 7;case 2:return 14;case 3:return 19;default:return 0}}(e)+"%\nWeapon Swap Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%\nMode Switch Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%"}},"Violent Tapestry":{ranks:5,text:"Applying a Status Effect grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.",effect:function(e){return"StatusEffect Chance: +"+a(e,.6)+"% per Rush stack consumed\nMaximum Rush Stacks: 10\nDuration: 20 seconds"}}},2:{Alacrity:{ranks:5,text:"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.",effect:function(e){return"Reload Speed: +"+a(e,.4)+"% per Rush stack\nAdditional Reload Speed: +"+function(e){switch(e){case 1:return.6;case 2:return 1.2;case 3:return 1.8;case 4:return 2.3;case 5:return 2.9;default:return 0}}(e)+"% per Rush stack consumed\nDuration: 8 seconds"}},Transcend:{ranks:3,text:"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.",effect:function(e){return"Accuracy: +"+function(e){switch(e){case 1:return 17;case 2:return 29;case 3:return 38;default:return 0}}(e)+"%\nCritical Hit Damage: +"+a(e,9)+"%\nDuration: 12 seconds"}},Restless:{ranks:5,text:"Amara gains increased Action Skill Cooldown Rate.",effect:function(e){return"Action Skill Cooldown Rate: +"+a(e,5)+"%"}},"Soul Sap":{ranks:0,text:"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.",effect:function(){return"Action Skill Life Steal: 30% of damage dealt"},type:i.a.AUGMENT_CHEVRON}},3:{Deliverance:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,86)+" (increases with character level)\nElemental Projectiles: 3 per enemy or object hit\nCooldown: 28 seconds"},type:i.a.AUGMENT_ACTION_SKILL},Ascendant:{ranks:1,text:"All Action Skill Augments gain increased effects.",effect:function(){return"Soul Sap Life Steal: +20%\nAllure Radius: +100%\nGlamour Duration: +50%\nStillness of Mind: Breaks 0.75 sec after taking dmg\nRevelation Damage: +25%"}},"Stillness of Mind":{ranks:0,text:"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.",effect:function(){return"Phaselock Duration: 6 seconds\nAction Skill Damage: -25%\nAction Skill Cooldown: +15%"},type:i.a.AUGMENT_CHEVRON}},4:{Reverberation:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astral Projection deals increased damage for every enemy it hits. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level)\nDamage Bonus: +50% per enemy hit\nCooldown: 30 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"From Rest":{ranks:3,text:"Amara gains improved Fire Rate and Charge Time.",effect:function(e){return"Fire Rate: +"+a(e,4)+"%\nCharge Time: +"+function(e){switch(e){case 1:return 21;case 2:return 34;case 3:return 44;default:return 0}}(e)+"%"}},"Laid Bare":{ranks:3,text:"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.",effect:function(e){return"Damage Increase: +"+a(e,8.333)+"%\nDuration: 8 seconds"}},Wrath:{ranks:3,text:"Amara gains increased Gun Damage. This effect is increased after she activates her Action Skill for a few seconds.",effect:function(e){return"Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"%\nAdditional Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"%\nDuration: 8 seconds"}}},5:{Remnant:{ranks:3,text:"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.",effect:function(e){return"Remnant Base Damage: "+r(e,0,9)+" (increases with character level)"}},Awakening:{ranks:3,text:"Amara's Rush stacks gain increased effectiveness.",effect:function(e){return"Rush Stack Effectiveness: +"+a(e,10)+"%"}},Tandava:{ranks:0,text:"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,91)+" (increases with character level)\nCooldown: 35 seconds"},type:i.a.AUGMENT_ACTION_SKILL}},6:{Avatar:{ranks:1,text:"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.",effect:function(){return"Maximum Rush Stacks: +10"}}}},"Fist of the Elements":{0:{Phasegrasp:{text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Skill Duration: 7 seconds\nCooldown: 16 seconds\nGrasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.ACTION_SKILL,ranks:0}},1:{Anima:{ranks:5,text:"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.",effect:function(e){return"Action Skill Status Effect Damage: +"+a(e,8)+"%\nOther Status Effect Damage: +"+a(e,4)+"%\nStatus Effect Duration: +"+a(e,20)+"%"}},"Steady Hands":{ranks:3,text:"Amara gains increased Weapon Handling and Accuracy.",effect:function(e){return"Handling: +"+function(e){switch(e){case 1:return 14;case 2:return 24;case 3:return 32;default:return 0}}(e)+"%\nAccuracy: +"+function(e){switch(e){case 1:return 13;case 2:return 23;case 3:return 31;default:return 0}}(e)+"%"}},Infusion:{ranks:5,text:"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.",effect:function(e){return"Converted Damage: "+a(e,8)+"%"}}},2:{Tempest:{ranks:5,text:"Amara deals increased Elemental Damage. Shock Damage is further increased.",effect:function(e){return"Shock Damage: +"+a(e,8)+"%\nOther Elemental Damage: +"+a(e,6)+"%"}},"Illuminated Fist":{ranks:1,text:"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.",effect:function(){return"Melee Damage: +75%"}},Wildfire:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.",effect:function(e){return"Spread Chance: +"+a(e,8)+"%"}},Soulfire:{ranks:0,text:"Converts Amara's Action Skill to Incendiary Damage.",effect:function(){return"Action Skill Element: Incendiary."},type:i.a.AUGMENT_DIAMOND}},3:{"The Eternal Fist":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Bonus Targets: Up to +4\nDuration: 7 seconds\nCooldown: 20 seconds\nGrasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Dread:{ranks:1,text:"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.",effect:function(){return"Gun Damage: +15%\nDuration: 8 seconds"}},Allure:{ranks:0,text:"Amara's Action Skill creates a singularity that pulls in enemies.",effect:function(){return"Duration: 2.5 seconds\nAction Skill Damage: -20%"},type:i.a.AUGMENT_CHEVRON}},4:{Indiscriminate:{ranks:3,text:"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Ricochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.",effect:function(e){return"Ricochet Chance: +"+a(e,10)+"%\nRicochet Damage: 50% of damage dealt\nAction Skill Ricochet Chance: +"+a(e,20)+"%\nAction Skill Ricochet Damage: 75% of damage dealt"}},"Deep Well":{ranks:1,text:"Amara gains increased Magazine Size with elemental weapons.",effect:function(){return"Magazine Size: +20%"}},Catharsis:{ranks:3,text:"Whenever Amara triggers an elemental effect on an enemy, when that enemy dies that enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.",effect:function(e){return"Damage: "+r(e,0,4)+" (increases with character level)\nCooldown: 8 seconds"}},"Ties That Bind":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Linked Damage: 35% of damage dealt\nDuration: 7 seconds\nCooldown: 18 seconds\nGrasp Immune Damage: "+r(e,0,34)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL}},5:{"Fist Over Matter":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.",effect:function(e){return"Damage: "+r(e,0,35)+" (increases with character level)\nDuration: 7 seconds\nCooldown: 28 seconds\nGrasp Immune Damage: "+r(e,0,39)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Sustainment:{ranks:5,text:"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.",effect:function(e){return"Elemental Weapon Life Steal: +"+a(e,4)+"% of damage dealt"}},Conflux:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.",effect:function(e){return"Extra Status Effect Chance: +"+a(e,7)+"%"}}},6:{"Forceful Expression":{ranks:1,text:"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.",effect:function(){return"Bonus Elemental Damage: +18% of damage dealt"}}}}}},Fl18:function(e,n,t){"use strict";(function(e){var a=t("laFY"),r=t.n(a),i=e("span",null,e("a",{href:"https://borderlands.com/"},"Official Borderlands website")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com"},"Source Code")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/bug"},e("img",{alt:"GitHub issues: bugs",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/bug"}))," ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/enhancement"},e("img",{alt:"GitHub issues: enhancements",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/enhancement"}))," ",e("img",{alt:"GitHub contributors",src:"https://img.shields.io/github/contributors/seigler/bl3skills.com"}));n.a=function(){return e("footer",{class:r.a.footer},i)}}).call(this,t("gDde").h)},G9Up:function(e,n,t){"use strict";(function(e){var a=t("Y3FI"),r=t("NZ6x"),i=t("cY+X"),s=t("rFP/"),o=t("x3c/"),c=t("cQx2"),l=e(a.b,null,e(r.a,{path:"/"}),e(i.a,{path:"/operative"}),e(s.a,{path:"/siren"}),e(o.a,{path:"/beastmaster"}),e(c.a,{path:"/gunner"}));n.a=function(){return l}}).call(this,t("gDde").h)},J3pd:function(e,n,t){"use strict";(function(e){function a(){return(a=Object.assign||function(e){for(var n=1;n=5*o-5,level:Object(d.a)(t.state),image:"../../assets/hunters/"+g+"/"+r+o+l+".png",onChange:y(c,r,n,o)}))}))})))}),S=Object(d.a)(this.state);return e("div",null,e("div",{class:h.a.header},e("h1",{class:h.a.title},c,e("div",{class:h.a.subtitle},"the ",g)),e("div",{class:h.a.sidepanel},e("div",{class:h.a.level+" "+(S>50?S>61?h.a.overlevelB:h.a.overlevelA:"")},"Level ",S),e("div",{class:h.a.reset},e("a",{onClick:function(){Object(l.b)(k),t.setState({invested:[0,0,0],skills:k||{}})}},"Reset"))),e(o.a,{path:p})),e("main",null,e("div",{class:h.a.VaultHunter,onContextMenu:r},e("div",{class:h.a.trees},v))),m)},t}(i.Component)}).call(this,t("gDde").h)},LMbI:function(e,n){"use strict";n.a={ACTION_SKILL:1,AUGMENT_CHEVRON:2,AUGMENT_DIAMOND:3,AUGMENT_ACTION_SKILL:4}},MKmk:function(e){e.exports={VaultHunter:"_2zgqJ",header:"_1Jomm",title:"_17kLY",subtitle:"_3J3hw",sidepanel:"_2UO55",level:"xH9ts",reset:"K9CBr",overlevelA:"_1LE8c",overlevelB:"_1vOfn",trees:"_3ek45",tier:"_3Ch4X",treeName:"_1WAM2",tree:"gRWZY",skills:"_2Su0b",green:"-Pl7G",blue:"_1nm1I",red:"_3T1pZ"}},NZ6x:function(e,n,t){"use strict";(function(e){var a=t("Y3FI"),r=t("Fl18"),i=t("odKX"),s=t.n(i),o=e(r.a,null);n.a=function(){return e("div",null,e("div",{class:s.a.splash},e("div",{class:s.a.wrapper},e("h1",null,e("div",{class:s.a.disclaimer},"(Unofficial)"),"Borderlands 3 skill calculator"),[{name:"Zane",job:"the Operative",path:"/operative"},{name:"Amara",job:"the Siren",path:"/siren"},{name:"FL4K",job:"the Beastmaster",path:"/beastmaster"},{name:"Moze",job:"the Gunner",path:"/gunner"}].map(function(n){return e(a.a,{class:s.a.link,href:n.path},e("div",{class:s.a.name},n.name,e("div",{class:s.a.job},n.job)))}))),o)}}).call(this,t("gDde").h)},QfWi:function(e,n,t){"use strict";t.r(n);var a=t("gDde"),r=t("G9Up"),i=(t("pyAK"),document.querySelector("#app"));Object(a.render)(Object(a.h)(r.a,null),i,i.firstElementChild);t("/Yqc").install()},Y3FI:function(e,n,t){"use strict";function a(e,n){for(var t in n)e[t]=n[t];return e}function r(e,n){return e.rankn.rank?-1:e.index-n.index}function i(e,n){return e.index=n,e.rank=function(e){return e.attributes.default?0:(n=e.attributes.path,s(n).map(o).join(""));var n}(e),e.attributes}function s(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")}function o(e){return":"==e.charAt(0)?1+"*+?".indexOf(e.charAt(e.length-1))||4:5}function c(){var e;return""+((e=k&&k.location?k.location:k&&k.getCurrentLocation?k.getCurrentLocation():"undefined"!=typeof location?location:S).pathname||"")+(e.search||"")}function l(e,n){return void 0===n&&(n=!1),"string"!=typeof e&&e.url&&(n=e.replace,e=e.url),function(e){for(var n=y.length;n--;)if(y[n].canRoute(e))return!0;return!1}(e)&&function(e,n){void 0===n&&(n="push"),k&&k[n]?k[n](e):"undefined"!=typeof history&&history[n+"State"]&&history[n+"State"](null,null,e)}(e,n?"replace":"push"),u(e)}function u(e){for(var n=!1,t=0;t0},n.prototype.routeTo=function(e){return this._didRoute=!1,this.setState({url:e}),this.updating?this.canRoute(e):(this.forceUpdate(),this._didRoute)},n.prototype.componentWillMount=function(){y.push(this),this.updating=!0},n.prototype.componentDidMount=function(){var e=this;k&&(this.unlisten=k.listen(function(n){e.routeTo(""+(n.pathname||"")+(n.search||""))})),this.updating=!1},n.prototype.componentWillUnmount=function(){"function"==typeof this.unlisten&&this.unlisten(),y.splice(y.indexOf(this),1)},n.prototype.componentWillUpdate=function(){this.updating=!0},n.prototype.componentDidUpdate=function(){this.updating=!1},n.prototype.getMatchingChildren=function(e,n,t){return e.filter(i).sort(r).map(function(e){var r=function(e,n,t){var a,r=/(?:\?([^#]*))?(#.*)?$/,i=e.match(r),o={};if(i&&i[1])for(var c=i[1].split("&"),l=0;l2;)R.push(arguments[i]);for(n&&null!=n.children&&(R.length||R.push(n.children),delete n.children);R.length;)if((a=R.pop())&&void 0!==a.pop)for(i=a.length;i--;)R.push(a[i]);else"boolean"==typeof a&&(a=null),(r="function"!=typeof e)&&(null==a?a="":"number"==typeof a?a+="":"string"!=typeof a&&(r=!1)),r&&t?s[s.length-1]+=a:s===_?s=[a]:s.push(a),t=r;var o=new M;return o.nodeName=e,o.children=s,o.attributes=null==n?void 0:n,o.key=null==n?void 0:n.key,void 0!==C.vnode&&C.vnode(o),o}function t(e,n){for(var t in n)e[t]=n[t];return e}function a(e,n){null!=e&&("function"==typeof e?e(n):e.current=n)}function r(e){!e.__d&&(e.__d=!0)&&1==T.push(e)&&(C.debounceRendering||E)(i)}function i(){for(var e;e=T.pop();)e.__d&&A(e)}function s(e,n,t){return"string"==typeof n||"number"==typeof n?void 0!==e.splitText:"string"==typeof n.nodeName?!e._componentConstructor&&o(e,n.nodeName):t||e._componentConstructor===n.nodeName}function o(e,n){return e.__n===n||e.nodeName.toLowerCase()===n.toLowerCase()}function c(e){var n=t({},e.attributes);n.children=e.children;var a=e.nodeName.defaultProps;if(void 0!==a)for(var r in a)void 0===n[r]&&(n[r]=a[r]);return n}function l(e){var n=e.parentNode;n&&n.removeChild(e)}function u(e,n,t,r,i){if("className"===n&&(n="class"),"key"===n);else if("ref"===n)a(t,null),a(r,e);else if("class"!==n||i)if("style"===n){if(r&&"string"!=typeof r&&"string"!=typeof t||(e.style.cssText=r||""),r&&"object"==typeof r){if("string"!=typeof t)for(var s in t)s in r||(e.style[s]="");for(var s in r)e.style[s]="number"==typeof r[s]&&!1===N.test(s)?r[s]+"px":r[s]}}else if("dangerouslySetInnerHTML"===n)r&&(e.innerHTML=r.__html||"");else if("o"==n[0]&&"n"==n[1]){var o=n!==(n=n.replace(/Capture$/,""));n=n.toLowerCase().substring(2),r?t||e.addEventListener(n,d,o):e.removeEventListener(n,d,o),(e.__l||(e.__l={}))[n]=r}else if("list"!==n&&"type"!==n&&!i&&n in e){try{e[n]=null==r?"":r}catch(e){}null!=r&&!1!==r||"spellcheck"==n||e.removeAttribute(n)}else{var c=i&&n!==(n=n.replace(/^xlink:?/,""));null==r||!1===r?c?e.removeAttributeNS("http://www.w3.org/1999/xlink",n.toLowerCase()):e.removeAttribute(n):"function"!=typeof r&&(c?e.setAttributeNS("http://www.w3.org/1999/xlink",n.toLowerCase(),r):e.setAttribute(n,r))}else e.className=r||""}function d(e){return this.__l[e.type](C.event&&C.event(e)||e)}function f(){for(var e;e=F.shift();)C.afterMount&&C.afterMount(e),e.componentDidMount&&e.componentDidMount()}function h(e,n,t,a,r,i){H++||(L=null!=r&&void 0!==r.ownerSVGElement,G=null!=e&&!("__preactattr_"in e));var s=m(e,n,t,a,i);return r&&s.parentNode!==r&&r.appendChild(s),--H||(G=!1,i||f()),s}function m(e,n,t,a,r){var i=e,s=L;if(null!=n&&"boolean"!=typeof n||(n=""),"string"==typeof n||"number"==typeof n)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=n&&(e.nodeValue=n):(i=document.createTextNode(n),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0))),i.__preactattr_=!0,i;var c=n.nodeName;if("function"==typeof c)return w(e,n,t,a);if(L="svg"===c||"foreignObject"!==c&&L,c+="",(!e||!o(e,c))&&(i=function(e,n){var t=n?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return t.__n=e,t}(c,L),e)){for(;e.firstChild;)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0)}var l=i.firstChild,u=i.__preactattr_,d=n.children;if(null==u){u=i.__preactattr_={};for(var f=i.attributes,h=f.length;h--;)u[f[h].name]=f[h].value}return!G&&d&&1===d.length&&"string"==typeof d[0]&&null!=l&&void 0!==l.splitText&&null==l.nextSibling?l.nodeValue!=d[0]&&(l.nodeValue=d[0]):(d&&d.length||null!=l)&&g(i,d,t,a,G||null!=u.dangerouslySetInnerHTML),y(i,n.attributes,u),L=s,i}function g(e,n,t,a,r){var i,o,c,u,d,f=e.childNodes,h=[],g={},k=0,y=0,v=f.length,S=0,D=n?n.length:0;if(0!==v)for(var A=0;A2?[].slice.call(arguments,2):e.children)},createRef:function(){return{}},Component:b,render:function(e,n,t){return h(t,e,{},!1,n,!1)},rerender:i,options:C}}()},gqmc:function(e,n,t){"use strict";function a(e){for(var n=0,t=[0,0,0],a=0,r=0,i=Object.values(e);rh.ranks)return!1;u+=h.invested||0}if(u>0&&s+5<5*o)return!1;s+=u,o+=1}t[a]=s,n+=s,a+=1}return!(n>69)&&t}function r(e){for(var n=1;n0)?o.a.usable:""].join(" "),onClick:t,onContextMenu:t},e("div",{class:o.a.image},e("img",{src:b,alt:a(s)})),w&&h>0&&e("div",{class:o.a.ranks},g,"/",h),e("div",{class:o.a.description},e("h3",{class:o.a.skillTitle},s),d,g>0&&e("div",{class:o.a.effect},"Current Effect:",c,v(g,k)),null!==D&&e("div",{class:o.a.effect},v(1,k)),null==D&&g\n {\n pages.map(page => (\n path === page.path ? null : {page.name}\n ))\n }\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Arms Deal Splash Damage Resistance\nfunction getArmsDealSplashDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Helping Hand(s) Damage Resistance\nfunction getHelpingHandsDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Mindfulness Shield Regeneration Delay\nfunction getMindfulnessShieldRegenerationDelay(rank) {\n switch (rank) {\n case 1:\n return 9;\n case 2:\n return 17;\n case 3:\n return 23;\n default:\n return 0;\n }\n}\n\n// One With Nature Elemental Damage Resistance\nfunction getOneWithNatureElementalDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Reload Speed\nfunction getFastHandsReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 7;\n case 2:\n return 14;\n case 3:\n return 19;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Weapon Swap Speed\nfunction getFastHandsWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Mode Switch Speed\nfunction getFastHandsModeSwitchSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Alacrity Reload Speed After Action Skill\nfunction getAlacrityReloadSpeedAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 0.6;\n case 2:\n return 1.2;\n case 3:\n return 1.8;\n case 4:\n return 2.3;\n case 5:\n return 2.9;\n default:\n return 0;\n }\n}\n\n// Transcend Accuracy\nfunction getTranscendAccuracy(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n default:\n return 0;\n }\n}\n\n// From Rest Charge Time\nfunction getFromRestChargeTime(rank) {\n switch (rank) {\n case 1:\n return 21;\n case 2:\n return 34;\n case 3:\n return 44;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage\nfunction getWrathGunDamage(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage After Action Skill\nfunction getWrathGunDamageAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Steady Hands Handling\nfunction getSteadyHandsHandling(rank) {\n switch (rank) {\n case 1:\n return 14;\n case 2:\n return 24;\n case 3:\n return 32;\n default:\n return 0;\n }\n}\n\n// Steady Hands Accuracy\nfunction getSteadyHandsAccuracy(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Brawl\": {\n \"0\": {\n \"Phaseslam\": {\n text: \"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 98)} (increases with character level)\\nCooldown: 35 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Root to Rise\": {\n ranks: 5,\n text: \"Amara gains increased Maximum Health.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 8)}%`,\n },\n \"Personal Space\": {\n ranks: 3,\n text: \"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.\",\n effect: (rank, level) => `Bonus Damage: Up to +${percent(rank, 18)}% of damage dealt`,\n },\n \"Clarity\": {\n ranks: 5,\n text: \"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.\",\n effect: (rank, level) => `Health Regen: Up to +${percent(rank, 1)}% of Missing Health/sec\\nAdditional Regen: Up to +${percent(rank, 1)}% of Missing Health/sec\\nDuration: 5 seconds`,\n },\n },\n \"2\": {\n \"Arms Deal\": {\n ranks: 5,\n text: \"Amara deals increased Splash Damage and takes reduced Splash Damage.\",\n effect: (rank, level) => `Splash Damage: +${percent(rank, 4)}%\\nSplash Damage Resistance: +${getArmsDealSplashDamageResistance(rank)}%`,\n },\n \"Samsara\": {\n ranks: 3,\n text: \"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${percent(rank, 1.7)}% per stack\\nHealth Regen: +${percent(rank, 1.7)}% of Missing Health/sec per stack\\nMaximum Stacks: 5\\nDuration: 20 seconds`,\n },\n \"Helping Hand(s)\": {\n ranks: 5,\n text: \"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Resistance.\",\n effect: (rank, level) => `Damage Resistance: +${getHelpingHandsDamageResistance(rank)}%\\nDuration: 15 seconds`,\n },\n \"Blight Tiger\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Corrosive Damage.\",\n effect: (rank, level) => `Action Skill Element: Corrosive.`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"Fracture\": {\n ranks: 0,\n text: \"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level)\\nCooldown: 28 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Mindfulness\": {\n ranks: 3,\n text: \"Whenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Shield Regeneration Delay: -${getMindfulnessShieldRegenerationDelay(rank)}% per stack\\nMovement Speed: +${percent(rank, 1.4)}% per stack\\nMaximum Stacks: 25\\nDuration: 5 seconds`,\n },\n \"Find Your Center\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.\",\n effect: (rank, level) => `Melee Damage: +100%\\nMelee Range: +75%\\nDuration: 20 seconds`,\n },\n \"Vigor\": {\n ranks: 3,\n text: \"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.\",\n effect: (rank, level) => `Team Movement Speed: +${percent(rank, 3.333)}%\\nDuration: 8 seconds`,\n },\n \"Revelation\": {\n ranks: 0,\n text: \"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.\",\n effect: (rank, level) => `Nova Damage: ${flat(rank, level, 41)} (increases with character level)\\nAction Skill Damage: -15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Downfall\": {\n ranks: 0,\n text: \"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam. Element: Shock.\",\n effect: (rank, level) => `Beam Damage: ${flat(rank, level, 14)} per second (increases with character level)\\nSlam Damage: ${flat(rank, level, 95)} (increases with character level)\\nCooldown: 47 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"One With Nature\": {\n ranks: 5,\n text: \"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 5)}%\\nElemental Damage Resistance: +${getOneWithNatureElementalDamageResistance(rank)}%`,\n },\n },\n \"5\": {\n \"Do Unto Others\": {\n ranks: 1,\n text: \"Whenever an enemy damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.\",\n effect: (rank, level) => `Cooldown: 8 seconds`,\n },\n \"Jab Cross\": {\n ranks: 5,\n text: \"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.\",\n effect: (rank, level) => `Action Skill Damage: +${percent(rank, 15)}%\\nGun Damage: +${percent(rank, 3)}%\\nDuration: 10 seconds`,\n },\n \"Guardian Angel\": {\n ranks: 1,\n text: \"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.\",\n effect: (rank, level) => `Health Restored: 50% of Maximum Health\\nCooldown: 120 seconds`,\n },\n \"Glamour\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.\",\n effect: (rank, level) => `Confuse Duration: 8 seconds\\nAction Skill Damage: -10%\\nAction Skill Cooldown: +20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"6\": {\n \"Blitz\": {\n ranks: 1,\n text: \"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.\",\n effect: (rank, level) => `Melee Damage: +100%\\nCooldown: 8 seconds`,\n },\n },\n },\n \"Mystical Assault\": {\n \"0\": {\n \"Phasecast\": {\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 92)}\\nCooldown: 28 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Do Harm\": {\n ranks: 5,\n text: \"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.\",\n effect: (rank, level) => `Action Skill Dmg: +${percent(rank, 0.9)}% per Rush stack consumed\\nMaximum Rush Stacks: 10\\nDuration: 20 seconds`,\n },\n \"Fast Hand(s)\": {\n ranks: 3,\n text: \"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.\",\n effect: (rank, level) => `Reload Speed: +${getFastHandsReloadSpeed(rank)}%\\nWeapon Swap Speed: +${getFastHandsWeaponSwapSpeed(rank)}%\\nMode Switch Speed: +${getFastHandsModeSwitchSpeed(rank)}%`,\n },\n \"Violent Tapestry\": {\n ranks: 5,\n text: \"Applying a Status Effect grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.\",\n effect: (rank, level) => `StatusEffect Chance: +${percent(rank, 0.6)}% per Rush stack consumed\\nMaximum Rush Stacks: 10\\nDuration: 20 seconds`,\n },\n },\n \"2\": {\n \"Alacrity\": {\n ranks: 5,\n text: \"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.\",\n effect: (rank, level) => `Reload Speed: +${percent(rank, 0.4)}% per Rush stack\\nAdditional Reload Speed: +${getAlacrityReloadSpeedAfterActionSkill(rank)}% per Rush stack consumed\\nDuration: 8 seconds`,\n },\n \"Transcend\": {\n ranks: 3,\n text: \"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.\",\n effect: (rank, level) => `Accuracy: +${getTranscendAccuracy(rank)}%\\nCritical Hit Damage: +${percent(rank, 9)}%\\nDuration: 12 seconds`,\n },\n \"Restless\": {\n ranks: 5,\n text: \"Amara gains increased Action Skill Cooldown Rate.\",\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Soul Sap\": {\n ranks: 0,\n text: \"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.\",\n effect: (rank, level) => `Action Skill Life Steal: 30% of damage dealt`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"3\": {\n \"Deliverance\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 86)} (increases with character level)\\nElemental Projectiles: 3 per enemy or object hit\\nCooldown: 28 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Ascendant\": {\n ranks: 1,\n text: \"All Action Skill Augments gain increased effects.\",\n effect: (rank, level) => `Soul Sap Life Steal: +20%\\nAllure Radius: +100%\\nGlamour Duration: +50%\\nStillness of Mind: Breaks 0.75 sec after taking dmg\\nRevelation Damage: +25%`,\n },\n \"Stillness of Mind\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.\",\n effect: (rank, level) => `Phaselock Duration: 6 seconds\\nAction Skill Damage: -25%\\nAction Skill Cooldown: +15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Reverberation\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astral Projection deals increased damage for every enemy it hits. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level)\\nDamage Bonus: +50% per enemy hit\\nCooldown: 30 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"From Rest\": {\n ranks: 3,\n text: \"Amara gains improved Fire Rate and Charge Time.\",\n effect: (rank, level) => `Fire Rate: +${percent(rank, 4)}%\\nCharge Time: +${getFromRestChargeTime(rank)}%`,\n },\n \"Laid Bare\": {\n ranks: 3,\n text: \"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.\",\n effect: (rank, level) => `Damage Increase: +${percent(rank, 8.333)}%\\nDuration: 8 seconds`,\n },\n \"Wrath\": {\n ranks: 3,\n text: \"Amara gains increased Gun Damage. This effect is increased after she activates her Action Skill for a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${getWrathGunDamage(rank)}%\\nAdditional Gun Damage: +${getWrathGunDamageAfterActionSkill(rank)}%\\nDuration: 8 seconds`,\n },\n },\n \"5\": {\n \"Remnant\": {\n ranks: 3,\n text: \"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.\",\n effect: (rank, level) => `Remnant Base Damage: ${flat(rank, level, 9)} (increases with character level)`,\n },\n \"Awakening\": {\n ranks: 3,\n text: \"Amara's Rush stacks gain increased effectiveness.\",\n effect: (rank, level) => `Rush Stack Effectiveness: +${percent(rank, 10)}%`,\n },\n \"Tandava\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 91)} (increases with character level)\\nCooldown: 35 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"6\": {\n \"Avatar\": {\n ranks: 1,\n text: \"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.\",\n effect: (rank, level) => `Maximum Rush Stacks: +10`,\n },\n },\n },\n \"Fist of the Elements\": {\n \"0\": {\n \"Phasegrasp\": {\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Skill Duration: 7 seconds\\nCooldown: 16 seconds\\nGrasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Anima\": {\n ranks: 5,\n text: \"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.\",\n effect: (rank, level) => `Action Skill Status Effect Damage: +${percent(rank, 8)}%\\nOther Status Effect Damage: +${percent(rank, 4)}%\\nStatus Effect Duration: +${percent(rank, 20)}%`,\n },\n \"Steady Hands\": {\n ranks: 3,\n text: \"Amara gains increased Weapon Handling and Accuracy.\",\n effect: (rank, level) => `Handling: +${getSteadyHandsHandling(rank)}%\\nAccuracy: +${getSteadyHandsAccuracy(rank)}%`,\n },\n \"Infusion\": {\n ranks: 5,\n text: \"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.\",\n effect: (rank, level) => `Converted Damage: ${percent(rank, 8)}%`,\n },\n },\n \"2\": {\n \"Tempest\": {\n ranks: 5,\n text: \"Amara deals increased Elemental Damage. Shock Damage is further increased.\",\n effect: (rank, level) => `Shock Damage: +${percent(rank, 8)}%\\nOther Elemental Damage: +${percent(rank, 6)}%`,\n },\n \"Illuminated Fist\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.\",\n effect: (rank, level) => `Melee Damage: +75%`,\n },\n \"Wildfire\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.\",\n effect: (rank, level) => `Spread Chance: +${percent(rank, 8)}%`,\n },\n \"Soulfire\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Incendiary Damage.\",\n effect: (rank, level) => `Action Skill Element: Incendiary.`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"The Eternal Fist\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Bonus Targets: Up to +4\\nDuration: 7 seconds\\nCooldown: 20 seconds\\nGrasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Dread\": {\n ranks: 1,\n text: \"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.\",\n effect: (rank, level) => `Gun Damage: +15%\\nDuration: 8 seconds`,\n },\n \"Allure\": {\n ranks: 0,\n text: \"Amara's Action Skill creates a singularity that pulls in enemies.\",\n effect: (rank, level) => `Duration: 2.5 seconds\\nAction Skill Damage: -20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Indiscriminate\": {\n ranks: 3,\n text: \"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Ricochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.\",\n effect: (rank, level) => `Ricochet Chance: +${percent(rank, 10)}%\\nRicochet Damage: 50% of damage dealt\\nAction Skill Ricochet Chance: +${percent(rank, 20)}%\\nAction Skill Ricochet Damage: 75% of damage dealt`,\n },\n \"Deep Well\": {\n ranks: 1,\n text: \"Amara gains increased Magazine Size with elemental weapons.\",\n effect: (rank, level) => `Magazine Size: +20%`,\n },\n \"Catharsis\": {\n ranks: 3,\n text: \"Whenever Amara triggers an elemental effect on an enemy, when that enemy dies that enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 4)} (increases with character level)\\nCooldown: 8 seconds`,\n },\n \"Ties That Bind\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Linked Damage: 35% of damage dealt\\nDuration: 7 seconds\\nCooldown: 18 seconds\\nGrasp Immune Damage: ${flat(rank, level, 34)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"5\": {\n \"Fist Over Matter\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies. Some enemies are immune to being Grasped and instantly take damage instead. Element: Shock.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 35)} (increases with character level)\\nDuration: 7 seconds\\nCooldown: 28 seconds\\nGrasp Immune Damage: ${flat(rank, level, 39)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Sustainment\": {\n ranks: 5,\n text: \"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.\",\n effect: (rank, level) => `Elemental Weapon Life Steal: +${percent(rank, 4)}% of damage dealt`,\n },\n \"Conflux\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.\",\n effect: (rank, level) => `Extra Status Effect Chance: +${percent(rank, 7)}%`,\n },\n },\n \"6\": {\n \"Forceful Expression\": {\n ranks: 1,\n text: \"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.\",\n effect: (rank, level) => `Bonus Elemental Damage: +18% of damage dealt`,\n },\n },\n },\n};\n\nexport default skills;\n","import style from './index.css';\n\nexport default function () {\n return (\n \n );\n}\n","import { Router } from 'preact-router';\n\nimport Home from '@pages/Home';\nimport Operative from '@pages/Operative';\nimport Siren from '@pages/Siren';\nimport Beastmaster from '@pages/Beastmaster';\nimport Gunner from '@pages/Gunner';\n\nconst App = () =>\n (\n \n \n \n \n \n );\n\nexport default App;\n","// import { useReducer } from 'preact/hooks'; // Downgraded from Preact 10 for compat with @pwa/cli\nimport { Component } from 'preact';\nimport Skill from '@components/Skill';\nimport Nav from '@components/Nav';\nimport Footer from '@components/Footer';\nimport { getHash, setHash } from './hashHandler';\nimport reducer from './reducer';\nimport { getLevel } from './selectors';\nimport style from './index.css';\n\nfunction contextKiller (event) {\n event.preventDefault();\n return false;\n}\n\nexport default class VaultHunter extends Component {\n constructor (props) {\n super(props);\n this.state = {\n invested: [0, 0, 0],\n skills: props.skills || {},\n };\n }\n\n componentDidMount () {\n this.setState(reducer(this.state, {\n type: 'loadSkills',\n skills: getHash(this.state.skills),\n }));\n }\n\n render ({\n name = 'Unnamed',\n discipline = 'Classless',\n path,\n skills: initialSkills,\n }) {\n const skillChangeListenerFactory = (skillName, treeIndex, treeName, tierIndex) => {\n return (oldValue, newValue) => {\n this.setState(reducer(this.state, {\n type: 'skillChange',\n skillName,\n treeIndex,\n treeName,\n tierIndex,\n newValue,\n oldValue,\n }));\n };\n };\n\n const resetSkills = () => {\n setHash(initialSkills);\n this.setState({\n invested: [0, 0, 0],\n skills: initialSkills || {},\n });\n };\n\n const trees =\n Object.keys(this.state.skills).map((treeName, treeIndex) => {\n return (\n
\n \n

{ treeName }

\n
\n { Object.keys(this.state.skills[treeName]).map((tier, tierIndex) =>\n
\n { Object.keys(this.state.skills[treeName][tier]).map((skillName, skillIndex) =>\n = 5 * tierIndex - 5}\n level={getLevel(this.state)}\n image={`../../assets/hunters/${discipline}/${treeIndex}${tierIndex}${skillIndex}.png`}\n onChange={skillChangeListenerFactory(skillName, treeIndex, treeName, tierIndex)}\n />\n ) }\n
\n ) }\n
\n
\n );\n });\n\n const level = getLevel(this.state);\n\n return (\n
\n
\n

{ name }\n
the { discipline }
\n

\n
\n
50 ? level > 61 ? style.overlevelB : style.overlevelA : ''}`}>Level { level }
\n \n
\n
\n
\n
\n
\n { trees }\n
\n
\n
\n
\n
\n );\n }\n}\n","export default {\n ACTION_SKILL: 1,\n AUGMENT_CHEVRON: 2,\n AUGMENT_DIAMOND: 3,\n AUGMENT_ACTION_SKILL: 4,\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"VaultHunter\":\"_2zgqJ\",\"header\":\"_1Jomm\",\"title\":\"_17kLY\",\"subtitle\":\"_3J3hw\",\"sidepanel\":\"_2UO55\",\"level\":\"xH9ts\",\"reset\":\"K9CBr\",\"overlevelA\":\"_1LE8c\",\"overlevelB\":\"_1vOfn\",\"trees\":\"_3ek45\",\"tier\":\"_3Ch4X\",\"treeName\":\"_1WAM2\",\"tree\":\"gRWZY\",\"skills\":\"_2Su0b\",\"green\":\"-Pl7G\",\"blue\":\"_1nm1I\",\"red\":\"_3T1pZ\"};","import { Link } from 'preact-router';\nimport Footer from '@components/Footer';\nimport style from './index.css';\n\nexport default function () {\n const pages = [\n { name: 'Zane', job: 'the Operative', path: '/operative' },\n { name: 'Amara', job: 'the Siren', path: '/siren' },\n { name: 'FL4K', job: 'the Beastmaster', path: '/beastmaster' },\n { name: 'Moze', job: 'the Gunner', path: '/gunner' },\n ];\n return (\n
\n
\n
\n

(Unofficial)
Borderlands 3 skill calculator

\n { pages.map(page => {\n return (\n \n
\n {page.name}\n
\n {page.job}\n
\n
\n \n );\n }) }\n
\n
\n
\n
\n );\n}\n","import { h, render } from 'preact';\nimport App from '@components/App';\nimport './index.css';\n\nlet elem = document.querySelector('#app');\nlet root = render(, elem, elem.firstElementChild);\n\nif (process.env.NODE_ENV === 'development' && module.hot) {\n // enable preact devtools\n require('preact/debug');\n // respond to HMR updates\n module.hot.accept('@components/App', New => {\n New = require('@components/App').default;\n root = render(, elem, root);\n });\n} else if (process.env.NODE_ENV === 'production') {\n // Service Worker registration\n require('offline-plugin/runtime').install();\n}\n","import { Component, cloneElement, h } from 'preact';\n\nvar EMPTY$1 = {};\n\nfunction assign(obj, props) {\n\t// eslint-disable-next-line guard-for-in\n\tfor (var i in props) {\n\t\tobj[i] = props[i];\n\t}\n\treturn obj;\n}\n\nfunction exec(url, route, opts) {\n\tvar reg = /(?:\\?([^#]*))?(#.*)?$/,\n\t\tc = url.match(reg),\n\t\tmatches = {},\n\t\tret;\n\tif (c && c[1]) {\n\t\tvar p = c[1].split('&');\n\t\tfor (var i=0; i b.rank) ? -1 :\n\t\t(a.index - b.index)\n\t);\n}\n\n// filter out VNodes without attributes (which are unrankeable), and add `index`/`rank` properties to be used in sorting.\nfunction prepareVNodeForRanking(vnode, index) {\n\tvnode.index = index;\n\tvnode.rank = rankChild(vnode);\n\treturn vnode.attributes;\n}\n\nfunction segmentize(url) {\n\treturn url.replace(/(^\\/+|\\/+$)/g, '').split('/');\n}\n\nfunction rankSegment(segment) {\n\treturn segment.charAt(0)==':' ? (1 + '*+?'.indexOf(segment.charAt(segment.length-1))) || 4 : 5;\n}\n\nfunction rank(path) {\n\treturn segmentize(path).map(rankSegment).join('');\n}\n\nfunction rankChild(vnode) {\n\treturn vnode.attributes.default ? 0 : rank(vnode.attributes.path);\n}\n\nvar customHistory = null;\n\nvar ROUTERS = [];\n\nvar subscribers = [];\n\nvar EMPTY = {};\n\nfunction isPreactElement(node) {\n\treturn node.__preactattr_!=null || typeof Symbol!=='undefined' && node[Symbol.for('preactattr')]!=null;\n}\n\nfunction setUrl(url, type) {\n\tif ( type === void 0 ) type='push';\n\n\tif (customHistory && customHistory[type]) {\n\t\tcustomHistory[type](url);\n\t}\n\telse if (typeof history!=='undefined' && history[type+'State']) {\n\t\thistory[type+'State'](null, null, url);\n\t}\n}\n\n\nfunction getCurrentUrl() {\n\tvar url;\n\tif (customHistory && customHistory.location) {\n\t\turl = customHistory.location;\n\t}\n\telse if (customHistory && customHistory.getCurrentLocation) {\n\t\turl = customHistory.getCurrentLocation();\n\t}\n\telse {\n\t\turl = typeof location!=='undefined' ? location : EMPTY;\n\t}\n\treturn (\"\" + (url.pathname || '') + (url.search || ''));\n}\n\n\n\nfunction route(url, replace) {\n\tif ( replace === void 0 ) replace=false;\n\n\tif (typeof url!=='string' && url.url) {\n\t\treplace = url.replace;\n\t\turl = url.url;\n\t}\n\n\t// only push URL into history if we can handle it\n\tif (canRoute(url)) {\n\t\tsetUrl(url, replace ? 'replace' : 'push');\n\t}\n\n\treturn routeTo(url);\n}\n\n\n/** Check if the given URL can be handled by any router instances. */\nfunction canRoute(url) {\n\tfor (var i=ROUTERS.length; i--; ) {\n\t\tif (ROUTERS[i].canRoute(url)) { return true; }\n\t}\n\treturn false;\n}\n\n\n/** Tell all router instances to handle the given URL. */\nfunction routeTo(url) {\n\tvar didRoute = false;\n\tfor (var i=0; i 0;\n\t};\n\n\t/** Re-render children with a new URL to match against. */\n\tRouter.prototype.routeTo = function routeTo (url) {\n\t\tthis._didRoute = false;\n\t\tthis.setState({ url: url });\n\n\t\t// if we're in the middle of an update, don't synchronously re-route.\n\t\tif (this.updating) { return this.canRoute(url); }\n\n\t\tthis.forceUpdate();\n\t\treturn this._didRoute;\n\t};\n\n\tRouter.prototype.componentWillMount = function componentWillMount () {\n\t\tROUTERS.push(this);\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidMount = function componentDidMount () {\n\t\tvar this$1 = this;\n\n\t\tif (customHistory) {\n\t\t\tthis.unlisten = customHistory.listen(function (location) {\n\t\t\t\tthis$1.routeTo((\"\" + (location.pathname || '') + (location.search || '')));\n\t\t\t});\n\t\t}\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.componentWillUnmount = function componentWillUnmount () {\n\t\tif (typeof this.unlisten==='function') { this.unlisten(); }\n\t\tROUTERS.splice(ROUTERS.indexOf(this), 1);\n\t};\n\n\tRouter.prototype.componentWillUpdate = function componentWillUpdate () {\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidUpdate = function componentDidUpdate () {\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.getMatchingChildren = function getMatchingChildren (children, url, invoke) {\n\t\treturn children\n\t\t\t.filter(prepareVNodeForRanking)\n\t\t\t.sort(pathRankSort)\n\t\t\t.map( function (vnode) {\n\t\t\t\tvar matches = exec(url, vnode.attributes.path, vnode.attributes);\n\t\t\t\tif (matches) {\n\t\t\t\t\tif (invoke !== false) {\n\t\t\t\t\t\tvar newProps = { url: url, matches: matches };\n\t\t\t\t\t\tassign(newProps, matches);\n\t\t\t\t\t\tdelete newProps.ref;\n\t\t\t\t\t\tdelete newProps.key;\n\t\t\t\t\t\treturn cloneElement(vnode, newProps);\n\t\t\t\t\t}\n\t\t\t\t\treturn vnode;\n\t\t\t\t}\n\t\t\t}).filter(Boolean);\n\t};\n\n\tRouter.prototype.render = function render (ref, ref$1) {\n\t\tvar children = ref.children;\n\t\tvar onChange = ref.onChange;\n\t\tvar url = ref$1.url;\n\n\t\tvar active = this.getMatchingChildren(children, url, true);\n\n\t\tvar current = active[0] || null;\n\t\tthis._didRoute = !!current;\n\n\t\tvar previous = this.previousUrl;\n\t\tif (url!==previous) {\n\t\t\tthis.previousUrl = url;\n\t\t\tif (typeof onChange==='function') {\n\t\t\t\tonChange({\n\t\t\t\t\trouter: this,\n\t\t\t\t\turl: url,\n\t\t\t\t\tprevious: previous,\n\t\t\t\t\tactive: active,\n\t\t\t\t\tcurrent: current\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\treturn Router;\n}(Component));\n\nvar Link = function (props) { return (\n\th('a', assign({ onClick: handleLinkClick }, props))\n); };\n\nvar Route = function (props) { return h(props.component, props); };\n\nRouter.subscribers = subscribers;\nRouter.getCurrentUrl = getCurrentUrl;\nRouter.route = route;\nRouter.Router = Router;\nRouter.Route = Route;\nRouter.Link = Link;\n\nexport { subscribers, getCurrentUrl, route, Router, Route, Link };export default Router;\n//# sourceMappingURL=preact-router.es.js.map\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\n/* These three skills dont follow a linear patch for some increases. Data came from official builder.\nhttps://borderlands.com/en-US/characters/fl4k/#-\nMight be different in game but I haven't played FL4K yet!\nThere are probably diminishing return algorithms for these but this was quicker than figuring that out. */\n\n// Hunter's Eye Damage Resistance\nfunction getHuntersEyeDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 5.3;\n case 2:\n return 10.1;\n case 3:\n return 14.4;\n case 4:\n return 18.3;\n case 5:\n return 21.9;\n default:\n return 0;\n }\n}\n\n// Ambush Predator Handling\nfunction getAmbushPredatorHandling(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n case 4:\n return 44;\n case 5:\n return 50;\n default:\n return 0;\n }\n}\n\n// The Most Dangerous Game Handling\nfunction getMostDangerousGameHandling(rank) {\n switch (rank) {\n case 1:\n return 14.3;\n case 2:\n return 25.0;\n case 3:\n return 33.3;\n default:\n return 0;\n }\n}\n\n// Furious Attack Handling\nfunction getFuriousAttackHandling(rank) {\n switch (rank) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 3:\n return 2.9;\n case 4:\n return 3.8;\n case 5:\n return 4.8;\n default:\n return 0;\n }\n}\n\n// Turn Tail And Run Damage Resistance\nfunction getTurnTailAndRunDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 6.5;\n case 2:\n return 12.3;\n case 3:\n return 17.4;\n default:\n return 0;\n }\n}\n\n// Interplanetary Stalker Beast Movement Speed\nfunction getInterplanetaryStalkerBeastMovementSpeed(rank) {\n switch (rank) {\n case 1:\n return 2;\n case 2:\n return 3;\n case 3:\n return 5;\n case 4:\n return 6;\n case 5:\n return 7;\n default:\n return 0;\n }\n}\n\n// Second Intention Critical Kill Reload Speed\nfunction getSecondIntentionCriticalKillReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 6;\n case 2:\n return 11;\n case 3:\n return 15;\n case 4:\n return 19;\n case 5:\n return 23;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Stalker\": {\n \"0\": {\n \"Jabber Sidekick\": {\n text: \"FL4K is joined by a loyal Jabber companion, armed with a Pistol. While accompanied by the Jabber, FL4K's Movement Speed is increased. Hold [Pet Skill key] to issue an Attack Command, which will cause the Jabber to throw a Radiation Barrel at enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%`,\n },\n \"Fade Away\": {\n text: \"FL4K cloaks, turning invisible. FL4K can fire 3 shots while cloaked, and each shot is automatically a Critical Hit. While cloaked, FL4K has increased Movement Speed and Health Regeneration.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Fade Away Bonus Damage: 200% of damage dealt\\nCloaked Movement Speed: +25%\\nHealth Regeneration: +3% of Max Health per second\\nDuration: 15 seconds\\nCooldown: 45 seconds`,\n },\n },\n \"1\": {\n \"Self-Repairing System\": {\n text: \"FL4K's Maximum Health is increased, and they constantly regenerate health.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Health: +${percent(rank, 6)}%\\nHealth Regeneration: +${percent(rank, 0.3)}% of Max Health/sec`,\n },\n \"Sic'Em\": {\n text: \"Attack Command has lowered Cooldown and increased Damage.\",\n ranks: 3,\n effect: (rank, level) => `Attack Command Damage: +${percent(rank, 10)}%\\nAttack Command Cooldown: -${percent(rank, 10)}%`,\n },\n \"Furious Attack\": {\n text: \"Hunter Skill. After shooting an enemy, FL4K gains a stack of Furious Attack. For each stack of Furious Attack, FL4K's Handling and Gun Damage are increased, and their pet gains increased Damage per stack. Stacks decay after a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 0.4)}% per stack\\nHandling: +${getFuriousAttackHandling(rank)}% per stack\\nPet Damage: +${percent(rank, 0.6)}% per stack\\nMaximum Stacks: 10\\nDuration: 4 seconds`,\n },\n },\n \"2\": {\n \"Guerrillas In The Mist\": {\n text: \"Fade Away no longer ends after FL4K attacks, at the cost of Critical Hit Damage and Fade Away duration being reduced.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Fade Away Bonus Damage: 25% of damage dealt\\nFade Away Duration: 5 seconds`,\n },\n \"Eager To Impress\": {\n text: \"Kill Skill. Whenever FL4K kills an enemy, Action Skill Cooldown Time is reduced. Whenever FL4K's pet kills an enemy, Action Skill Cooldown Time is reduced even more and Attack Command's duration is refreshed.\",\n ranks: 5,\n effect: (rank, level) => `FL4K Kill Action Skill Cooldown: -${percent(rank, 0.25)} seconds\\nPet Kill Action Skill Cooldown: -${percent(rank, 0.5)} seconds`,\n },\n \"All My BFF's\": {\n text: \"Allies share a portion of FL4K's total Health Regeneration. FL4K's pet shares twice the amount of Health Regeneration.\",\n ranks: 3,\n effect: (rank, level) => `Allies' Health Regen: +${Math.round(percent(rank, 16.666))}% of FL4K's Health Regen\\nPet Health Regen: +${Math.round(percent(rank, 33.333))}% of FL4K's Health Regen`,\n },\n \"Overclocked\": {\n text: \"FL4K gains increased Fire Rate. FL4K gains even more Fire Rate after reloading.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 2)}%\\nAdditional Fire Rate: +${percent(rank, 2)}%\\nDuration: 4 seconds`,\n },\n },\n \"3\": {\n \"Not My Circus\": {\n text: \"After Fade Away ends, FL4K's pet will Taunt, drawing the attention of all enemies in a huge radius. For a few seconds after Taunting, the pet gains powerful Damage Resistance.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Pet Taunt Duration: 6 seconds\\nPet Damage Resistance: +80%`,\n },\n \"Lick The Wounds\": {\n text: \"When FL4K is in Fight For Your Life, their pet will attempt to revive them. If it does, it gains increased Damage for a short time.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage: +30%\\nDuration: 60 seconds`,\n },\n \"Turn Tail And Run\": {\n text: \"While moving, FL4K constantly regenerates health and gains Damage Resistance.\\nWhile still, FL4K gains Gun Damage and Fire Rate.\",\n ranks: 3,\n effect: (rank, level) => `Damage Resistance: +${getTurnTailAndRunDamageResistance(rank)}% while moving\\nHealth Regen: +${percent(rank, 0.3)}% of Max Health/sec while moving\\nGun Damage: +${percent(rank, 8.333)}% while still\\nFire Rate: +${percent(rank, 4)}% while still`,\n },\n \"Beefcake Jabber\": {\n text: \"FL4K's Jabber evolves into a Beefcake, discarding its pistol and equipping a Shotgun. While accompanied by the Beefcake, FL4K gains increased Movement Speed and Maximum Health. When FL4K issues an Attack Command, the Beefcake will summon a melee weapon to deliver a powerful attack that knocks enemies back.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%\\nMaximum Health: +10%`,\n },\n },\n \"4\": {\n \"Until You Are Dead\": {\n text: \"The Health Regeneration and Movement Speed of Fade Away persists for a short time after the skill has ended.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Duration: 10 seconds after Fade Away ends`,\n },\n \"The Fast And The Furryous\": {\n text: \"While above half health, FL4K's Gun Damage and Movement Speed are increased, and their pet gains increased Damage.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${Math.round(percent(rank, 8.333))}%\\nMovement Speed: +${percent(rank, 3.333)}%\\nPet Damage: +${percent(rank, 10)}%`,\n },\n \"Hidden Machine\": {\n text: \"When an enemy has no target or is attacking a different target, FL4K deals increased damage against them.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 6)}%`,\n },\n \"Gunslinger Jabber\": {\n text: \"FL4K's Jabber upgrades his gear and equips an SMG. While accompanied by the Gunslinger, FL4K gains increased Movement Speed and Critical Hit Damage. When FL4K issues an Attack Command, the Gunslinger equips a Rocket Launcher to attack the target.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%\\nCritical Hit Damage: +5%`,\n },\n },\n \"5\": {\n \"Unblinking Eye\": {\n text: \"During Fade Away, successive hits on the same target increase FL4K's Critical Damage per hit. Unblinking Eye resets every 3 hits.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Additional Fade Away Bonus Damage: +75% of damage dealt per hit`,\n },\n \"Rage And Recover\": {\n text: \"Kill Skill. After killing an enemy, FL4K and FL4K's pet regenerate health for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: +${percent(rank, 1.6)}% of Missing Health/sec\\nPet Health Regen: +${percent(rank, 1.6)}% of Missing Health/sec\\nDuration: 3 seconds`,\n },\n },\n \"6\": {\n \"The Power Inside\": {\n text: \"FL4K and FL4K's pet gain increased Damage when FL4K activates an Action Skill. If FL4K is at full health, the increased Damage is doubled.\",\n ranks: 1,\n effect: (rank, level) => `Damage: +25%\\nPet Damage: +25%\\nDuration: 15 seconds`,\n },\n },\n },\n \"Master\": {\n \"0\": {\n \"Guard Skag\": {\n text: \"FL4K is joined by a loyal Skag companion, which will increase FL4K's Damage. Hold [Pet Skill key] to issue an Attack Command, which will cause the Skag to vomit acid onto enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%`,\n },\n \"Gamma Burst\": {\n text: \"FL4K creates a Rift at a target location, teleporting their pet through the Rift and dealing Radiation Damage to nearby enemies. Additionally, FL4K's pet becomes irradiated, growing in size and dealing bonus Radiation Damage when it attacks. Using Gamma Burst while FL4K's pet is downed or dead will revive the pet at the targeted location with 30% of its health, but will double Action Skill Cooldown Time.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage 56: (increases with character level)\\nDuration: 20 seconds\\nCooldown: 30 seconds`,\n },\n },\n \"1\": {\n \"Ferocity\": {\n text: \"FL4K's Pet deals increased damage.\",\n ranks: 5,\n effect: (rank, level) => `Pet Damage: +${percent(rank, 10)}%`,\n },\n \"Persistence Hunter\": {\n text: \"Increases FL4K's Gun Damage and Action Skill Duration.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}%\\nAction Skill Duration: +${percent(rank, 15)}%`,\n },\n \"Go For The Eyes!\": {\n text: \"When FL4K's pet attacks an enemy, the first melee attack is an automatic Critical Hit that deals increased damage.\",\n ranks: 5,\n effect: (rank, level) => `Pet Critical Hit Damage: ${percent(rank, 15)}%`,\n },\n },\n \"2\": {\n \"Atomic Aroma\": {\n text: \"While Gamma Burst is active, FL4K's pet is surrounded by a Radiation Aura, constantly damaging all nearby enemies.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Radiation Damage: 4 per second (increases with character level)`,\n },\n \"Who Rescued Who?\": {\n text: \"Whenever FL4K's Pet deals damage, FL4K regenerates health for a few seconds. Whenever FL4K deals damage to an enemy, their Pet's health is restored for a portion of the damage dealt.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: +${percent(rank, 0.4)}% of Max Health/sec\\nPet Health Restored: +${percent(rank, 1)}% of damage dealt`,\n },\n \"He Bites!\": {\n text: \"When FL4K's pet takes damage, the pet returns some of that damage to the attacker.\",\n ranks: 3,\n effect: (rank, level) => `Damage Returned: ${percent(rank, 5)}% of damage received`,\n },\n \"Frenzy\": {\n text: \"Hunter Skill. When FL4K's pet deals damage, FL4K and their pet gain a stack of Frenzy. Each stack of Frenzy increases Damage. The stacks decay after a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 0.8)}% per stack\\nPet Damage: +${percent(rank, 0.8)}% per stack\\nMaximum Stacks: 10`,\n },\n },\n \"3\": {\n \"Empathic Rage\": {\n text: \"For the duration of Gamma Burst, Damage dealt by FL4K is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Damage: +20%`,\n },\n \"Psycho Head On A Stick\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, their pet gains increased Movement Speed and Damage for a few seconds.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage: +20%\\nPet Movement Speed: +12%\\nDuration: 8 seconds`,\n },\n \"Hive Mind\": {\n text: \"When FL4K takes damage, a portion of all damage they take is inflicted on their pet instead.\",\n ranks: 3,\n effect: (rank, level) => `Damage Shared: ${percent(rank, 5)}%`,\n },\n \"Great Horned Skag\": {\n text: \"FL4K's Skag evolves into a larger Great Horned Skag, which will increase FL4K's Damage and Gun Damage. When FL4K issues an Attack Command, the Great Horned Skag will charge at enemies and knock them into the air.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%\\nGun Damage: +10%`,\n },\n },\n \"4\": {\n \"Endurance\": {\n text: \"When FL4K or FL4K's pet kills an enemy while Gamma Burst is active, the duration of Gamma Burst is extended and pet damage is increased. These effects can stack up to 5 times.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Gamma Burst Duration: +3 seconds per kill\\nPet Damage: +10% per kill\\nMaximum Stacks: 5`,\n },\n \"Barbaric Yawp\": {\n text: \"Increases the power of Pet Bonuses granted to FL4K.\",\n ranks: 5,\n effect: (rank, level) => `Pet Bonuses: +${percent(rank, 40)}%`,\n },\n \"Mutated Defenses\": {\n text: \"When FL4K's pet is at low health, it gains Damage Resistance and regenerates health. This skill has a long cooldown.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage Resistance: +30%\\nPet Health Regen: +6.667% of Max Health/sec\\n Duration: 6 seconds\\nCooldown: 15 seconds`,\n },\n \"Eridian Skag\": {\n text: \"FL4K's Skag evolves into an Eridian Skag, which will increase FL4K's Damage and Fire Rate. When FL4K issues an Attack Command, their Eridian Skag pulls nearby enemies in by generating a Singularity.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%\\nFire Rate: +5%`,\n },\n },\n \"5\": {\n \"Burst Aid\": {\n text: \"After using Gamma Burst, the Rift remains for the duration of the skill. While standing near the Rift, FL4K and their allies rapidly Regenerate Health.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Team Health Regeneration: +20% of Max Health/sec`,\n },\n \"Pack Tactics\": {\n text: \"All damage dealt by FL4K and their pet is increased. Additionally, the Maximum Health of both FL4K and their pet is increased.\",\n ranks: 3,\n effect: (rank, level) => `Damage: +${percent(rank, 7)}%\\nMaximum Health: +${percent(rank, 5)}%\\nPet Damage: +${percent(rank, 7)}%\\nPet Maximum Health: +${percent(rank, 5)}%`,\n },\n \"Shared Spirit\": {\n text: \"While FL4K is at low health, a portion of all damage they take is inflicted on their pet instead.\",\n ranks: 1,\n effect: (rank, level) => `Damage Shared: 50%`,\n },\n },\n \"6\": {\n \"Dominance\": {\n text: \"Melee Override Skill. FL4K establishes dominance over an enemy, turning it into an ally for a short time. If the enemy is a Beast, the duration is doubled. While under the effects of Domiance, the enemy constantly loses health until it dies or the effect ends. Only one enemy can be dominated at a time. An enemy can only be dominated once.\",\n ranks: 1,\n effect: (rank, level) => `Duration: 12 seconds\\nTarget Loses 2% of Maximum Health per second`,\n },\n },\n },\n \"Hunter\": {\n \"0\": {\n \"Spiderant Centurion\": {\n text: \"FL4K is joined by a loyal Spiderant companion, which will cause FL4K to constant regenerate health. Hold [Pet Skill key] to issue an Attack Command, which will cause the Spiderant to charge into enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: 1% of Max Health per second`,\n },\n \"Rakk Attack!\": {\n text: \"FL4K sends forward 2 Rakk to dive-bomb enemies. This skill has multiple charges. Element: Incendiary.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage: 35 (increases with character level)\\nElement Status Effect Chance: 100%\\nCooldown: 18 seconds`,\n },\n },\n \"1\": {\n \"Interplanetary Stalker\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, they gain a stack of Interplanetary Stalker. For each stack of Interplanetary Stalker, they and their pet gain a bonus to all damage dealt. Additionally, they gain a unique stacking bonus depending on the type of enemy killed. Each unique bonus can stack up to 3 times. Each stack decays after a short time.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 2)}% per stack\\nPet Damage: +${percent(rank, 1)}% per stack\\nHuman Bonus: +${percent(rank, 3)}% Action Skill Damage per stack\\nRobot Bonus: +${percent(rank, 1.5)}% Corrosive Damage per stack\\nBeast Bonus: +${getInterplanetaryStalkerBeastMovementSpeed(rank)}% Movement Speed per stack\\nMaximum Stacks: 3`,\n },\n \"Leave No Trace\": {\n text: \"When FL4K scores a Critical Hit, there is a chance for 1 ammo to be added to their magazine.\",\n ranks: 3,\n effect: (rank, level) => `Ammo Chance: +${percent(rank, 12)}%\\nCooldown: 0.3 seconds`,\n },\n \"Second Intention\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, they gain increased Reload Speed. This bonus is increased if FL4K scores a Critical Kill.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed: +${Math.ceil(percent(rank, 2.6))}%\\nCritical Kill Reload Speed: +${getSecondIntentionCriticalKillReloadSpeed(rank)}%\\nDuration: 5 seconds`,\n },\n },\n \"2\": {\n \"Rakk Open A Cold One\": {\n text: \"Converts FL4K's Rakk to Cryo Damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Rakk Attack! Element: Cryo`,\n },\n \"Hunter's Eye\": {\n text: \"FL4K gains bonuses when fighting different types of enemies.\",\n ranks: 5,\n effect: (rank, level) => `Human Bonus: +${percent(rank, 2.48)}% Critical Hit Damage\\nRobot Bonus: +${percent(rank, 6)}% Armor Damage\\nBeast Bonus: +${getHuntersEyeDamageResistance(rank)}% Damage Resistance`,\n },\n \"Head Count\": {\n text: \"Whenever FL4K scores a Critical Hit, there is a chance their Action Skill Cooldown is reduced.\",\n ranks: 3,\n effect: (rank, level) => `Cooldown Reduction Chance: +${percent(rank, 10)}%\\nAction Skill Cooldown: -2 seconds`,\n },\n \"Ambush Predator\": {\n text: \"While there are no enemies nearby, FL4K's Weapon Handling and Critical Hit Damage are increased.\",\n ranks: 5,\n effect: (rank, level) => `Critical Hit Damage: +${percent(rank, 4)}%\\nHandling: +${getAmbushPredatorHandling(rank)}%`,\n },\n },\n \"3\": {\n \"Falconer's Feast\": {\n text: \"When FL4K's Rakk damage an enemy, a portion of FL4K's health is restored.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Health Restored: 7% of Maximum Health`,\n },\n \"Two F4ng\": {\n text: \"FL4K has a chance to fire an extra projectile per shot.\",\n ranks: 5,\n effect: (rank, level) => `Extra Projectile Chance: +${percent(rank, 5)}%`,\n },\n \"Spiderant Scorcher\": {\n text: \"FL4K's Spiderant evolves into a Scorcher, occasionally dealing Incendiary Damage to all enemies nearby. While accompanied by the Scorcher, FL4K constantly regenerates health and deals increased Elemental Damage. When FL4K issues an Attack Command, the Scorcher will charge enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: +1% of Max Health per second\\nElemental Damage: +10%`,\n },\n },\n \"4\": {\n \"Flock'N'Load\": {\n text: \"FL4K sends forward additional Rakk.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Additional Rakk: +2`,\n },\n \"Big Game\": {\n text: \"FL4K's Hunter Skills become much more effective and have a longer duration.\",\n ranks: 3,\n effect: (rank, level) => `Hunter Skill Effects: +${percent(rank, 10)}%\\nHunter Skill Duration: +${Math.round(percent(rank, 33.333))}%`,\n },\n \"The Most Dangerous Game\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills a Badass or stronger enemy, they gain increased Critical Hit Damage, Gun Damage, and Handling for a long time and their pet receives increased Damage for a long time. Additionally, they receive a cash reward from the Intergalactic Bureau of Bounty Hunting.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3.333)}%\\nCritical Hit Damage: +${Math.round(percent(rank, 8.333))}%\\nHandling: +${getMostDangerousGameHandling(rank)}%\\nPet Damage: +${percent(rank, 9)}%\\nDuration: 120 seconds`,\n },\n \"Spiderant Countess\": {\n text: \"FL4K's Spiderant evolves into a Countess, which will cause FL4K to constantly regenerate health and gain Damage Resistance. When FL4K issues an Attack Command, the Countess will burrow underground and then emerge dealing Corrosive Damage in an area.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: +1% of Max Health per second\\nDamage Resistance: +5%`,\n },\n },\n \"5\": {\n \"Rakkcelerate\": {\n text: \"FL4K's Rakk have increased Cooldown Rate and gain an Additional Charge.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Rakk Attack! Cooldown Rate: +20%\\nMaximum Rakk Attack! Charges: +1`,\n },\n \"Galactic Shadow\": {\n text: \"FL4K deals increased Critical Hit Damage, and enemies are less likely to attack them.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Damage: +15%`,\n },\n \"Grim Harvest\": {\n text: \"FL4K gains increased Gun Damage and Action Skill Damage. FL4K's pet gains increased Damage.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%\\nAction Skill Damage: +${percent(rank, 5)}%\\nPet Damage: +${percent(rank, 7)}%`,\n },\n },\n \"6\": {\n \"Megavore\": {\n text: \"FL4K gains a chance to score a Critical Hit with weapons against any part of enemies.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Chance: +20%`,\n },\n },\n },\n};\n\nexport default skills;\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Gunner ({ path }) {\n return (\n \n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Operative ({ path }) {\n return (\n \n );\n}\n","export function getLevel (state) {\n return state.invested.reduce((total, current) => total + current, 2);\n};\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\nfunction percentTwoDecimals (rank, unit) {\n return Math.round(rank * unit * 100) / 100;\n}\n\n// Matched Set Heat Per Shot\nfunction getMatchedSetHeatPerShot(rank) {\n switch (rank) {\n case 1:\n return 2;\n case 2:\n return 4;\n case 3:\n return 6;\n case 4:\n return 9;\n case 5:\n return 11;\n default:\n return 0;\n }\n}\n\n// Scrappy Handling\nfunction getScrappyHandling(rank) {\n switch (rank) {\n case 1:\n return 10.7;\n case 2:\n return 19.4;\n case 3:\n return 26.5;\n case 4:\n return 32.4;\n case 5:\n return 37.5;\n default:\n return 0;\n }\n}\n\n// Scrappy Weapon Swap Speed\nfunction getScrappyWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 27.5;\n case 3:\n return 36.3;\n case 4:\n return 43.2;\n case 5:\n return 48.7;\n default:\n return 0;\n }\n}\n\n// Scrappy Mode Switch Speed\nfunction getScrappyModeSwitchSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 27.5;\n case 3:\n return 36.3;\n case 4:\n return 43.2;\n case 5:\n return 48.7;\n default:\n return 0;\n }\n}\n\n// Armored Infantry Damage Resistance\nfunction getArmoredInfantryDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 3;\n case 2:\n return 6;\n case 3:\n return 8;\n case 4:\n return 11;\n case 5:\n return 13;\n default:\n return 0;\n }\n}\n\n// Vladof Ingenuity Shock Damage Resistance\nfunction getVladofIngenuityShockDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 15;\n case 2:\n return 26;\n case 3:\n return 35;\n case 4:\n return 42;\n case 5:\n return 47;\n default:\n return 0;\n }\n}\n\n// Behind the Iron Curtain Shield Recharge Delay\nfunction getBehindTheIronCurtainShieldRechargeDelay(rank) {\n switch (rank) {\n case 1:\n return 7;\n case 2:\n return 14;\n case 3:\n return 19;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Bottomless Mags\": {\n \"0\": {\n \"Minigun\": {\n text: \"The Minigun is capable of sustained rapid fire. Firing for long periods causes the Minigun to overheat, rendering it inoperable for a few seconds. Element: Non-Elemental.\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `Put a little lead in the air and see what falls over.`,\n },\n },\n \"1\": {\n \"Cloud of Lead\": {\n text: \"Occasionally, Moze's and Iron Bear's shots will deal additional Incendiary Damage and won't consume ammo.\",\n ranks: 5,\n effect: (rank, level) => `Effects are triggered every ${9 - rank} shots\\nBonus Incendiary Damage: +${percentTwoDecimals(rank, 2.25)}%`,\n },\n \"Dakka Bear\": {\n text: \"Adds a manned turret to the back of Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Fasten your seatbelt, it's going to be a bumpy ride.`,\n },\n \"Matched Set\": {\n text: \"Moze's currently equipped weapon gains a stacking bonus to Magazine Size and Decreased Heat Per Shot for every piece of equipped gear that has a matching manufacturer.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 2)}% per matched gear\\nHeat Per Shot: -${getMatchedSetHeatPerShot(rank)}% per matched gear`,\n },\n },\n \"2\": {\n \"Let Off Some Steam\": {\n text: \"Minigun deals more damage as heat increases, and can be fired for longer before overheating.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Damage: Up to +80%\\nMinigun Heat Capacity: +35%`,\n },\n \"Stoke the Embers\": {\n text: \"Increases Moze and Iron Bear's Incendiary Damage.\",\n ranks: 3,\n effect: (rank, level) => `Incendiary Damage: +${percent(rank, 10)}%`,\n },\n \"Redistribution\": {\n text: \"After Moze scores a Critical Hit, she regenerates ammo for a few seconds.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +5% of Magazine Size/sec\\nDuration: 3 seconds`,\n },\n \"Scrappy\": {\n text: \"While moving, Moze's Handling, Weapon Swap and Mode Switch Speed are increased.\",\n ranks: 5,\n effect: (rank, level) => `Handling: +${getScrappyHandling(rank)}%\\nWeapon Swap Speed: +${getScrappyWeaponSwapSpeed(rank)}%\\nMode Switch Speed: +${getScrappyModeSwitchSpeed(rank)}%`,\n },\n \"Salamander\": {\n text: \"The Salamander is a flamethrower that deals Incendiary Damage to enemies at close range. Though the Salamander has infinite ammo, it drains Fuel with use.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Fire... for effect.`,\n },\n },\n \"3\": {\n \"General Winter\": {\n text: \"Minigun fires Cryo rounds which reduce Heat Gain and Fuel Drain, but deal reduced damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Element: Cryo\\nMinigun Fuel Drain: -40%\\nMinigun Damage: -30%\\nMinigun Cryo Efficiency: +20%`,\n },\n \"Rushin' Offensive\": {\n text: \"Moze can sprint and shoot at the same time.\",\n ranks: 1,\n effect: (rank, level) => `I don't want any messages saying \"I'm holding my position.\"`,\n },\n \"Scorching RPM's\": {\n text: \"Moze gains increased Fire Rate and Critical Hit Damage. Iron Bear gains increased Hard Point damage.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 3)}%\\nCritical Hit Damage: +${percent(rank, 4)}%\\nIron Bear Damage: +${percent(rank, 5)}%`,\n },\n \"Fuel Economy\": {\n text: \"Reduces Salamander's Fuel Drain. Additionally, Iron Bear's Movement Speed is increased after damaging an enemy with Salamander.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Salamander Fuel Drain: -25%\\nIron Bear Movement Speed: +25%\\nMovement Speed Duration: 3 seconds`,\n },\n },\n \"4\": {\n \"Exploding. Bullets.\": {\n text: \"Minigun fires Explosive Rounds that deal increased Splash Damage, but its Fire Rate is decreased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Damage: +126%\\nMinigun Fire Rate: -75%`,\n },\n \"The Iron Bank\": {\n text: \"Increases Moze's Magazine Size.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 7)}%`,\n },\n \"Specialist Bear\": {\n text: \"Equipping two of the same Weapons on Iron Bear increases the damage they deal.\",\n ranks: 1,\n effect: (rank, level) => `Iron Bear Damage: +${percent(rank, 25)}%`,\n },\n \"Chemical Warfare\": {\n text: \"Salamander now deals Corrosive Damage. Additionally, Salamander's Melt Damage is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Salamander Element: Corrosive\\nSalamander Melt Damage: +50%`,\n },\n },\n \"5\": {\n \"Some for the Road\": {\n text: \"Moze gains infinite ammo for a few seconds after exiting Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Duration: 5 seconds`,\n },\n \"Click, Click...\": {\n text: \"Moze gains increased Gun Damage as her magazine empties. The less ammo there is remaining, the greater the increase. If Moze has a COV gun equipped, she gains Gun Damage as her gun's heat increases.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: Up to +${percent(rank, 12)}%`,\n },\n \"Molten Roar\": {\n text: \"The Salamander burst-fires 3 projectiles with increased Fuel Drain, the first of which leaves a large Incendiary area.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: +25%`,\n },\n },\n \"6\": {\n \"Forge\": {\n text: \"Moze constantly regenerates ammo for her currently equipped weapon.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +5% of Magazine Size/sec`,\n },\n },\n },\n \"Demolition Woman\": {\n \"0\": {\n \"V-35 Grenade Launcher\": {\n text: \"The V-35 is a semi-automatic grenade launcher. Its grenades are not affected by Moze's equipped grenade mod. Element: Non-Elemental.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `For when the V-34 just isn't enough`,\n },\n },\n \"1\": {\n \"Fire in the Skag Den\": {\n text: \"Whenever Moze deals Splash Damage, she deals bonus Incendiary Damage.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Incendiary Damage: +${percent(rank, 3)}% of damage dealt`,\n },\n \"Deadlines\": {\n text: \"Firing Iron Bear Weapons drains less Fuel. Killing an enemy while Iron Bear is active increases Fuel. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Fuel Drain: -${percent(rank, 10)}%\\nFuel Returned: ${percent(rank, 2)}% of Maximum Fuel`,\n },\n \"Grizzled\": {\n text: \"Kill Skill. Killing an enemy reduces Moze's remaining Action Skill Cooldown Time. This skill has diminishing returns.\",\n ranks: 5,\n effect: (rank, level) => `Iron Bear Cooldown: -${rank * 1} seconds`,\n },\n },\n \"2\": {\n \"Shaped Charge\": {\n text: \"Direct hits with the V-35 deal increased damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `V-35 Direct Hit Damage: +35%`,\n },\n \"Means of Destruction\": {\n text: \"Whenever Moze deals Splash Damage, there is a chance to add ammo to her currently equipped weapon's magazine, with a smaller chance to return a grenade.\",\n ranks: 3,\n effect: (rank, level) => `Ammo Chance: +${percent(rank, 3.333)}%\\nGrenade Chance: +${percent(rank, 2)}%\\nCooldown: 0.3 seconds`,\n },\n \"Torgue Cross-Promotion\": {\n text: \"All Splash Damage dealt by Moze has a chance to double in size.\",\n ranks: 5,\n effect: (rank, level) => `Chance to Double Splash Radius: +${percent(rank, 3)}%`,\n },\n \"Stainless Steel Bear\": {\n text: \"Iron Bear gains additional armor and increased Maximum Fuel.\",\n ranks: 5,\n effect: (rank, level) => `Iron Bear Maximum Health: +${percent(rank, 6)}%\\nMaximum Fuel: +${percent(rank, 4)}%`,\n },\n \"Vanquisher Rocket Pod\": {\n text: \"The Vanquisher Rocket Pod is a rocket launcher capable of rapid-firing volleys of unguided explosive rockets. Element: Non-Elemental.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `If you want guidance, get a sherpa. If you want explosions, get a Vladof.`,\n },\n },\n \"3\": {\n \"Musical Chairs\": {\n text: \"Occasionally, the V-35 fires a Singularity Grenade that pulls in nearby enemies before exploding.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `V-35 Singularity: Every 7th grenade`,\n },\n \"Pull the Holy Pin\": {\n text: \"Moze's grenades have a chance to score a Critical Hit, dealing greatly increased damage. Sources of Critical Hit Damage do not affect grenade Critical Hits.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Critical Hit Chance: +${percent(rank, 10)}%`,\n },\n \"Auto Bear\": {\n text: \"After Moze exits Iron Bear, it will remain deployed in place for a short time. While Auto Bear remains active, it will target and attack nearby enemies until its duration ends, then it will charge at an enemy and self-destruct.\",\n ranks: 1,\n effect: (rank, level) => `Auto Bear Duration: 15 seconds`,\n },\n \"Active Tracking\": {\n text: \"The Vanquisher Rocket Pod now fires homing rockets and has increased Reload Speed. Hold down [Action Skill key] and aim at enemies to designate up to 6 targets. Releasing Fire Button launches a volley of homing rockets at the designated targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Vanquisher Reload Speed: +25%`,\n },\n },\n \"4\": {\n \"Lock and Speedload\": {\n text: \"The V-35's Reload Speed is greatly increased and it now fires a 5-round burst.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `V-35 Reload Speed: +25%`,\n },\n \"Vampyr\": {\n text: \"Whenever Moze damages an enemy with a thrown grenade, for every enemy hit, she restores a portion of her missing health. Iron Bear restores health for every enemy it deals Splash Damage to.\",\n ranks: 5,\n effect: (rank, level) => `Moze Health Restored: ${percent(rank, 4)}% of Missing Health per enemy hit\\nIron Bear Health Restored: ${percent(rank, 2)}% of Missing Health per enemy hit`,\n },\n \"Why Can't I Carry All These Grenades\": {\n text: \"Increases Moze's grenade carrying capacity.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Capacity: +${rank}`,\n },\n \"Target Softening\": {\n text: \"The Vanquisher Rocket Pod deals greatly reduced damage per rocket, but fires in a 6-rocket spread. Additionally, enemies hit by Vanquisher Rocket Pod rockets take increased damage from all sources.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Vanquisher Damage: -74%\\nEnemy Damage Taken: +15%`,\n },\n },\n \"5\": {\n \"To the Last\": {\n text: \"Moze gains the ability to throw grenades while in Fight For Your Life. If she threw a grenade before gaining a Second Wind, a grenade is refunded.\",\n ranks: 1,\n effect: (rank, level) => `The greatest enemy is one with nothing to lose... and a grenade.`,\n },\n \"Explosive Punctuation\": {\n text: \"When Moze deals Splash Damage, her Action Skill Cooldown Rate is briefly increased.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Hammerdown Protocol\": {\n text: \"Instead of a volley of conventional rockets, the Vanquisher Rocket Pod launches a single rocket with a nuclear warhead, dealing massive Radiation Damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Vanquisher Element: Raditation\\nVanquisher Damage: +380%\\nVanquisher Magazine Size: 1`,\n },\n },\n \"6\": {\n \"Short Fuse\": {\n text: \"Whenever Moze deals Gun Damage, there is a chance of a secondary explosion centered on the target.\",\n ranks: 1,\n effect: (rank, level) => `Secondary Explosion Chance: 20%\\nSecondary Explosion Damage: 75% of Gun Damage`,\n },\n },\n },\n \"Shield of Retribution\": {\n \"0\": {\n \"Railgun\": {\n text: \"The Railgun fires electrified high-velocity projectiles that deal Shock Damage.\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `It's like a bullet, only bigger. And faster. And wrapped in lightning.`,\n },\n },\n \"1\": {\n \"Selfless Vengeance\": {\n text: \"Whenever Moze reloads, she loses a small portion of her health and grants additional Incendiary Damage to her and her allies' rounds for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Health Removed: ${percent(rank, 1)}% of Current Health\\nTeam Bonus Incendiary Damage: +${percent(rank, 3)}% of dmg dealt\\nDuration: 5 seconds`,\n },\n \"Security Bear\": {\n text: \"Iron Bear gains a bubble shield that reduces damage taken. The shield deactivates if it sustains too much damage, reactivating after a short cooldown.\",\n ranks: 1,\n effect: (rank, level) => `50% of Iron Bear Maximum Health added as Shields\\nBubble Recharge Delay: 5 seconds`,\n },\n \"Armored Infantry\": {\n text: \"While Moze's shields are active, she gains Damage Resistance and increased Gun Damage.\",\n ranks: 5,\n effect: (rank, level) => `Damage Resistance: +${getArmoredInfantryDamageResistance(rank)}%\\nGun Damage: +${percent(rank, 3)}%`,\n },\n },\n \"2\": {\n \"Hell on Rails\": {\n text: \"Railgun now fires superheated rounds that deal Incendiary Damge, but have increased Fuel Drain per shot.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Railgun Element: Incendiary\\nRailgun Fuel Drain: +30%`,\n },\n \"Drowning in Brass\": {\n text: \"Kill Skill. Killing an enemy grants Moze a stack of Drowning in Brass. For each stack of Drowning in Brass, Moze's Fire Rate is reduced, but Gun Damage is increased for both her and her allies.\",\n ranks: 5,\n effect: (rank, level) => `Moze Fire Rate: -${percent(rank, 0.5)}% per stack\\nTeam Gun Damage: +${percent(rank, 4)}% per stack\\nMaximum Stacks: 3\\nDuration: 15 seconds`,\n },\n \"Thin Red Line\": {\n text: \"A portion of Moze's health is Reserved and cannot be restored, but her Maximum Shield is increased by the same amount.\",\n ranks: 3,\n effect: (rank, level) => `${percent(rank, 20)}% Max Health Reserved and Added to Max Shield`,\n },\n \"Vladof Ingenuity\": {\n text: \"Moze's Maximum Shield is increased, and she gains resistance to Shock Damage.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Shield: +${percent(rank, 6)}%\\nShock Damage Resistance: +${getVladofIngenuityShockDamageResistance(rank)}%`,\n },\n \"Bear Fist\": {\n text: \"The Bear Fist is a pneumatic-driven fist that deals massive damage to a single target at close range. Element: Non-Elemental.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Vladof supports the right to bear armored bear arms.`,\n },\n },\n \"3\": {\n \"Capacitive Armature\": {\n text: \"When Railgun hits an enemy, it chains to nearby enemies, dealing reduced Shock Damage to more targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Splinter Damage: 25% of damage dealt`,\n },\n \"Full Can of Whoop-Ass\": {\n text: \"Entering Iron Bear causes Moze's and her allies' shields to immediately begin recharging at an increased Shield Recharge Rate.\",\n ranks: 1,\n effect: (rank, level) => `Team Shield Recharge Rate: +25%`,\n },\n \"Experimental Munitions\": {\n text: \"Whenever Moze and Iron Bear score a Critical Hit, they deal bonus Incendiary Damage.\",\n ranks: 1,\n effect: (rank, level) => `Bonus Incendiary Damage: +${percent(rank, 10)}% of damage dealt`,\n },\n \"Wild Swing\": {\n text: \"Whenever Bear Fist hits an enemy, it deals random Bonus Elemental Damage to that enemy and all enemies nearby.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Bear Fist Bonus Elemental Damage: +35% of damage dealt`,\n },\n },\n \"4\": {\n \"Corrosive Sabot Round\": {\n text: \"Railgun now fires a specialty round that deals reduced damage and explodes after a short delay. Railgun shots have reduced Fuel Drain and the Magazine Size is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Railgun Element:Corrosive\\nRailgun Damage: -50%\\nRailgun Fuel Drain: -50%\\nRailgun Magazine Size: +2`,\n },\n \"Behind the Iron Curtain\": {\n text: \"Moze's Shield Recharge Delay is reduced, and her Shield Recharge Rate is increased.\",\n ranks: 3,\n effect: (rank, level) => `Shield Recharge Delay: -${getBehindTheIronCurtainShieldRechargeDelay(rank)}%\\nShield Recharge Rate: +${percent(rank, 7)}%`,\n },\n \"Desperate Measures\": {\n text: \"Moze's Gun Damage and Iron Bear's Damage is increased depending on how low their health is. The lower their health, the greater the increase.\",\n ranks: 3,\n effect: (rank, level) => `Damage: Up to +${Math.round(percent(rank, 16.5))}%`,\n },\n \"Close the Distance\": {\n text: \"Instead of punching, Iron Bear now launches its Bear Fist forward and grabs enemies at greatly increased range, dealing Shock Damage and pulling them back to Iron Bear.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Step into my office.`,\n },\n },\n \"5\": {\n \"Phalanx Doctrine\": {\n text: \"Kill Skill. After killing an enemy, Moze gains a stack of Phalanx Doctrine. For every stack of Phalanx Doctrine, Moze's Maximum Shield and Gun Damage are increased. Each stack lasts 30 seconds. There is no stack limit.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Shield: +${percent(rank, 3)}% per stack\\nGun Damage: +${percent(rank, 2)}% per stack\\nDuration: 30 seconds`,\n },\n \"Force Feedback\": {\n text: \"Whenever Moze scores a Critical Kill, her shields immediately begin recharging.\",\n ranks: 1,\n effect: (rank, level) => `Just click on their heads.`,\n },\n \"Shockhammer\": {\n text: \"Bear Fist is now capable of sustained rapid fire punching. Additionally, Bear Fist has reduced Fuel Drain and deals Bonus Shock Damage with each hit.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Bear Fist Bonus Shock Damage: +19% of damage dealt\\nBear Fist Fuel Drain: -40%`,\n },\n },\n \"6\": {\n \"Tenacious Defense\": {\n text: \"Whenever Moze's shield is fully depleted, she instantly restores a portion of her shield, and her Gun Damage is increased for a short time. This skill can only trigger after Moze's shields have fully recharged.\",\n ranks: 1,\n effect: (rank, level) => `Shields Restored: 40% of Maximum Shield\\nGun Damage: +30%\\nDuration: 30 seconds`,\n },\n },\n },\n};\n\nexport default skills;\n","!function(){\"use strict\";function e(e,t){var n,o,r,i,l=W;for(i=arguments.length;i-- >2;)P.push(arguments[i]);t&&null!=t.children&&(P.length||P.push(t.children),delete t.children);while(P.length)if((o=P.pop())&&void 0!==o.pop)for(i=o.length;i--;)P.push(o[i]);else\"boolean\"==typeof o&&(o=null),(r=\"function\"!=typeof e)&&(null==o?o=\"\":\"number\"==typeof o?o+=\"\":\"string\"!=typeof o&&(r=!1)),r&&n?l[l.length-1]+=o:l===W?l=[o]:l.push(o),n=r;var a=new T;return a.nodeName=e,a.children=l,a.attributes=null==t?void 0:t,a.key=null==t?void 0:t.key,void 0!==M.vnode&&M.vnode(a),a}function t(e,t){for(var n in t)e[n]=t[n];return e}function n(e,t){null!=e&&(\"function\"==typeof e?e(t):e.current=t)}function o(n,o){return e(n.nodeName,t(t({},n.attributes),o),arguments.length>2?[].slice.call(arguments,2):n.children)}function r(e){!e.__d&&(e.__d=!0)&&1==V.push(e)&&(M.debounceRendering||D)(i)}function i(){var e;while(e=V.pop())e.__d&&x(e)}function l(e,t,n){return\"string\"==typeof t||\"number\"==typeof t?void 0!==e.splitText:\"string\"==typeof t.nodeName?!e._componentConstructor&&a(e,t.nodeName):n||e._componentConstructor===t.nodeName}function a(e,t){return e.__n===t||e.nodeName.toLowerCase()===t.toLowerCase()}function u(e){var n=t({},e.attributes);n.children=e.children;var o=e.nodeName.defaultProps;if(void 0!==o)for(var r in o)void 0===n[r]&&(n[r]=o[r]);return n}function c(e,t){var n=t?document.createElementNS(\"http://www.w3.org/2000/svg\",e):document.createElement(e);return n.__n=e,n}function p(e){var t=e.parentNode;t&&t.removeChild(e)}function s(e,t,o,r,i){if(\"className\"===t&&(t=\"class\"),\"key\"===t);else if(\"ref\"===t)n(o,null),n(r,e);else if(\"class\"!==t||i)if(\"style\"===t){if(r&&\"string\"!=typeof r&&\"string\"!=typeof o||(e.style.cssText=r||\"\"),r&&\"object\"==typeof r){if(\"string\"!=typeof o)for(var l in o)l in r||(e.style[l]=\"\");for(var l in r)e.style[l]=\"number\"==typeof r[l]&&!1===E.test(l)?r[l]+\"px\":r[l]}}else if(\"dangerouslySetInnerHTML\"===t)r&&(e.innerHTML=r.__html||\"\");else if(\"o\"==t[0]&&\"n\"==t[1]){var a=t!==(t=t.replace(/Capture$/,\"\"));t=t.toLowerCase().substring(2),r?o||e.addEventListener(t,_,a):e.removeEventListener(t,_,a),(e.__l||(e.__l={}))[t]=r}else if(\"list\"!==t&&\"type\"!==t&&!i&&t in e){try{e[t]=null==r?\"\":r}catch(e){}null!=r&&!1!==r||\"spellcheck\"==t||e.removeAttribute(t)}else{var u=i&&t!==(t=t.replace(/^xlink:?/,\"\"));null==r||!1===r?u?e.removeAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase()):e.removeAttribute(t):\"function\"!=typeof r&&(u?e.setAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase(),r):e.setAttribute(t,r))}else e.className=r||\"\"}function _(e){return this.__l[e.type](M.event&&M.event(e)||e)}function f(){var e;while(e=A.shift())M.afterMount&&M.afterMount(e),e.componentDidMount&&e.componentDidMount()}function d(e,t,n,o,r,i){H++||(R=null!=r&&void 0!==r.ownerSVGElement,B=null!=e&&!(\"__preactattr_\"in e));var l=h(e,t,n,o,i);return r&&l.parentNode!==r&&r.appendChild(l),--H||(B=!1,i||f()),l}function h(e,t,n,o,r){var i=e,l=R;if(null!=t&&\"boolean\"!=typeof t||(t=\"\"),\"string\"==typeof t||\"number\"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0))),i.__preactattr_=!0,i;var u=t.nodeName;if(\"function\"==typeof u)return N(e,t,n,o);if(R=\"svg\"===u||\"foreignObject\"!==u&&R,u+=\"\",(!e||!a(e,u))&&(i=c(u,R),e)){while(e.firstChild)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0)}var p=i.firstChild,s=i.__preactattr_,_=t.children;if(null==s){s=i.__preactattr_={};for(var f=i.attributes,d=f.length;d--;)s[f[d].name]=f[d].value}return!B&&_&&1===_.length&&\"string\"==typeof _[0]&&null!=p&&void 0!==p.splitText&&null==p.nextSibling?p.nodeValue!=_[0]&&(p.nodeValue=_[0]):(_&&_.length||null!=p)&&m(i,_,n,o,B||null!=s.dangerouslySetInnerHTML),y(i,t.attributes,s),R=l,i}function m(e,t,n,o,r){var i,a,u,c,s,_=e.childNodes,f=[],d={},m=0,b=0,y=_.length,g=0,w=t?t.length:0;if(0!==y)for(var C=0;C skill.ranks) { return false; }\n tierTotal += skill.invested || 0;\n };\n if (tierTotal > 0 && treeTotal + 5 < tierIndex * 5) { return false; }\n treeTotal += tierTotal;\n tierIndex += 1;\n };\n treeTotals[treeIndex] = treeTotal;\n totalSpent += treeTotal;\n treeIndex += 1;\n };\n if (totalSpent > (50 - 3) + 11 + 11) { return false; }\n return treeTotals;\n}\n","import deepmerge from 'deepmerge';\nimport investmentValidator from './investmentValidator';\nimport { setHash } from './hashHandler';\n\nexport default function reducer (state, action) {\n switch (action.type) {\n case 'skillChange':\n var newSkills = deepmerge(state.skills, {\n [action.treeName]: {\n [action.tierIndex + '']: {\n [action.skillName]: {\n invested: action.newValue,\n }\n }\n }\n });\n const skillChangeTotals = investmentValidator(newSkills);\n if (skillChangeTotals) {\n setHash(newSkills);\n return {\n ...state,\n invested: skillChangeTotals,\n skills: newSkills,\n };\n } else {\n return state;\n }\n case 'loadSkills':\n const loadSkillsTotals = investmentValidator(action.skills);\n if (loadSkillsTotals) {\n return {\n ...state,\n invested: loadSkillsTotals,\n skills: deepmerge(state.skills, action.skills),\n };\n } else {\n return state;\n }\n }\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"footer\":\"Eq4mJ\",\"heart\":\"_37Gl6\",\"moveHeart\":\"_34mPq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"splash\":\"_2_d3x\",\"wrapper\":\"vMurv\",\"link\":\"_3lx8i\",\"name\":\"_1SiOU\",\"job\":\"_3chgr\",\"disclaimer\":\"_3RIFV\"};","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.deepmerge = factory());\n}(this, (function () { 'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tObject.keys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tObject.keys(source).forEach(function(key) {\n\t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nreturn deepmerge_1;\n\n})));\n","import SKILLS from '@constants/skills';\nimport style from './index.css';\n\nfunction getInitials (string) {\n const numWords = (string.match(/\\s/g) || []).length + 1;\n switch (numWords) {\n case 1:\n return string.slice(0, 3);\n case 2:\n return (string.match(/^\\w{1,2}|\\s\\w{1,2}/g) || []).join('').replace(/\\s/g, '');\n default:\n return (string.match(/^\\w|\\s\\w/g) || []).join('').replace(/\\s/g, '');\n }\n}\n\nexport default function Skill ({\n name = '?',\n text = 'Long description',\n ranks = 0,\n invested = 0,\n tier = 0,\n level = 1,\n effect = (rank, level) => `Rank ${rank} effect`,\n type = null,\n enabled = true,\n image = null,\n onChange = (oldValue, newValue) => null,\n}) {\n const isAugment = [\n SKILLS.AUGMENT_CHEVRON,\n SKILLS.AUGMENT_DIAMOND,\n SKILLS.AUGMENT_ACTION_SKILL,\n ].includes(type);\n let shapeStyle = null;\n if (type === SKILLS.ACTION_SKILL) { shapeStyle = style.actionSkill; }\n if (type === SKILLS.AUGMENT_CHEVRON) { shapeStyle = style.chevron; }\n if (type === SKILLS.AUGMENT_DIAMOND) { shapeStyle = style.diamond; }\n if (type === SKILLS.AUGMENT_ACTION_SKILL) { shapeStyle = style.actionSkill; }\n function clickListener (event) {\n var newValue;\n if (event.type === 'click') {\n newValue = Math.min(invested + 1, ranks);\n } else { // (event.type === 'contextmenu')\n newValue = Math.max(invested - 1, 0);\n }\n if (enabled && invested !== newValue) {\n onChange(invested, newValue);\n }\n event.preventDefault();\n return false;\n }\n return (\n 0) ? style.usable : '',\n ].join(' ')}\n onClick={clickListener}\n onContextMenu={clickListener}\n >\n
{getInitials(name)}
\n { enabled && ranks > 0 &&
{invested}/{ranks}
}\n
\n

{name}

\n {text}\n { invested > 0 &&\n
\n Current Effect:
\n {effect(invested, level)}\n
\n }\n { type !== null &&\n
\n {effect(1, level)}\n
\n }\n { type == null && invested < ranks &&\n
\n Next Rank:
\n {effect(invested + 1, level)}\n
\n }\n
\n \n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Siren ({ path }) {\n return (\n \n );\n}\n","export function setHash (skillsState) {\n const hashparts = [];\n for (let tree of Object.values(skillsState)) {\n for (let tier of Object.values(tree)) {\n for (let skill of Object.values(tier)) {\n if (skill.type == null) {\n hashparts.push(skill.invested || 0);\n }\n };\n };\n };\n const url = window.location.href.split('#')[0] + '#' + hashparts.join('');\n window.location.replace(url);\n};\n\nexport function getHash (skillsState) {\n const hash = window.location.href.split('#')[1] || '';\n const hashparts = hash.match(/./g) || [];\n const skills = JSON.parse(JSON.stringify(skillsState));\n for (let tree of Object.keys(skills)) {\n for (let tier of Object.keys(skills[tree])) {\n for (let skill of Object.keys(skills[tree][tier])) {\n if (skills[tree][tier][skill].type == null) {\n skills[tree][tier][skill] = { invested: parseInt(hashparts.shift() || 0) };\n } else {\n skills[tree][tier][skill] = {};\n }\n };\n };\n };\n return skills;\n};\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Beastmaster ({ path }) {\n return (\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Stiff Upper Lip Damage Resistance\nfunction getStiffUpperLipDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 6;\n case 2:\n return 12;\n case 3:\n return 16;\n default:\n return 0;\n }\n}\n\n// Nerves of Steel Handling\nfunction getNervesOfSteelHandling(rank) {\n switch (rank) {\n case 1:\n return 2.4;\n case 2:\n return 4.8;\n case 3:\n return 7;\n default:\n return 0;\n }\n}\n\n// Cold Bore Weapon Swap Speed\nfunction getColdBoreWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n case 4:\n return 38;\n case 5:\n return 43;\n default:\n return 0;\n }\n}\n\n// Cool Hand Passive Reload Speed\nfunction getCoolHandPassiveReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 2.9;\n case 2:\n return 5.7;\n case 3:\n return 8.3;\n case 4:\n return 10.7;\n case 5:\n return 13;\n default:\n return 0;\n }\n}\n\n// Cool Hand After Kill Reload Speed\nfunction getCoolHandAfterKillReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 4;\n case 2:\n return 7;\n case 3:\n return 11;\n case 4:\n return 14;\n case 5:\n return 17;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Under Cover\": {\n \"0\": {\n \"Barrier\": {\n text: \"Drop a deployable Barrier that blocks incoming projectiles. Zane and his allies can shoot through the Barrier, dealing increased Gun Damage. Pressing [Action Skill key] while Barrier is active picks up and holds the Barrier, but the size and bonuses are decreased.\",\n effect: (rank, level) => `Duration: 14 seconds\\nCooldown: 24 seconds\\nGun Damage Amp: +25%`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Adrenaline\": {\n text: \"Zane gains increased Action Skill Cooldown Rate. This bonus is based on the amount of shield he has. The more percent full, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: Up to +${percent(rank, 7)}%`,\n },\n \"Hearty Stock\": {\n text: \"Zane gains increased Maximum Shield Capacity.\",\n ranks: 3,\n effect: (rank, level) => `Maximum Shield: +${percent(rank, 10)}%`,\n },\n \"Ready for Action\": {\n text: \"Zane gains improved Shield Recharge Rate and Shield Recharge Delay.\",\n ranks: 5,\n effect: (rank, level) => `Shield Recharge Delay: -${percent(rank, 7)}%\\nShield Recharge Rate: +${percent(rank, 6)}%`,\n },\n },\n \"2\": {\n \"Charged Relay\": {\n text: \"Whenever Zane or an ally touches the Barrier, they gain increased Movement Speed and Reload Speed for a few seconds.\",\n ranks: 0,\n effect: (rank, level) => `Reload Speed: +20%\\nMovement Speed: +11%\\nDuration: 8 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Brainfreeze\": {\n text: \"Whenever Zane scores a Critical Hit on an enemy, there is a chance they will be Slowed. This effect stacks until the target is Frozen.\",\n ranks: 5,\n effect: (rank, level) => `Slow Chance: ${percent(rank, 4)}%`,\n },\n \"Stiff Upper Lip\": {\n text: \"Whenever Zane is damaged, he gains Damage Resistance against that damage type.\",\n ranks: 3,\n effect: (rank, level) => `Damage Resistance: +${getStiffUpperLipDamageResistance(rank)}%`,\n },\n \"Rise to the Occasion\": {\n text: \"Zane gains Health Regeneration. The lower his shield is, the higher the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: Up to +${percent(rank, 1)}% of Max Health/sec`,\n },\n },\n \"3\": {\n \"Nanites or Some Shite\": {\n text: \"Zane and his allies gain Health Regeneration, increased Reload Speed, and greatly improved Shield Recharge Delay while near his Barrier. The lower their health, the more health is regenerated.\",\n ranks: 0,\n effect: (rank, level) => `Team Health Regen: Up to +4% of Max Health/sec\\nTeam Shield Recharge Delay: -33%\\nTeam Reload Speed: +11%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Confident Competence\": {\n text: \"While Zane's shields are active, he gains increased Gun Damage and Accuracy. These bonuses are based on the amount of shields he has. The more percent full, the greater the bonuses.\",\n ranks: 1,\n effect: (rank, level) => `Gun Damage: Up to +35%\\nAccuracy: Up to +33%`,\n },\n \"All-Rounder\": {\n text: \"Zane's Barrier becomes a dome, covering all sides.\",\n ranks: 0,\n effect: (rank, level) => `Barrier Cooldown: +20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Redistribution\": {\n text: \"Zane and allies near the Barrier gain increased Gun Damage for a few seconds after the Barrier takes damage.\",\n ranks: 0,\n effect: (rank, level) => `Team Gun Damage: +10%\\nDuration: 3 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Really Expensive Jacket\": {\n text: \"Elemental Status Effects applied to Zane have reduced duration.\",\n ranks: 1,\n effect: (rank, level) => `Status Effect Duration: -50%`,\n },\n \"Best Served Cold\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, they create a Cryo Nova, dealing damage to all nearby enemies. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Cryo Damage: ${flat(rank, level, 2)} (increases with character level)\\nCooldown: 3 seconds`,\n },\n \"Futility Belt\": {\n text: \"Zane gains resistance to non-elemental damage.\\nKill Skill. After killing an enemy, all elemental damage Zane takes is converted to non-elemental damage.\",\n ranks: 1,\n effect: (rank, level) => `Non-Elemental Damage Resistance: +15%\\nDuration: 8 seconds`,\n },\n \"Deterrence Field\": {\n text: \"Enemies that touch the Barrier take Shock Damage and are staggered.\",\n ranks: 0,\n effect: (rank, level) => `Shock Damage: ${flat(1, level, 27)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Refreshment\": {\n text: \"Whenever Zane damages a frozen enemy with his weapon, he gains some of that damage back as health.\",\n ranks: 3,\n effect: (rank, level) => `Life Steal: +${percent(rank, 8)}% of damage dealt`,\n },\n \"Calm, Cool, Collected\": {\n text: \"Whenever Zane Freezes an enemy, his shield instantly begins recharging.\\nIf Zane's shields are already full, he regenerates health for a few seconds.\\nIf Zane's health is already full, his Action Skill Cooldowns and Durations are immediately reset.\",\n ranks: 1,\n effect: (rank, level) => `Health Regeneration: +3% of Max Health per second\\nHealth Regeneration Duration: 3 seconds`,\n },\n \"Nerves of Steel\": {\n text: \"Zane gains increasing Accuracy and Handling. The longer his shield is full, the greater the bonuses.\",\n ranks: 3,\n effect: (rank, level) => `Accuracy: +${percent(rank, 2)}% per second\\nHandling: +${getNervesOfSteelHandling(rank)}% per second\\nMaximum Stacks: 15`,\n },\n },\n \"6\": {\n \"Distributed Denial\": {\n text: \"Zane's Barrier gains the effects of his currently equipped Shield Mod. Additionally, shield effects are applied to all allies near the Barrier. Bonuses to Zane are reduced.\",\n ranks: 1,\n },\n },\n },\n \"Hitman\": {\n \"0\": {\n \"SNTNL\": {\n text: \"Send into battle an automated SNTNL drone that continually flies through the environment and attacks enemies with its Machine Guns. Pressing [Action Skill key] while SNTNL is active causes it to attack the enemy under Zane's crosshairs, if any. Machine Gun Element: Non-Elemental.\",\n effect: (rank, level) => `Machine Gun Damage: ${flat(rank, level, 6)} (increases with character level)\\nDuration: 24 seconds\\nCooldown: 60 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n }\n },\n \"1\": {\n \"Violent Speed\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Movement Speed for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}%\\nDuration: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Cold Bore\": {\n text: \"Zane gains increased Weapon Swap Speed. The next shot fired after swapping weapons deals Bonus Cryo Damage.\",\n ranks: 5,\n effect: (rank, level) => `Weapon Swap Speed: +${getColdBoreWeaponSwapSpeed(rank)}%\\nBonus Cryo Damage: +${percent(rank, 6)}% of damage dealt`,\n },\n \"Violent Momentum\": {\n text: \"Zane's Gun Damage is increased while moving. The quicker he moves, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% at default walk speed`,\n },\n },\n \"2\": {\n \"Winter's Drone\": {\n text: \"Converts SNTNL's primary weapons to Cryo Damage.\",\n ranks: 0,\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `SNTNL Weapons Element: Cryo`,\n },\n \"Cool Hand\": {\n text: \"Zane gains increased Reload Speed.\\nKill Skill. After killing an enemy, Zane's Reload Speed is increased for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed: +${getCoolHandPassiveReloadSpeed(rank)}%\\nAdditional Reload Speed: +${getCoolHandAfterKillReloadSpeed(rank)}%\\nDuration: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Drone Delivery\": {\n text: \"SNTRY will occasionally drop a free grenade based on your current grenade mod while attacking enemies.\",\n ranks: 1,\n effect: (rank, level) => `Cooldown: 15 seconds`,\n },\n \"Salvation\": {\n text: \"Kill Skill. After killing an enemy, Zane's weapons gain Life Steal for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Life Steal: +${percent(rank, 2)}% of damage dealt\\nDuration: 8 seconds`,\n },\n },\n \"3\": {\n \"Bad Dose\": {\n text: \"SNTNL occasionally shoots out a beam of Radiation that weakens enemies and buffs Zane. For every weakened enemy, Zane's Movement Speed and Fire Rate are increased. Weakened enemies have decreased Movement Speed and Attack Speed.\",\n ranks: 0,\n effect: (rank, level) => `Fire Rate: +2% per affected enemy\\nMovement Speed: +6% per affected enemy\\nBeam Damage: ${flat(rank, level, 4)} (increases with character level)\\nDuration: 12 seconds\\nCooldown: 8 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Death Follows Close\": {\n text: \"All of Zane's Kill Skills gain increased effect and duration.\",\n ranks: 1,\n effect: (rank, level) => `Kill Skill Bonus: +25%\\nKill Skill Duration: +7 seconds`,\n },\n \"Static Field\": {\n text: \"SNTNL emits a static field that sends a Shock Beam to nearby enemies, draining their shields and replenishing Zane's.\",\n ranks: 0,\n effect: (rank, level) => `Shield Damage: 2/sec (increases with character level)\\nCooldown: 2 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Boomsday\": {\n text: \"SNTNL adds a rocket pod to its primary weapons, allowing it to shoot rockets as well as machine guns. Element: Non-Elemental.\",\n ranks: 0,\n effect: (rank, level) => `Rocket Damage: ${flat(rank, level, 32)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Violent Violence\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Fire Rate for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 3)}%\\nCooldown: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Playing Dirty\": {\n text: \"Kill Skill. After killing an enemy, Zane's next five shots all have a chance to fire an additional projectile.\",\n ranks: 5,\n effect: (rank, level) => `Extra Shot Chance: ${percent(rank, 10)}%`,\n },\n \"Almighty Ordnance\": {\n text: \"Hold down [Action Skill key] while SNTNL is deployed to paint a target area. SNTNL fires a missile barrage at that area, and if an enemy is killed, SNTNL's duration is reset. This can only be used once per Action Skill use.\",\n ranks: 0,\n effect: (rank, level) => `Missile Damage: ${flat(rank, level, 56)} (increases with character level)\\nMissiles per Barrage: 4`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Good Misfortune\": {\n text: \"Kill Skill. Killing an enemy increases Zane's Action Skill Duration. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Action Skill Duration Returned: +${percent(rank, 4)}% of Max Duration`,\n },\n },\n \"6\": {\n \"Seein' Red\": {\n text: \"Activating an Action Skill automatically activates all of Zane's Kill Skills.\",\n ranks: 1,\n }\n }\n },\n \"Doubled Agent\": {\n \"0\": {\n \"Digi-Clone\": {\n text: \"Spawn a Digi-Clone of Zane. The Digi-Clone stays in place, but distracts and fires at enemies. Pressing [Action Skill key] while the Digi-Clone is active causes Zane and the Digi-Clone to swap places.\",\n effect: (rank, level) => `Duration: 15 seconds\\nCooldown: 28 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Synchronicity\": {\n text: \"Zane gains increased Gun Damage for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Praemunitus\": {\n text: \"Zane and his Dig-Clone gain increased Magazine Size.\",\n ranks: 3,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 8.333)}%\\nDigi-Clone Magazine Size: +${percent(rank, 8.333)}%`,\n },\n \"Borrowed Time\": {\n text: \"Zane gains increased Action Skill Duration for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Duration: +${percent(rank, 6)}% per active Action Skill`,\n },\n },\n \"2\": {\n \"Binary System\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, a Cryo Nova is triggered around Zane and his Digi-Clone.\",\n ranks: 0,\n effect: (rank, level) => `Cryo Damage: ${flat(rank, level, 46)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Donnybrook\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, he and his Digi-Clone receive increased Gun Damage and gain Health Regeneration for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%\\nHealth Regeneration: +${percent(rank, 0.5)}% of Missing Health/sec\\nDigi-Clone Gun Damage: +${percent(rank, 3)}%\\nDigi-Clone Health Regen: +${percent(rank, 0.5)}% Missing Health/sec\\nDuration: 8 seconds\\nMaximum Stacks: 2`,\n },\n \"Fractal Frags\": {\n text: \"The Digi-Clone throws a copy of Zane's current grenade mod when it is first activated. If the Digi-Clone is killed, it drops a free grenade. Killing an enemy while the Digi-Clone is active gives the Digi-Clone a chance to throw a grenade.\",\n ranks: 1,\n effect: (rank, level) => `Grenade Chance: 30%`,\n },\n \"Duct Tape Mod\": {\n text: \"The first shot fired from Zane's gun has a chance to also fire a grenade. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Grenade Chance: ${percent(rank, 4)}%\\nCooldown: 8 seconds`,\n },\n },\n \"3\": {\n \"Schadenfreude\": {\n text: \"Whenever the Digi-Clone takes damage, Zane's shield is restored by a portion of that damage.\",\n ranks: 0,\n effect: (rank, level) => `Shields Restored: 100% of damage taken by Digi-Clone`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Quick Breather\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, his shield immediately begins recharging. The Digi-Clone also immediately restores health.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Health Restored: 50% of Max Health`,\n },\n \"Which One's Real?\": {\n text: \"Enemies are more likely to target the Digi-Clone for a few seconds after it's summoned and after swapping places.\",\n ranks: 0,\n effect: (rank, level) => `Duration: 4 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Dopplebanger\": {\n text: \"Hold down [Action Skill key] to end the action skill early. When Zane's Action Skill is ended, the Digi-Clone explodes, dealing Splash Damage to all nearby enemies. The more Action Skill time remaining, the greater the damage.\",\n ranks: 0,\n effect: (rank, level) => `Damage: Up to ${flat(rank, level, 280)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Pocket Full of Grenades\": {\n text: \"Kill Skill. After killing an enemy, Zane gains Grenade Regeneration for a few seconds.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Regeneration: +${percent(rank, 5)}% per second\\nDuration: 8 seconds`,\n },\n \"Old-U\": {\n text: \"Press [Action Skill key] during Fight For Your Life if Digi-Clone is active to destroy the Digi-Clone and immediately gain a Second Wind with full health.\",\n ranks: 1,\n effect: (rank, level) => `Health Restored: 100% of Maximum Health`,\n },\n \"Supersonic Man\": {\n text: \"Zane gains increased Movement Speed for each active Action Skill.\",\n ranks: 3,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Digital Distribution\": {\n text: \"If Zane takes health damage while the Digi-Clone is active, a portion of that damage is inflicted on his Digi-Clone instead.\",\n ranks: 0,\n effect: (rank, level) => `Damage Shared: 75%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Like a Ghost\": {\n text: \"Zane and his Digi-Clone gain a chance to ignore bullets. This chance is increased for a few seconds after activating an Action Skill. This effect stacks.\",\n ranks: 3,\n effect: (rank, level) => `Ignore Bullet Chance: +${percent(rank, 2)}%\\nAdditional Ignore Bullet Chance: +${percent(rank, 3)}%\\nDuration: 8 seconds`,\n },\n \"Boom. Enhance.\": {\n text: \"Whenever Zane summons his Digi-Clone, it consumes up to 3 grenades. For every grenade consumed, the Digi-Clone gains increased Gun Damage, Maximum Health, Fire Rate, Reload Speed, and Digi-Clone Duration.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Gun Damage: +20% per grenade\\nDigi-Clone Maximum Health: +81% per grenade\\nDigi-Clone Fire Rate: +5% per grenade\\nDigi-Clone Reload Speed: +31% per grenade\\nDigi-Clone Duration: +25% per grenade`,\n },\n \"Trick of the Light\": {\n text: \"Zane deals Bonus Cryo Damage to enemies that aren't targeting him.\",\n ranks: 3,\n effect: (rank, level) => `Bonus Cryo Damage: +${percent(rank, 12)}% of damage dealt`,\n },\n },\n \"6\": {\n \"Double Barrel\": {\n text: \"The Digi-Clone is equipped with a copy of Zane's Current Weapon when activated. Swapping places with the Digi-Clone causes Zane and his Digi-Clone to gain increased Gun Damage.\",\n ranks: 1,\n effect: (rank, level) => `Item Duping: +100%\\nGun Damage: +25%\\nDigi-Clone Gun Damage: +25%`,\n },\n },\n },\n};\n\nexport default skills;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/gunner/index.html b/gunner/index.html index 5865a58..c080a1f 100644 --- a/gunner/index.html +++ b/gunner/index.html @@ -1 +1 @@ -Borderlands 3 Skill Planner \ No newline at end of file +Borderlands 3 Skill Planner \ No newline at end of file diff --git a/index.html b/index.html index 5865a58..c080a1f 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Borderlands 3 Skill Planner \ No newline at end of file +Borderlands 3 Skill Planner \ No newline at end of file diff --git a/operative/index.html b/operative/index.html index 5865a58..c080a1f 100644 --- a/operative/index.html +++ b/operative/index.html @@ -1 +1 @@ -Borderlands 3 Skill Planner \ No newline at end of file +Borderlands 3 Skill Planner \ No newline at end of file diff --git a/siren/index.html b/siren/index.html index 5865a58..c080a1f 100644 --- a/siren/index.html +++ b/siren/index.html @@ -1 +1 @@ -Borderlands 3 Skill Planner \ No newline at end of file +Borderlands 3 Skill Planner \ No newline at end of file diff --git a/sw.js b/sw.js index 0ac39a7..6d5ba33 100644 --- a/sw.js +++ b/sw.js @@ -1,3 +1,3 @@ -var __wpo = {"assets":{"main":["/45598562077bdc84281b5330ff4d283e.png","/6274c9808eb08785f146a2b78283b5f6.jpg","/bundle.8799e.css","/bundle.2a8cb50f.js","/assets/favicon.png","/assets/hunters/Beastmaster/000.png","/assets/hunters/Beastmaster/001.png","/assets/hunters/Beastmaster/010.png","/assets/hunters/Beastmaster/011.png","/assets/hunters/Beastmaster/012.png","/assets/hunters/Beastmaster/020.png","/assets/hunters/Beastmaster/021.png","/assets/hunters/Beastmaster/022.png","/assets/hunters/Beastmaster/023.png","/assets/hunters/Beastmaster/030.png","/assets/hunters/Beastmaster/031.png","/assets/hunters/Beastmaster/032.png","/assets/hunters/Beastmaster/033.png","/assets/hunters/Beastmaster/040.png","/assets/hunters/Beastmaster/041.png","/assets/hunters/Beastmaster/042.png","/assets/hunters/Beastmaster/043.png","/assets/hunters/Beastmaster/050.png","/assets/hunters/Beastmaster/051.png","/assets/hunters/Beastmaster/060.png","/assets/hunters/Beastmaster/100.png","/assets/hunters/Beastmaster/101.png","/assets/hunters/Beastmaster/110.png","/assets/hunters/Beastmaster/111.png","/assets/hunters/Beastmaster/112.png","/assets/hunters/Beastmaster/120.png","/assets/hunters/Beastmaster/121.png","/assets/hunters/Beastmaster/122.png","/assets/hunters/Beastmaster/123.png","/assets/hunters/Beastmaster/130.png","/assets/hunters/Beastmaster/131.png","/assets/hunters/Beastmaster/132.png","/assets/hunters/Beastmaster/133.png","/assets/hunters/Beastmaster/140.png","/assets/hunters/Beastmaster/141.png","/assets/hunters/Beastmaster/142.png","/assets/hunters/Beastmaster/143.png","/assets/hunters/Beastmaster/150.png","/assets/hunters/Beastmaster/151.png","/assets/hunters/Beastmaster/152.png","/assets/hunters/Beastmaster/160.png","/assets/hunters/Beastmaster/200.png","/assets/hunters/Beastmaster/201.png","/assets/hunters/Beastmaster/210.png","/assets/hunters/Beastmaster/211.png","/assets/hunters/Beastmaster/212.png","/assets/hunters/Beastmaster/220.png","/assets/hunters/Beastmaster/221.png","/assets/hunters/Beastmaster/222.png","/assets/hunters/Beastmaster/223.png","/assets/hunters/Beastmaster/230.png","/assets/hunters/Beastmaster/231.png","/assets/hunters/Beastmaster/232.png","/assets/hunters/Beastmaster/240.png","/assets/hunters/Beastmaster/241.png","/assets/hunters/Beastmaster/242.png","/assets/hunters/Beastmaster/243.png","/assets/hunters/Beastmaster/250.png","/assets/hunters/Beastmaster/251.png","/assets/hunters/Beastmaster/252.png","/assets/hunters/Beastmaster/260.png","/assets/hunters/Beastmaster/hero.png","/assets/hunters/Gunner/000.png","/assets/hunters/Gunner/010.png","/assets/hunters/Gunner/011.png","/assets/hunters/Gunner/012.png","/assets/hunters/Gunner/020.png","/assets/hunters/Gunner/021.png","/assets/hunters/Gunner/022.png","/assets/hunters/Gunner/023.png","/assets/hunters/Gunner/024.png","/assets/hunters/Gunner/030.png","/assets/hunters/Gunner/031.png","/assets/hunters/Gunner/032.png","/assets/hunters/Gunner/033.png","/assets/hunters/Gunner/040.png","/assets/hunters/Gunner/041.png","/assets/hunters/Gunner/042.png","/assets/hunters/Gunner/043.png","/assets/hunters/Gunner/050.png","/assets/hunters/Gunner/051.png","/assets/hunters/Gunner/052.png","/assets/hunters/Gunner/060.png","/assets/hunters/Gunner/100.png","/assets/hunters/Gunner/110.png","/assets/hunters/Gunner/111.png","/assets/hunters/Gunner/112.png","/assets/hunters/Gunner/120.png","/assets/hunters/Gunner/121.png","/assets/hunters/Gunner/122.png","/assets/hunters/Gunner/123.png","/assets/hunters/Gunner/124.png","/assets/hunters/Gunner/130.png","/assets/hunters/Gunner/131.png","/assets/hunters/Gunner/132.png","/assets/hunters/Gunner/133.png","/assets/hunters/Gunner/140.png","/assets/hunters/Gunner/141.png","/assets/hunters/Gunner/142.png","/assets/hunters/Gunner/143.png","/assets/hunters/Gunner/150.png","/assets/hunters/Gunner/151.png","/assets/hunters/Gunner/152.png","/assets/hunters/Gunner/160.png","/assets/hunters/Gunner/200.png","/assets/hunters/Gunner/210.png","/assets/hunters/Gunner/211.png","/assets/hunters/Gunner/212.png","/assets/hunters/Gunner/220.png","/assets/hunters/Gunner/221.png","/assets/hunters/Gunner/222.png","/assets/hunters/Gunner/223.png","/assets/hunters/Gunner/224.png","/assets/hunters/Gunner/230.png","/assets/hunters/Gunner/231.png","/assets/hunters/Gunner/232.png","/assets/hunters/Gunner/233.png","/assets/hunters/Gunner/240.png","/assets/hunters/Gunner/241.png","/assets/hunters/Gunner/242.png","/assets/hunters/Gunner/243.png","/assets/hunters/Gunner/250.png","/assets/hunters/Gunner/251.png","/assets/hunters/Gunner/252.png","/assets/hunters/Gunner/260.png","/assets/hunters/Gunner/hero.png","/assets/hunters/Operative/000.png","/assets/hunters/Operative/010.png","/assets/hunters/Operative/011.png","/assets/hunters/Operative/012.png","/assets/hunters/Operative/020.png","/assets/hunters/Operative/021.png","/assets/hunters/Operative/022.png","/assets/hunters/Operative/023.png","/assets/hunters/Operative/030.png","/assets/hunters/Operative/031.png","/assets/hunters/Operative/032.png","/assets/hunters/Operative/040.png","/assets/hunters/Operative/041.png","/assets/hunters/Operative/042.png","/assets/hunters/Operative/043.png","/assets/hunters/Operative/044.png","/assets/hunters/Operative/050.png","/assets/hunters/Operative/051.png","/assets/hunters/Operative/052.png","/assets/hunters/Operative/060.png","/assets/hunters/Operative/100.png","/assets/hunters/Operative/110.png","/assets/hunters/Operative/111.png","/assets/hunters/Operative/112.png","/assets/hunters/Operative/120.png","/assets/hunters/Operative/121.png","/assets/hunters/Operative/122.png","/assets/hunters/Operative/123.png","/assets/hunters/Operative/130.png","/assets/hunters/Operative/131.png","/assets/hunters/Operative/132.png","/assets/hunters/Operative/140.png","/assets/hunters/Operative/141.png","/assets/hunters/Operative/142.png","/assets/hunters/Operative/143.png","/assets/hunters/Operative/150.png","/assets/hunters/Operative/160.png","/assets/hunters/Operative/200.png","/assets/hunters/Operative/210.png","/assets/hunters/Operative/211.png","/assets/hunters/Operative/212.png","/assets/hunters/Operative/220.png","/assets/hunters/Operative/221.png","/assets/hunters/Operative/222.png","/assets/hunters/Operative/223.png","/assets/hunters/Operative/230.png","/assets/hunters/Operative/231.png","/assets/hunters/Operative/232.png","/assets/hunters/Operative/240.png","/assets/hunters/Operative/241.png","/assets/hunters/Operative/242.png","/assets/hunters/Operative/243.png","/assets/hunters/Operative/244.png","/assets/hunters/Operative/250.png","/assets/hunters/Operative/251.png","/assets/hunters/Operative/252.png","/assets/hunters/Operative/260.png","/assets/hunters/Operative/hero.png","/assets/hunters/Siren/000.png","/assets/hunters/Siren/010.png","/assets/hunters/Siren/011.png","/assets/hunters/Siren/012.png","/assets/hunters/Siren/020.png","/assets/hunters/Siren/021.png","/assets/hunters/Siren/022.png","/assets/hunters/Siren/023.png","/assets/hunters/Siren/030.png","/assets/hunters/Siren/031.png","/assets/hunters/Siren/032.png","/assets/hunters/Siren/033.png","/assets/hunters/Siren/034.png","/assets/hunters/Siren/040.png","/assets/hunters/Siren/041.png","/assets/hunters/Siren/050.png","/assets/hunters/Siren/051.png","/assets/hunters/Siren/052.png","/assets/hunters/Siren/053.png","/assets/hunters/Siren/06.png","/assets/hunters/Siren/060.png","/assets/hunters/Siren/100.png","/assets/hunters/Siren/110.png","/assets/hunters/Siren/111.png","/assets/hunters/Siren/112.png","/assets/hunters/Siren/120.png","/assets/hunters/Siren/121.png","/assets/hunters/Siren/122.png","/assets/hunters/Siren/123.png","/assets/hunters/Siren/130.png","/assets/hunters/Siren/131.png","/assets/hunters/Siren/132.png","/assets/hunters/Siren/140.png","/assets/hunters/Siren/141.png","/assets/hunters/Siren/142.png","/assets/hunters/Siren/143.png","/assets/hunters/Siren/150.png","/assets/hunters/Siren/151.png","/assets/hunters/Siren/152.png","/assets/hunters/Siren/160.png","/assets/hunters/Siren/200.png","/assets/hunters/Siren/210.png","/assets/hunters/Siren/211.png","/assets/hunters/Siren/212.png","/assets/hunters/Siren/220.png","/assets/hunters/Siren/221.png","/assets/hunters/Siren/222.png","/assets/hunters/Siren/223.png","/assets/hunters/Siren/230.png","/assets/hunters/Siren/231.png","/assets/hunters/Siren/232.png","/assets/hunters/Siren/240.png","/assets/hunters/Siren/241.png","/assets/hunters/Siren/242.png","/assets/hunters/Siren/243.png","/assets/hunters/Siren/250.png","/assets/hunters/Siren/251.png","/assets/hunters/Siren/252.png","/assets/hunters/Siren/260.png","/assets/hunters/Siren/hero.png","/assets/hunters/augment-action.png","/assets/hunters/augment-chevron.png","/assets/hunters/augment-diamond.png","/assets/hunters/basic.png","/assets/manifest.json","/assets/robots.txt","/"],"additional":[],"optional":[]},"externals":[],"hashesMap":{"6e148698d382b2c0806ba60a00e5e3e431d7232f":"/45598562077bdc84281b5330ff4d283e.png","507dda73c3ff7f9e08f8788d03b518bb39678b85":"/6274c9808eb08785f146a2b78283b5f6.jpg","1c64802fa6f529624ba507763c4ada3269f335dc":"/bundle.8799e.css","ab99a580a39f137d93179eaef9f443fec2b26fbb":"/bundle.2a8cb50f.js","67af5559591f22ffba90d13299f3df513e5cbc52":"/assets/favicon.png","9af1150332d75385d8ffdc64d571ec8d1a437f0f":"/assets/hunters/Beastmaster/000.png","c2925bcd582074cfd7e6aeedcd1dbb2781a48031":"/assets/hunters/Beastmaster/001.png","6d40ff1f4f45ea121a66d2293d2db879d9d66ef6":"/assets/hunters/Beastmaster/010.png","ed9f7a1a2d7e0bbc75bb655a9899f5daee69d9df":"/assets/hunters/Beastmaster/011.png","189f08d09779099cb3866ecd2e5db147e8688f7b":"/assets/hunters/Beastmaster/012.png","4da990290ac582249093aa0762ec03ce194568d9":"/assets/hunters/Beastmaster/020.png","c587d5fe8d5e028bb7e616dcea87379611f268f1":"/assets/hunters/Beastmaster/021.png","a46ddf7becbdfc0de6acab4527ab2ea2321a2d5a":"/assets/hunters/Beastmaster/022.png","af94b67084c450485969b7f3b9214db033c72084":"/assets/hunters/Beastmaster/023.png","fd0cfa0fed9faca922742630721f5816554e93e3":"/assets/hunters/Beastmaster/030.png","901a3ecef0ef8dada62b1b30e8bdf49fb1551ddf":"/assets/hunters/Beastmaster/031.png","dadc56494285303f24541f5577bb205a74043a62":"/assets/hunters/Beastmaster/032.png","7ae0e52589523f74914281227f6e461ff2d9a267":"/assets/hunters/Beastmaster/033.png","faeaa65837f8379a0e11960b89caec4d5bace436":"/assets/hunters/Beastmaster/040.png","f28d5dc8cf56ec11f6d2ecdef2375edfe953a562":"/assets/hunters/Beastmaster/041.png","ac562b991899445dcc8878a69d1a2a76de25f4e6":"/assets/hunters/Beastmaster/042.png","1a91e2aa94ad216dc0c71851c008bd818bdb1941":"/assets/hunters/Beastmaster/043.png","f03ca5e3841494d7773c1c0aff46aaa11e53f85a":"/assets/hunters/Beastmaster/050.png","cb621aefc1783ddb201e202d412ad3907b78f414":"/assets/hunters/Beastmaster/051.png","22d915e3a307b42461c9b8cfb1c2bb3c78f36a8a":"/assets/hunters/Beastmaster/060.png","30628665bf411727c306cbeac159456db3be9e1f":"/assets/hunters/Beastmaster/100.png","82dcc57934ea55d61fa48dbbb190574a5b83a3d8":"/assets/hunters/Beastmaster/101.png","7e14ff5afd5e2eec8e0f0f6e11f7f475317924fa":"/assets/hunters/Beastmaster/110.png","024f1a8d93699ef6add10638fb7a34d8edb60d8c":"/assets/hunters/Beastmaster/111.png","7df3c789dbf3a63f3a1b226a9d52dad1d882b2f9":"/assets/hunters/Beastmaster/112.png","26cf2fdbb660e73e0127dd4d3db270f9caddef3a":"/assets/hunters/Beastmaster/120.png","33e7cb07076d660b1124bf0e700b54c560b35396":"/assets/hunters/Beastmaster/121.png","a2e8552717e0b056949779ae5720c1a03bdb4372":"/assets/hunters/Beastmaster/122.png","ac7ffb0b0746ac85d369e1bd3c7947a34ba396aa":"/assets/hunters/Beastmaster/123.png","0bec5e860f684498986e687f265c30f8091869c2":"/assets/hunters/Beastmaster/130.png","8b693e1a7730d22dcf1c1b2eddcaae94b372c769":"/assets/hunters/Beastmaster/131.png","aaf378398b332e219c89cc0a4a4f401cc254866b":"/assets/hunters/Beastmaster/132.png","99a3944a10da723293bca8c01cf335b1068093f0":"/assets/hunters/Beastmaster/133.png","32cc792225263a7d52b1e4f20893365f20cc812b":"/assets/hunters/Beastmaster/140.png","ce96b467323aab2967e07124fef6b58d4259229c":"/assets/hunters/Beastmaster/141.png","d78620f70a3ce4f785c8f4b1d7aebd23a0831fe2":"/assets/hunters/Beastmaster/142.png","e71e828300067bb37ddff61f38d3559ae9e20c2c":"/assets/hunters/Beastmaster/143.png","eeff605535573fed8b6ce039e91e37beaf5ea456":"/assets/hunters/Beastmaster/150.png","ea2699d4b4c5eaca7588dc33bc10f27f1206052c":"/assets/hunters/Beastmaster/151.png","e325151f9b69d8d147407c8b70ce72627ca93830":"/assets/hunters/Beastmaster/152.png","982415964f422ed25a5ffab32a28ea7a854c1541":"/assets/hunters/Beastmaster/160.png","977877a464943f876846612ecc8493bb8137b0f6":"/assets/hunters/Beastmaster/200.png","7fb64ed1f5d0baf25f772cd5af5da6feb2f6270d":"/assets/hunters/Beastmaster/201.png","d9a71f3dee3ed3f69ff83794687c9c06228385b3":"/assets/hunters/Beastmaster/210.png","96ce6f53559178f4dfbbabf251242a4c5c241b17":"/assets/hunters/Beastmaster/211.png","6e044f76a1700b3739bfcafbbfb33e9146f2693a":"/assets/hunters/Beastmaster/212.png","23abf2f2c2b3bba52a7eef79e2e3460a063b063a":"/assets/hunters/Beastmaster/220.png","32c28e47255087a985b6f17c2076534ea631c1ee":"/assets/hunters/Beastmaster/221.png","b23df346b16cd8aa7e320e90d3c759f8fafc9929":"/assets/hunters/Beastmaster/222.png","663f88fff3084d908fd24a36ecd7b6c88bc4b940":"/assets/hunters/Beastmaster/223.png","1b61af090bb407ae59f4fce586f777e99f390abd":"/assets/hunters/Beastmaster/230.png","15d9fbd82ef4e0de5eaafb1ee079ef276e721573":"/assets/hunters/Beastmaster/231.png","253f574bc73a1cd2b808a382de2ec3a04c3b94bb":"/assets/hunters/Beastmaster/232.png","ddeda995655074539ee0bad9c6588a2cdcc36e61":"/assets/hunters/Beastmaster/240.png","94b05d293948e5d6588dcc423019b40eff55396d":"/assets/hunters/Beastmaster/241.png","afaf095f2bf2a9478fde265dd06b5b1d6d68ef1b":"/assets/hunters/Beastmaster/242.png","e3073e7192fa6ac41dd2a48d309056f37a908c92":"/assets/hunters/Beastmaster/243.png","8df769891eeb6868762131a107658dff76f4b139":"/assets/hunters/Beastmaster/250.png","ba3887ee18f5edd865c6069f89ff1a5603dd119b":"/assets/hunters/Beastmaster/251.png","5e9b8f8e3d316c352177fa203cc280ccaed98f43":"/assets/hunters/Beastmaster/252.png","5d20741e9d260aca46897c69dd5427c50000c012":"/assets/hunters/Beastmaster/260.png","a130dbe9dbd85818b542218b80337b41a60b8f57":"/assets/hunters/Beastmaster/hero.png","23e8e8b6d3d399cd4d95461e4d01e8ad0e1af46f":"/assets/hunters/Gunner/000.png","5b5b8f8b00151388f16077133d744479006e0bcf":"/assets/hunters/Gunner/010.png","a7bd5f48af2fb324e735f3bee72987393d2a78fa":"/assets/hunters/Gunner/011.png","c27385fd9aa0409c1799939b2de24f7398b6f341":"/assets/hunters/Gunner/012.png","16833bfda89cfb73d9484e014a099da62dfa4bef":"/assets/hunters/Gunner/020.png","1ee7ec85fbb6df916bb49736a8e5a65034070d88":"/assets/hunters/Gunner/021.png","acc7cc6c1b83ba606d89e7c34bdb2b9e14554fb1":"/assets/hunters/Gunner/022.png","701f49d7c026dffcdacd6b3fddf417312c90f2f8":"/assets/hunters/Gunner/023.png","38313df1bedb289c392aae2f12cc1885d0426943":"/assets/hunters/Gunner/024.png","2b9b3c81913f7896ad2ebf8351bbf7ba72827482":"/assets/hunters/Gunner/030.png","3a928dcf9776c52bb501b583cb551611dce51c90":"/assets/hunters/Gunner/031.png","05ccd93d330af1ac0c97f25f48e75e788232e3f9":"/assets/hunters/Gunner/032.png","73770c159217caaac0d2fb5bf5859bf6bde58b93":"/assets/hunters/Gunner/033.png","1469bb1f1c57795c120fae42b8ee44ef1c315cd3":"/assets/hunters/Gunner/040.png","2650cdbb9de5cc6775675f02a4e0315445f0377c":"/assets/hunters/Gunner/041.png","f5e8b3143e9cf2ff78b33d309d10e5bdeab22e7a":"/assets/hunters/Gunner/042.png","4fe6553e5b1d8aba29f691eb123f4f7a1c743308":"/assets/hunters/Gunner/043.png","a922c1fc538d9a49adf04dad39fd97bf9ff22b18":"/assets/hunters/Gunner/050.png","87b871ce6af1b8a6151d74c061854090209f36fe":"/assets/hunters/Gunner/051.png","eba1433143f158a65e799bea5629294e8836bb71":"/assets/hunters/Gunner/052.png","e3d2c7b4a19e8b947b8bfb561a55aceaa0cab39c":"/assets/hunters/Gunner/060.png","71ee81aefda7a37484400e430c0e73d0cfcdbc50":"/assets/hunters/Gunner/100.png","78406559b20a904c7a1e3d8ce403ddd11900ed95":"/assets/hunters/Gunner/110.png","91c545335597cf3651fae82d3d011daba8b06180":"/assets/hunters/Gunner/111.png","3d4326a8df98f81b71bca423edd743558ef715b7":"/assets/hunters/Gunner/112.png","18cb95edd794224f4b8aa8e09e4626b38710113b":"/assets/hunters/Gunner/120.png","e729843d5714b212b5cf99043f00d3c36515bfd7":"/assets/hunters/Gunner/121.png","45e58daa84a58ac11511cc6aefc099753eb4e725":"/assets/hunters/Gunner/122.png","e3ecc889adea59c7e9d7c2a01b4cdedfc36dee35":"/assets/hunters/Gunner/123.png","668d6cdfabec7deea687e4e7186a8d2d7db5d875":"/assets/hunters/Gunner/124.png","30a60bdd359a67b92a3e1927f87595b86774e987":"/assets/hunters/Gunner/130.png","192e374ef5df405034552f3940ad8fc4f87ddf3f":"/assets/hunters/Gunner/131.png","f6143f9cdb407f89ce7ffca8b615b3260c700ac8":"/assets/hunters/Gunner/132.png","c5ee0e43f0177f83707bb1f97242e091e0683ed2":"/assets/hunters/Gunner/133.png","968e1b6494ac3056c38a5fa4c79949d34ec222ed":"/assets/hunters/Gunner/140.png","1d01d750c011a63bf9e8693ac6b6b0728320b7cf":"/assets/hunters/Gunner/141.png","dd3c476249e8d3d7e522b7d1811a38331861d61e":"/assets/hunters/Gunner/142.png","c98707fe16d6b0a6221fd5cc1c9bcb8a0cd645ae":"/assets/hunters/Gunner/143.png","2c6b00e38bf4d0c1074f2ef142b726d2b04fbb2a":"/assets/hunters/Gunner/150.png","fe1a3fd195fa727a5eaf2bfa03451b684aa88077":"/assets/hunters/Gunner/151.png","c5a505106c971acd502108e89bf77d86a5cdf144":"/assets/hunters/Gunner/152.png","f7c8cc975ac0ab8ea2d7b84af972c098c28d8bd0":"/assets/hunters/Gunner/160.png","1622282989a1cc6fa83db8581b551a917cd52330":"/assets/hunters/Gunner/200.png","b46910fea6bfca0ed6b63c094fa80bd89c2264d9":"/assets/hunters/Gunner/210.png","f7adcc610a8f995258a6faf8156f00163cced543":"/assets/hunters/Gunner/211.png","74bc6a2f86b8b20500bcc311a3b627ac16d9d4e6":"/assets/hunters/Gunner/212.png","21f7d3a64c8791dd123720278b6704315ad28df4":"/assets/hunters/Gunner/220.png","dfeb1821cfb13f6addf640b1ee67914cb14d30fd":"/assets/hunters/Gunner/221.png","39da5205b90dbff2bf0fb94d1c99979f81aeb271":"/assets/hunters/Gunner/222.png","9c9198a1953bb44e5de81865647363c9d176fa3d":"/assets/hunters/Gunner/223.png","684eff117dade4ebe27f650246e62d939889db43":"/assets/hunters/Gunner/224.png","65c0665551f5d001fd3ab7b3bffa6c9edd8c62fc":"/assets/hunters/Gunner/230.png","7977f30fcca8878127307dacf472adf220bd2c5d":"/assets/hunters/Gunner/231.png","52f4435246eff588fa2a124376cc084cf661d4c5":"/assets/hunters/Gunner/232.png","9f6d0651d31e3d817beecf635a4fda3633aab967":"/assets/hunters/Gunner/233.png","eff83ac676f4441f53656f02515079f33ef80630":"/assets/hunters/Gunner/240.png","efb258ed895b6b3edd25b6c65b2609d1f231524b":"/assets/hunters/Gunner/241.png","69ccd6d0e97d92c5257c6d8fc3e41324549219c9":"/assets/hunters/Gunner/242.png","385e1713cbb6ebefa805ef9f7f826ac987848685":"/assets/hunters/Gunner/243.png","42c36d9d6b166dcebd782cbeac73d3f7de953747":"/assets/hunters/Gunner/250.png","652e37797eb0d37b444b8010b7193fcefbfe57a9":"/assets/hunters/Gunner/251.png","b7f15e93c3200e22fd5d4d7095d181a826b46441":"/assets/hunters/Gunner/252.png","72fe4ac2297b473f87970a102b3f4bfd98e5c9bf":"/assets/hunters/Gunner/260.png","eaf0686064b5bc00abc5b7cc0fb8939369a41503":"/assets/hunters/Gunner/hero.png","7ef159acba264bc42d95c6189b827225796e0b5b":"/assets/hunters/Operative/000.png","0a108afb2118bc9e330581e83bd32183255b3046":"/assets/hunters/Operative/010.png","70a8f250d108dd0f8176c2d6a2218c307913dfd0":"/assets/hunters/Operative/011.png","36ec4cb958c4f167991ce9a01b5fb46c5e076964":"/assets/hunters/Operative/012.png","6634bf9575bd6c9eccf4c47be055eea8c1301e19":"/assets/hunters/Operative/020.png","c3c82ea03e6e1d7d8bf0ca219d87865707a6cb4e":"/assets/hunters/Operative/021.png","72a8f92d4bff4f7aba4bd305b9105ea18dc8a138":"/assets/hunters/Operative/022.png","3f876579c0f7f4b3d70a19dc16078c336e044805":"/assets/hunters/Operative/023.png","5dc95fe77eebf25959d5b1d3ee79423924061184":"/assets/hunters/Operative/030.png","4512860249aa95b482d40c12fa38fdd2ceca2a57":"/assets/hunters/Operative/031.png","c5ed6b800129670e081301c7d109639f1caa6436":"/assets/hunters/Operative/032.png","67479a4c6d8b41c87e6e9a73ce89144fdecb63bd":"/assets/hunters/Operative/040.png","bd0c790a5fce329577a5b8bf277bedf4ff44a22b":"/assets/hunters/Operative/041.png","a0a359398034700eb798bcb4794c6b1c15e9fa86":"/assets/hunters/Operative/220.png","01d9bbe2bb9ab56f03eb5962faa450f81a5d5d90":"/assets/hunters/Operative/043.png","bea7fb77a1fc1dc80f504fc513d465f45b60b978":"/assets/hunters/Operative/044.png","887058c07d97376bcc8a2788d83491de5e5d7675":"/assets/hunters/Operative/050.png","0227c3523bd61f5ed7e519a9611fc419cad851ce":"/assets/hunters/Operative/051.png","cf639ad5784c2dc8181d29016afb4be64cd2b055":"/assets/hunters/Operative/052.png","77f5bdc3559983bfb123a9fc4a973f331f2b0054":"/assets/hunters/Operative/060.png","32670c4aa1974ce7140aad22d97870b293494f97":"/assets/hunters/Operative/100.png","fddea87bf684c5661ac7fca05bff0dd33142304a":"/assets/hunters/Operative/110.png","2e9fa60325f13aa0a133b25f336509927db44efd":"/assets/hunters/Operative/242.png","b708a1c79ae717809b0b9e72d2fc0443b0f45899":"/assets/hunters/Operative/112.png","df31851b2f1ed9dca521ddc6aa424222c3c9819c":"/assets/hunters/Operative/120.png","d87b3a4a8f33a2cd3b9e48bbae55f7c5c355be4d":"/assets/hunters/Operative/121.png","db8598afb13384100d862520f85e0b804612d7f4":"/assets/hunters/Operative/122.png","0ec73cd854d2079dc492ef4732e0035d8f6da00c":"/assets/hunters/Operative/123.png","bb35ad5e5546ff779055a3235534e36d57b07eb8":"/assets/hunters/Operative/130.png","dfe2ba07413e3147dc1077a302d00ed5e3478c1a":"/assets/hunters/Operative/131.png","1978aff23464b114fd32db1b3600f247291bca39":"/assets/hunters/Operative/132.png","df91d746e68f18e5c1d37214b119c003fb1ec2ce":"/assets/hunters/Operative/140.png","159294f9a90d288f836fd1d253788cd62a05b964":"/assets/hunters/Operative/141.png","e27f84a32cced908b4227564979085f90dc46c67":"/assets/hunters/Operative/142.png","d4a8b30ba1e889bb2254a5114518063774ee6511":"/assets/hunters/Operative/143.png","32baf66e98a3ba1bcb598ab592ea93151d937ff0":"/assets/hunters/Operative/150.png","e7e7b8af504419ca00b6329db603fa3f25c542dd":"/assets/hunters/Operative/160.png","f888d064faaa59aa77f00364844550e0347a747c":"/assets/hunters/Operative/200.png","2bda2e0dca133527ac48ed33a13120fcfa31bd6b":"/assets/hunters/Operative/210.png","fa34dd2b1fd00883400ec5eb28f7e044faf6e991":"/assets/hunters/Operative/211.png","38e69bd15d69386b5d7dd6e2400da413129b034d":"/assets/hunters/Operative/212.png","e55745c8ee0366fe89a142aa47d1c427f5173b10":"/assets/hunters/Operative/221.png","42321b188187f5c49a7c1378709984026d0340a9":"/assets/hunters/Operative/222.png","60e8372568097238ad315f475365d66f70505f52":"/assets/hunters/Operative/223.png","f3939574dda35cf7bca441cd5e06e5f9ae0d6e6c":"/assets/hunters/Operative/230.png","16b09276e51db8965d575ac482c7d7c142c46cde":"/assets/hunters/Operative/231.png","12438d22429c821b657e4a9edf4f35a3d5a54566":"/assets/hunters/Operative/232.png","26b60a2f768375f86d69ab5a83f1699ce3db8f7f":"/assets/hunters/Operative/240.png","310e3fb50445806904045b9cdee77898091481b6":"/assets/hunters/Operative/241.png","1a072e484698ec68252d0eeafe19f929ffa8cecc":"/assets/hunters/Operative/243.png","5a096695224f2126f56e0ec5f9ea42abdd96cc5e":"/assets/hunters/Operative/244.png","a9d67fcb5c187ee58d9ead33c568f2e4e92e3cfb":"/assets/hunters/Operative/250.png","4c28d38742af997fe77c09314e09dc846cb349d0":"/assets/hunters/Operative/251.png","2adad79588ca38d4afbb8e1d4cf96b465a835e2b":"/assets/hunters/Operative/252.png","c89710ed72a6484c4e7d663832fbebeb37db4925":"/assets/hunters/Operative/260.png","695afb5dc6e3bdfadb89b6eb3d12415efca249fe":"/assets/hunters/Operative/hero.png","b4017efa1ca43982dafc30596850300ee96a863a":"/assets/hunters/Siren/000.png","6023a253acd3041a850c1cd424aa9587e000d32a":"/assets/hunters/Siren/010.png","169308c7625065d71d7c2ddd306c465b7db264af":"/assets/hunters/Siren/011.png","8fec7aedcd869d7ee88ec796f8d82e1be7d4d493":"/assets/hunters/Siren/012.png","8e58ecd8148e8149188b6ffac8f10b9886eaed8c":"/assets/hunters/Siren/020.png","57d9183509906b00a2b5816a4237c6147a3138d8":"/assets/hunters/Siren/021.png","05b4881d3a74db16cb1fcb91076392b88ea1ab95":"/assets/hunters/Siren/022.png","d0d1ff7a21d2528f55e9a6f7a365b6fcb1fb62cd":"/assets/hunters/Siren/023.png","7ead1aed2379038624a4abfbf3903e96b24511f3":"/assets/hunters/Siren/030.png","4c5c84e4a0e217741aa21a150456d30e573c978f":"/assets/hunters/Siren/031.png","95007e633fcd85172f53d29068bf1d108c03a484":"/assets/hunters/Siren/032.png","d7b92fff331a3b48edba5a675226b0085ea6dba7":"/assets/hunters/Siren/033.png","a847810e3960dd38f50a3c60e59376b07c9d0310":"/assets/hunters/Siren/034.png","59016060d9320923ab4b48ee508a4d8199e9fc66":"/assets/hunters/Siren/040.png","34f661c56329d9a8e15cc1f248edeb8a22e54ded":"/assets/hunters/Siren/041.png","041f615cd6c520a8580c6244d3f33c459505e717":"/assets/hunters/Siren/050.png","183ba2d24528d50f116ba6b25925ed07ae9a56e6":"/assets/hunters/Siren/051.png","c204ddf867720fbff13de0f16b21135193cbac41":"/assets/hunters/Siren/052.png","d3828fcbfce32ec1d5f7856426ca6bfa248856fa":"/assets/hunters/Siren/06.png","c2afe33b331c3746f6579040d96d4320664825a5":"/assets/hunters/Siren/060.png","1ff8118e0db2c5aed4fb5abf58990713fefb1756":"/assets/hunters/Siren/100.png","6e671f99f4a9ba531599c1b989e43d45b66961c9":"/assets/hunters/Siren/110.png","d13c7cae1e49f26522b9fb60822e5c20edc948f9":"/assets/hunters/Siren/111.png","2f69da074b61bcac9582741a29adce556df901f6":"/assets/hunters/Siren/112.png","a1f28e21a7e98368a181970323d27f8662dcab8f":"/assets/hunters/Siren/120.png","98e92f76bd0ebe2918303ae633969399bb200602":"/assets/hunters/Siren/121.png","ce291a353177d3825e6c5f046faf1a7ca044e08c":"/assets/hunters/Siren/122.png","93609663868c6cb3ee2dca8ef6bff5c104cc3dda":"/assets/hunters/Siren/123.png","5602f358af85318f18e57ce1e9c47aa14e88305c":"/assets/hunters/Siren/130.png","1f635e3056b7c3174572f155cc34cbb2d56a9a2c":"/assets/hunters/Siren/131.png","6308de0f81c2f6d3839cbed8680f193ce5dc48e1":"/assets/hunters/Siren/132.png","479b0557635c5830429e85f642e9785393fc5ee0":"/assets/hunters/Siren/140.png","ee85ab849f91c7e455ec4b41ef4a808ba9e41ea7":"/assets/hunters/Siren/141.png","686ea56e145c9041e25c83f9f6c6a9f0cf0bc000":"/assets/hunters/Siren/142.png","6a3db332e9e62cea96ca05542f7150dac1621589":"/assets/hunters/Siren/143.png","c5539f412c581565f73aa62f357863a58b5ff20b":"/assets/hunters/Siren/150.png","9374469eb759d444a07a39ea54759f466cb3c030":"/assets/hunters/Siren/151.png","7f7d4012a40b6dd32e0ff9daa8a41b9651ceb52b":"/assets/hunters/Siren/152.png","cbc7b3d491e2c171da4d9ab9a9c4432e20bbe996":"/assets/hunters/Siren/160.png","7c553ffeb1fe2a99e05de0ad403f63b63d205cce":"/assets/hunters/Siren/200.png","fe96d230b6993d6dd5861457a2d04de143efbcc9":"/assets/hunters/Siren/210.png","8c67a2bb82290396fcd3101dee0790b16e46e3ce":"/assets/hunters/Siren/211.png","0cfb681bf388401758db4d38f2cd3d44f32259c9":"/assets/hunters/Siren/212.png","cfd20f56f7a3254a75cf1f2602a3881197f30fed":"/assets/hunters/Siren/220.png","03dbbb07f9139b5a9c72b297b6da04bb0fcac22b":"/assets/hunters/Siren/221.png","b94d73432e54f58b4cb341f6bff8bd1e0296e137":"/assets/hunters/Siren/222.png","0462e6bb95301245a17a1c646f4600baad807e1c":"/assets/hunters/Siren/223.png","80a6a4efdc4b7004ce3f985858caabc1dca07028":"/assets/hunters/Siren/230.png","8578d2573faec884908606431f5d615cbc1425b2":"/assets/hunters/Siren/231.png","7cc1ef6f46e91bca039aca36f9ef457c2b94973c":"/assets/hunters/Siren/232.png","220722b787ec35936a51aaf75dfee3bbb4af4b5d":"/assets/hunters/Siren/240.png","05f5e3e18eb53583314d32064830a5511ced741e":"/assets/hunters/Siren/241.png","48836afb2cc4ad09883111d754a56f920e6c0114":"/assets/hunters/Siren/242.png","0a666b4c52199933bb2aed351b9c72dd41ed2b4d":"/assets/hunters/Siren/243.png","f25cbf1ca0c27741c3494ca8c19769c582e6c97f":"/assets/hunters/Siren/250.png","8054c10392c67a2baf21e92bdd9bba24a5fdcca4":"/assets/hunters/Siren/251.png","40653c8ac7a6b7f23b90d1c555cde438fe97352b":"/assets/hunters/Siren/252.png","e18f33f08115e9b2422a2c7a0243550a328d49ec":"/assets/hunters/Siren/260.png","88c73b79a233f81fb265f4a5440157968b250a51":"/assets/hunters/Siren/hero.png","da5115eef0fec4fa4125932d2979689e8c9401e0":"/assets/hunters/augment-action.png","6f1cc287ad25e2f0d8ca12256c2f0277e932b8a8":"/assets/hunters/augment-chevron.png","cfb4c486971c9fac258b2288e3511bc78b7b94b9":"/assets/hunters/augment-diamond.png","1a69f37c8ca85b7e15720d4557b7c3e610b5bd13":"/assets/hunters/basic.png","3a03eb4a327cd89d096bd1ed9f95366649e8e259":"/assets/manifest.json","c47ccf1a49c24cc5842430aa75c72ef491292412":"/assets/robots.txt","2f95768d2452361fd680274831cea0423b7cfc47":"/"},"strategy":"changed","responseStrategy":"cache-first","version":"1/9/2020, 3:53:40 PM","name":"webpack-offline","pluginVersion":"5.0.7","relativePaths":false}; +var __wpo = {"assets":{"main":["/45598562077bdc84281b5330ff4d283e.png","/6274c9808eb08785f146a2b78283b5f6.jpg","/bundle.8799e.css","/bundle.964e211b.js","/assets/favicon.png","/assets/hunters/Beastmaster/000.png","/assets/hunters/Beastmaster/001.png","/assets/hunters/Beastmaster/010.png","/assets/hunters/Beastmaster/011.png","/assets/hunters/Beastmaster/012.png","/assets/hunters/Beastmaster/020.png","/assets/hunters/Beastmaster/021.png","/assets/hunters/Beastmaster/022.png","/assets/hunters/Beastmaster/023.png","/assets/hunters/Beastmaster/030.png","/assets/hunters/Beastmaster/031.png","/assets/hunters/Beastmaster/032.png","/assets/hunters/Beastmaster/033.png","/assets/hunters/Beastmaster/040.png","/assets/hunters/Beastmaster/041.png","/assets/hunters/Beastmaster/042.png","/assets/hunters/Beastmaster/043.png","/assets/hunters/Beastmaster/050.png","/assets/hunters/Beastmaster/051.png","/assets/hunters/Beastmaster/060.png","/assets/hunters/Beastmaster/100.png","/assets/hunters/Beastmaster/101.png","/assets/hunters/Beastmaster/110.png","/assets/hunters/Beastmaster/111.png","/assets/hunters/Beastmaster/112.png","/assets/hunters/Beastmaster/120.png","/assets/hunters/Beastmaster/121.png","/assets/hunters/Beastmaster/122.png","/assets/hunters/Beastmaster/123.png","/assets/hunters/Beastmaster/130.png","/assets/hunters/Beastmaster/131.png","/assets/hunters/Beastmaster/132.png","/assets/hunters/Beastmaster/133.png","/assets/hunters/Beastmaster/140.png","/assets/hunters/Beastmaster/141.png","/assets/hunters/Beastmaster/142.png","/assets/hunters/Beastmaster/143.png","/assets/hunters/Beastmaster/150.png","/assets/hunters/Beastmaster/151.png","/assets/hunters/Beastmaster/152.png","/assets/hunters/Beastmaster/160.png","/assets/hunters/Beastmaster/200.png","/assets/hunters/Beastmaster/201.png","/assets/hunters/Beastmaster/210.png","/assets/hunters/Beastmaster/211.png","/assets/hunters/Beastmaster/212.png","/assets/hunters/Beastmaster/220.png","/assets/hunters/Beastmaster/221.png","/assets/hunters/Beastmaster/222.png","/assets/hunters/Beastmaster/223.png","/assets/hunters/Beastmaster/230.png","/assets/hunters/Beastmaster/231.png","/assets/hunters/Beastmaster/232.png","/assets/hunters/Beastmaster/240.png","/assets/hunters/Beastmaster/241.png","/assets/hunters/Beastmaster/242.png","/assets/hunters/Beastmaster/243.png","/assets/hunters/Beastmaster/250.png","/assets/hunters/Beastmaster/251.png","/assets/hunters/Beastmaster/252.png","/assets/hunters/Beastmaster/260.png","/assets/hunters/Beastmaster/hero.png","/assets/hunters/Gunner/000.png","/assets/hunters/Gunner/010.png","/assets/hunters/Gunner/011.png","/assets/hunters/Gunner/012.png","/assets/hunters/Gunner/020.png","/assets/hunters/Gunner/021.png","/assets/hunters/Gunner/022.png","/assets/hunters/Gunner/023.png","/assets/hunters/Gunner/024.png","/assets/hunters/Gunner/030.png","/assets/hunters/Gunner/031.png","/assets/hunters/Gunner/032.png","/assets/hunters/Gunner/033.png","/assets/hunters/Gunner/040.png","/assets/hunters/Gunner/041.png","/assets/hunters/Gunner/042.png","/assets/hunters/Gunner/043.png","/assets/hunters/Gunner/050.png","/assets/hunters/Gunner/051.png","/assets/hunters/Gunner/052.png","/assets/hunters/Gunner/060.png","/assets/hunters/Gunner/100.png","/assets/hunters/Gunner/110.png","/assets/hunters/Gunner/111.png","/assets/hunters/Gunner/112.png","/assets/hunters/Gunner/120.png","/assets/hunters/Gunner/121.png","/assets/hunters/Gunner/122.png","/assets/hunters/Gunner/123.png","/assets/hunters/Gunner/124.png","/assets/hunters/Gunner/130.png","/assets/hunters/Gunner/131.png","/assets/hunters/Gunner/132.png","/assets/hunters/Gunner/133.png","/assets/hunters/Gunner/140.png","/assets/hunters/Gunner/141.png","/assets/hunters/Gunner/142.png","/assets/hunters/Gunner/143.png","/assets/hunters/Gunner/150.png","/assets/hunters/Gunner/151.png","/assets/hunters/Gunner/152.png","/assets/hunters/Gunner/160.png","/assets/hunters/Gunner/200.png","/assets/hunters/Gunner/210.png","/assets/hunters/Gunner/211.png","/assets/hunters/Gunner/212.png","/assets/hunters/Gunner/220.png","/assets/hunters/Gunner/221.png","/assets/hunters/Gunner/222.png","/assets/hunters/Gunner/223.png","/assets/hunters/Gunner/224.png","/assets/hunters/Gunner/230.png","/assets/hunters/Gunner/231.png","/assets/hunters/Gunner/232.png","/assets/hunters/Gunner/233.png","/assets/hunters/Gunner/240.png","/assets/hunters/Gunner/241.png","/assets/hunters/Gunner/242.png","/assets/hunters/Gunner/243.png","/assets/hunters/Gunner/250.png","/assets/hunters/Gunner/251.png","/assets/hunters/Gunner/252.png","/assets/hunters/Gunner/260.png","/assets/hunters/Gunner/hero.png","/assets/hunters/Operative/000.png","/assets/hunters/Operative/010.png","/assets/hunters/Operative/011.png","/assets/hunters/Operative/012.png","/assets/hunters/Operative/020.png","/assets/hunters/Operative/021.png","/assets/hunters/Operative/022.png","/assets/hunters/Operative/023.png","/assets/hunters/Operative/030.png","/assets/hunters/Operative/031.png","/assets/hunters/Operative/032.png","/assets/hunters/Operative/040.png","/assets/hunters/Operative/041.png","/assets/hunters/Operative/042.png","/assets/hunters/Operative/043.png","/assets/hunters/Operative/044.png","/assets/hunters/Operative/050.png","/assets/hunters/Operative/051.png","/assets/hunters/Operative/052.png","/assets/hunters/Operative/060.png","/assets/hunters/Operative/100.png","/assets/hunters/Operative/110.png","/assets/hunters/Operative/111.png","/assets/hunters/Operative/112.png","/assets/hunters/Operative/120.png","/assets/hunters/Operative/121.png","/assets/hunters/Operative/122.png","/assets/hunters/Operative/123.png","/assets/hunters/Operative/130.png","/assets/hunters/Operative/131.png","/assets/hunters/Operative/132.png","/assets/hunters/Operative/140.png","/assets/hunters/Operative/141.png","/assets/hunters/Operative/142.png","/assets/hunters/Operative/143.png","/assets/hunters/Operative/150.png","/assets/hunters/Operative/160.png","/assets/hunters/Operative/200.png","/assets/hunters/Operative/210.png","/assets/hunters/Operative/211.png","/assets/hunters/Operative/212.png","/assets/hunters/Operative/220.png","/assets/hunters/Operative/221.png","/assets/hunters/Operative/222.png","/assets/hunters/Operative/223.png","/assets/hunters/Operative/230.png","/assets/hunters/Operative/231.png","/assets/hunters/Operative/232.png","/assets/hunters/Operative/240.png","/assets/hunters/Operative/241.png","/assets/hunters/Operative/242.png","/assets/hunters/Operative/243.png","/assets/hunters/Operative/244.png","/assets/hunters/Operative/250.png","/assets/hunters/Operative/251.png","/assets/hunters/Operative/252.png","/assets/hunters/Operative/260.png","/assets/hunters/Operative/hero.png","/assets/hunters/Siren/000.png","/assets/hunters/Siren/010.png","/assets/hunters/Siren/011.png","/assets/hunters/Siren/012.png","/assets/hunters/Siren/020.png","/assets/hunters/Siren/021.png","/assets/hunters/Siren/022.png","/assets/hunters/Siren/023.png","/assets/hunters/Siren/030.png","/assets/hunters/Siren/031.png","/assets/hunters/Siren/032.png","/assets/hunters/Siren/033.png","/assets/hunters/Siren/034.png","/assets/hunters/Siren/040.png","/assets/hunters/Siren/041.png","/assets/hunters/Siren/050.png","/assets/hunters/Siren/051.png","/assets/hunters/Siren/052.png","/assets/hunters/Siren/053.png","/assets/hunters/Siren/060.png","/assets/hunters/Siren/100.png","/assets/hunters/Siren/110.png","/assets/hunters/Siren/111.png","/assets/hunters/Siren/112.png","/assets/hunters/Siren/120.png","/assets/hunters/Siren/121.png","/assets/hunters/Siren/122.png","/assets/hunters/Siren/123.png","/assets/hunters/Siren/130.png","/assets/hunters/Siren/131.png","/assets/hunters/Siren/132.png","/assets/hunters/Siren/140.png","/assets/hunters/Siren/141.png","/assets/hunters/Siren/142.png","/assets/hunters/Siren/143.png","/assets/hunters/Siren/150.png","/assets/hunters/Siren/151.png","/assets/hunters/Siren/152.png","/assets/hunters/Siren/160.png","/assets/hunters/Siren/200.png","/assets/hunters/Siren/210.png","/assets/hunters/Siren/211.png","/assets/hunters/Siren/212.png","/assets/hunters/Siren/220.png","/assets/hunters/Siren/221.png","/assets/hunters/Siren/222.png","/assets/hunters/Siren/223.png","/assets/hunters/Siren/230.png","/assets/hunters/Siren/231.png","/assets/hunters/Siren/232.png","/assets/hunters/Siren/240.png","/assets/hunters/Siren/241.png","/assets/hunters/Siren/242.png","/assets/hunters/Siren/243.png","/assets/hunters/Siren/250.png","/assets/hunters/Siren/251.png","/assets/hunters/Siren/252.png","/assets/hunters/Siren/260.png","/assets/hunters/Siren/hero.png","/assets/hunters/augment-action.png","/assets/hunters/augment-chevron.png","/assets/hunters/augment-diamond.png","/assets/hunters/basic.png","/assets/manifest.json","/assets/robots.txt","/"],"additional":[],"optional":[]},"externals":[],"hashesMap":{"6e148698d382b2c0806ba60a00e5e3e431d7232f":"/45598562077bdc84281b5330ff4d283e.png","507dda73c3ff7f9e08f8788d03b518bb39678b85":"/6274c9808eb08785f146a2b78283b5f6.jpg","1c64802fa6f529624ba507763c4ada3269f335dc":"/bundle.8799e.css","dc1a387b629a5b2429422d3d94bfc406a76c2357":"/bundle.964e211b.js","67af5559591f22ffba90d13299f3df513e5cbc52":"/assets/favicon.png","9af1150332d75385d8ffdc64d571ec8d1a437f0f":"/assets/hunters/Beastmaster/000.png","c2925bcd582074cfd7e6aeedcd1dbb2781a48031":"/assets/hunters/Beastmaster/001.png","6d40ff1f4f45ea121a66d2293d2db879d9d66ef6":"/assets/hunters/Beastmaster/010.png","ed9f7a1a2d7e0bbc75bb655a9899f5daee69d9df":"/assets/hunters/Beastmaster/011.png","189f08d09779099cb3866ecd2e5db147e8688f7b":"/assets/hunters/Beastmaster/012.png","4da990290ac582249093aa0762ec03ce194568d9":"/assets/hunters/Beastmaster/020.png","c587d5fe8d5e028bb7e616dcea87379611f268f1":"/assets/hunters/Beastmaster/021.png","a46ddf7becbdfc0de6acab4527ab2ea2321a2d5a":"/assets/hunters/Beastmaster/022.png","af94b67084c450485969b7f3b9214db033c72084":"/assets/hunters/Beastmaster/023.png","fd0cfa0fed9faca922742630721f5816554e93e3":"/assets/hunters/Beastmaster/030.png","901a3ecef0ef8dada62b1b30e8bdf49fb1551ddf":"/assets/hunters/Beastmaster/031.png","dadc56494285303f24541f5577bb205a74043a62":"/assets/hunters/Beastmaster/032.png","7ae0e52589523f74914281227f6e461ff2d9a267":"/assets/hunters/Beastmaster/033.png","faeaa65837f8379a0e11960b89caec4d5bace436":"/assets/hunters/Beastmaster/040.png","f28d5dc8cf56ec11f6d2ecdef2375edfe953a562":"/assets/hunters/Beastmaster/041.png","ac562b991899445dcc8878a69d1a2a76de25f4e6":"/assets/hunters/Beastmaster/042.png","1a91e2aa94ad216dc0c71851c008bd818bdb1941":"/assets/hunters/Beastmaster/043.png","f03ca5e3841494d7773c1c0aff46aaa11e53f85a":"/assets/hunters/Beastmaster/050.png","cb621aefc1783ddb201e202d412ad3907b78f414":"/assets/hunters/Beastmaster/051.png","22d915e3a307b42461c9b8cfb1c2bb3c78f36a8a":"/assets/hunters/Beastmaster/060.png","30628665bf411727c306cbeac159456db3be9e1f":"/assets/hunters/Beastmaster/100.png","82dcc57934ea55d61fa48dbbb190574a5b83a3d8":"/assets/hunters/Beastmaster/101.png","7e14ff5afd5e2eec8e0f0f6e11f7f475317924fa":"/assets/hunters/Beastmaster/110.png","024f1a8d93699ef6add10638fb7a34d8edb60d8c":"/assets/hunters/Beastmaster/111.png","7df3c789dbf3a63f3a1b226a9d52dad1d882b2f9":"/assets/hunters/Beastmaster/112.png","26cf2fdbb660e73e0127dd4d3db270f9caddef3a":"/assets/hunters/Beastmaster/120.png","33e7cb07076d660b1124bf0e700b54c560b35396":"/assets/hunters/Beastmaster/121.png","a2e8552717e0b056949779ae5720c1a03bdb4372":"/assets/hunters/Beastmaster/122.png","ac7ffb0b0746ac85d369e1bd3c7947a34ba396aa":"/assets/hunters/Beastmaster/123.png","0bec5e860f684498986e687f265c30f8091869c2":"/assets/hunters/Beastmaster/130.png","8b693e1a7730d22dcf1c1b2eddcaae94b372c769":"/assets/hunters/Beastmaster/131.png","aaf378398b332e219c89cc0a4a4f401cc254866b":"/assets/hunters/Beastmaster/132.png","99a3944a10da723293bca8c01cf335b1068093f0":"/assets/hunters/Beastmaster/133.png","32cc792225263a7d52b1e4f20893365f20cc812b":"/assets/hunters/Beastmaster/140.png","ce96b467323aab2967e07124fef6b58d4259229c":"/assets/hunters/Beastmaster/141.png","d78620f70a3ce4f785c8f4b1d7aebd23a0831fe2":"/assets/hunters/Beastmaster/142.png","e71e828300067bb37ddff61f38d3559ae9e20c2c":"/assets/hunters/Beastmaster/143.png","eeff605535573fed8b6ce039e91e37beaf5ea456":"/assets/hunters/Beastmaster/150.png","ea2699d4b4c5eaca7588dc33bc10f27f1206052c":"/assets/hunters/Beastmaster/151.png","e325151f9b69d8d147407c8b70ce72627ca93830":"/assets/hunters/Beastmaster/152.png","982415964f422ed25a5ffab32a28ea7a854c1541":"/assets/hunters/Beastmaster/160.png","977877a464943f876846612ecc8493bb8137b0f6":"/assets/hunters/Beastmaster/200.png","7fb64ed1f5d0baf25f772cd5af5da6feb2f6270d":"/assets/hunters/Beastmaster/201.png","d9a71f3dee3ed3f69ff83794687c9c06228385b3":"/assets/hunters/Beastmaster/210.png","96ce6f53559178f4dfbbabf251242a4c5c241b17":"/assets/hunters/Beastmaster/211.png","6e044f76a1700b3739bfcafbbfb33e9146f2693a":"/assets/hunters/Beastmaster/212.png","23abf2f2c2b3bba52a7eef79e2e3460a063b063a":"/assets/hunters/Beastmaster/220.png","32c28e47255087a985b6f17c2076534ea631c1ee":"/assets/hunters/Beastmaster/221.png","b23df346b16cd8aa7e320e90d3c759f8fafc9929":"/assets/hunters/Beastmaster/222.png","663f88fff3084d908fd24a36ecd7b6c88bc4b940":"/assets/hunters/Beastmaster/223.png","1b61af090bb407ae59f4fce586f777e99f390abd":"/assets/hunters/Beastmaster/230.png","15d9fbd82ef4e0de5eaafb1ee079ef276e721573":"/assets/hunters/Beastmaster/231.png","253f574bc73a1cd2b808a382de2ec3a04c3b94bb":"/assets/hunters/Beastmaster/232.png","ddeda995655074539ee0bad9c6588a2cdcc36e61":"/assets/hunters/Beastmaster/240.png","94b05d293948e5d6588dcc423019b40eff55396d":"/assets/hunters/Beastmaster/241.png","afaf095f2bf2a9478fde265dd06b5b1d6d68ef1b":"/assets/hunters/Beastmaster/242.png","e3073e7192fa6ac41dd2a48d309056f37a908c92":"/assets/hunters/Beastmaster/243.png","8df769891eeb6868762131a107658dff76f4b139":"/assets/hunters/Beastmaster/250.png","ba3887ee18f5edd865c6069f89ff1a5603dd119b":"/assets/hunters/Beastmaster/251.png","5e9b8f8e3d316c352177fa203cc280ccaed98f43":"/assets/hunters/Beastmaster/252.png","5d20741e9d260aca46897c69dd5427c50000c012":"/assets/hunters/Beastmaster/260.png","a130dbe9dbd85818b542218b80337b41a60b8f57":"/assets/hunters/Beastmaster/hero.png","4187c6c8ae77b9bd8d0215d6980ce50d3b7c3e19":"/assets/hunters/Gunner/000.png","54ba8ace6d5d6e8ae01ec25a1db23910ea4230b6":"/assets/hunters/Gunner/010.png","a64742e5642e605bf7ef6a8f4686d292d60b0d31":"/assets/hunters/Gunner/011.png","63090db8b79d42db3af5da2011ee75fa4b15c263":"/assets/hunters/Gunner/012.png","0ea5958ea65635176bbd7e13c152cc4333621245":"/assets/hunters/Gunner/020.png","cd5d48863b8f918eff767e4a27978983f5532863":"/assets/hunters/Gunner/021.png","dc39585077aa0888669d15d9e4ac9af80c4470d3":"/assets/hunters/Gunner/022.png","366c52377ad6b58e2a4b405855c94b221748cf58":"/assets/hunters/Gunner/023.png","4c3e4ad961bb6a2df481a385e0dd792622853098":"/assets/hunters/Gunner/024.png","bb2acdcd1cfc65557be53994f5e464add91efef8":"/assets/hunters/Gunner/030.png","18727a70a50c5c88546d6a18f422a5a9fec0eb60":"/assets/hunters/Gunner/031.png","bfa8f91257949610a3ed259d0e75cc4c297667dc":"/assets/hunters/Gunner/032.png","b0189c14fb87e38e996f45aeb5b866830caae3fd":"/assets/hunters/Gunner/033.png","eebe75ecefbbb0d338e4878f930bc1105fe2b01f":"/assets/hunters/Gunner/040.png","f98d09199bbf20aa0a10bb80da8eba3066056287":"/assets/hunters/Gunner/041.png","cbd1b2927a1eb75ec293c4231c4bc61c6e8d740f":"/assets/hunters/Gunner/042.png","a7b036839f7cf93c6f3b3372d55b774aff758be0":"/assets/hunters/Gunner/043.png","fd4608d9372eff5bd077693c60ed19aa01fb4969":"/assets/hunters/Gunner/050.png","0ffe098e5a7914ad6a68dc68953f81f2666d6120":"/assets/hunters/Gunner/051.png","7ff320db6f0b9fd30d5821adbd3e20ca959b42c6":"/assets/hunters/Gunner/052.png","aa17029957f1594bada996c1dc9856a7fb4471e2":"/assets/hunters/Gunner/060.png","da1375416c4581fed1c744b6bdd0e47818178d94":"/assets/hunters/Gunner/100.png","f0985444446483e8155d5ad62b1a4891f134fa83":"/assets/hunters/Gunner/110.png","445438d55e403f82c19514787ddef15e5e954b80":"/assets/hunters/Gunner/111.png","0fe037264951d5cb8f0cd491de447f49a08064d0":"/assets/hunters/Gunner/112.png","7a65dafe4415dbcf539da1ec53e536acd1745ec5":"/assets/hunters/Gunner/120.png","05f3bbbe0c86817a04bd38488c77321e92dea508":"/assets/hunters/Gunner/121.png","6f4d55e6ad61f43edc35f6470d939978680efc9a":"/assets/hunters/Gunner/122.png","f55dc9d48685bee4ef27001fd53b5c3c383e83b7":"/assets/hunters/Gunner/123.png","aecb1b10a6e3d7b257f041222ff10997e92b07ba":"/assets/hunters/Gunner/124.png","b701fbcb98aca94c4e6568b1c32f906586f480a3":"/assets/hunters/Gunner/130.png","35604765c3975337b7e4c8e8b0e0aebb52517ff8":"/assets/hunters/Gunner/131.png","4f961a48612b9e3a088f5531102be6e609a9fc8f":"/assets/hunters/Gunner/132.png","0e15f8e90e1940044a3ca106f938279ac9cc7f0b":"/assets/hunters/Gunner/133.png","2389e82816838d62586b52e7388482664f3060ab":"/assets/hunters/Gunner/140.png","6206c23cc0ff52527d39f0334edbf1df9a4800d1":"/assets/hunters/Gunner/141.png","7ea99637b1199931144a5fe37813c5e9e8324362":"/assets/hunters/Gunner/142.png","71297be19da6b323bc9f6ccff3e724b6d50b29d3":"/assets/hunters/Gunner/143.png","0010bbf4ca4077299aa70fea4a0add3071d6ddb9":"/assets/hunters/Gunner/150.png","a0a6a4366ce4b1e0e5a50d73f9538fc3ac04e8d2":"/assets/hunters/Gunner/151.png","82a16ee707c2d92ab932cd1db55cb9020e670272":"/assets/hunters/Gunner/152.png","114a44e26c933145f43a36cea694770eb3b120a1":"/assets/hunters/Gunner/160.png","1d5b2851ef2347aabf476f610600e4476c3b18bf":"/assets/hunters/Gunner/200.png","e7febc53830b0e4fb9cd8a92c2e6332ce1540f01":"/assets/hunters/Gunner/210.png","bd2bd9ba423cecbd1eadd6ed1ca4a68679b1dbc3":"/assets/hunters/Gunner/211.png","2fabd4a301616f6704940823d7a81c5fd369f53d":"/assets/hunters/Gunner/212.png","f9848cfe5c6fb11a5821029722af40faaee64a96":"/assets/hunters/Gunner/220.png","a2598fb40de61863547fe2b67c81b149e8fbc332":"/assets/hunters/Gunner/221.png","bc5e563aaf3216c6efb290e99cd3b6a362bb7d95":"/assets/hunters/Gunner/222.png","8d361fd4a34014b89b9c0a03a9fa338dba865ce5":"/assets/hunters/Gunner/223.png","3f4c9dd9f0dd7354273758532040fbccc2277c6f":"/assets/hunters/Gunner/224.png","b7b50379f1803c2d00f719483f1ed7aa34bddd45":"/assets/hunters/Gunner/230.png","0448c6458f4f5359776f636a471580fb11121be8":"/assets/hunters/Gunner/231.png","256073fae1eb05b3d94651905f01cb5bfd92e23b":"/assets/hunters/Gunner/232.png","cbca31bdca22859ab3f37ccdd80ae8334b794338":"/assets/hunters/Gunner/233.png","4522c90c5d25323cd95180054514cc6ccdb92664":"/assets/hunters/Gunner/240.png","e89b15316e45658116fed755c6011521e486ae9b":"/assets/hunters/Gunner/241.png","44cb933def44307d807f4634268686e0a5aa8216":"/assets/hunters/Gunner/242.png","77dd207479a8fa95602d195c9deb1eebf0b5b697":"/assets/hunters/Gunner/243.png","223135018c6e6d35524ef84b6a8cfceae4b4275c":"/assets/hunters/Gunner/250.png","0aed8b4d9cb55d8d6df832ac1ffa2de61ac85def":"/assets/hunters/Gunner/251.png","3906bbc206f0eacbe03247f8fbd334b0545b0b70":"/assets/hunters/Gunner/252.png","3bec18b1f50a52e19b78c59b7df679734c07a43f":"/assets/hunters/Gunner/260.png","eaf0686064b5bc00abc5b7cc0fb8939369a41503":"/assets/hunters/Gunner/hero.png","e40e1fc31efbc81b37ff548787f0edd4b8b64c13":"/assets/hunters/Operative/000.png","fd18822d21daa341af9e4f94fa70262db14e7e35":"/assets/hunters/Operative/010.png","058992804a106410e81d1b49dca7fa8ce1c6b5c9":"/assets/hunters/Operative/011.png","654f8233158d370f5a40f5fe36f63e85aaae0740":"/assets/hunters/Operative/012.png","095a541f6df8d85c8b08d2f229008c80f7c69272":"/assets/hunters/Operative/020.png","d53106ffa8f071e7378431dcc785bfad863f4518":"/assets/hunters/Operative/021.png","6bd2425c6cdf8540e9dd6039f95214e6a80cb2ad":"/assets/hunters/Operative/022.png","7a3fbca77aaff8e9fbdcd15c204e339cebfabe3d":"/assets/hunters/Operative/023.png","e64459bcabee744812c4b3cc407d17e14b5bc234":"/assets/hunters/Operative/030.png","c2ddf9b83a43f78f5b85f0a3f3e7d1d4c7985b2a":"/assets/hunters/Operative/031.png","d850497106e1e12027db58408438dab289517dd6":"/assets/hunters/Operative/032.png","507904d621f8a38c95cf410ce5613dd97833a494":"/assets/hunters/Operative/040.png","bf29347f3a54ac5abf730245a6d5d9fc71a8210b":"/assets/hunters/Operative/041.png","8e2e0be519c250a5e5b64f7c623761a568131255":"/assets/hunters/Operative/042.png","30ffd6fc8ff712203258736ef97af135c86a338a":"/assets/hunters/Operative/043.png","219b472bf0aa359cc2d051c2fb8feec06802ba5c":"/assets/hunters/Operative/044.png","a7ec503665b5309d42b0cc5d202098c80f23e0ea":"/assets/hunters/Operative/050.png","c0aa8c2498b3b9bd73422ff8efea305fad690e18":"/assets/hunters/Operative/051.png","4bd4d4f7b4cc589129e2f22cb5a32c5a08541d2a":"/assets/hunters/Operative/052.png","7c288f69ff398d0825f188a7989fed55416836a0":"/assets/hunters/Operative/060.png","7a495ec486cbe6ba809f0ceb31117225017910e5":"/assets/hunters/Operative/100.png","c7a17ec6da6656a3e041ce2b7f42c1b92ed713fa":"/assets/hunters/Operative/110.png","4a8fda88f745e7301235c978a134d3ca5c41d5a7":"/assets/hunters/Operative/111.png","2002837a2ec2c7f6dada2f6aaa75388f29ad6e4c":"/assets/hunters/Operative/112.png","04a9c7c143898286803a85cef9db9066dcb2bada":"/assets/hunters/Operative/120.png","a4480299ebbe70463b4ee1c184da0d0ba209182c":"/assets/hunters/Operative/121.png","80e14d582ebcf34e22abfa0cc7d4f1557503214e":"/assets/hunters/Operative/122.png","4a7b8d4b079c5f00f04fdffdb657e8ad69446560":"/assets/hunters/Operative/123.png","2c2af16423174d171f3ee39459aebebbf9ae9fad":"/assets/hunters/Operative/130.png","826a5707be9431a3dd0b7b0bd0b59bb5710c1447":"/assets/hunters/Operative/131.png","86ba39661db22dd276eb3dfbec65988b012c9237":"/assets/hunters/Operative/132.png","45c65212d85d25b9c4ab5ab05824da55107743f4":"/assets/hunters/Operative/140.png","eeba798cd9a667dfc31ab25db9cb4a633d31a150":"/assets/hunters/Operative/141.png","be846fd50ce21587aa0cea64d4a5f57937ba5265":"/assets/hunters/Operative/142.png","e8c7b5aecf30e84c6323b10156a8532064bece5d":"/assets/hunters/Operative/143.png","6b488e1ddbd290ba80a210b735b3c25c58ed7cb8":"/assets/hunters/Operative/150.png","19e79d9cf7054f0fb659fa696ffc380e9d468dc4":"/assets/hunters/Operative/160.png","7d62f2dd934d1104f2dfffb3ddb89cdcd5da016b":"/assets/hunters/Operative/200.png","09b9d5331cee82ebafb31036819aeb604385d8a2":"/assets/hunters/Operative/210.png","9cd2e136045e5edc2d47949ec7d76676fbffbc85":"/assets/hunters/Operative/211.png","cc20f1335a72571f1651dce50d3e954f7e482b7e":"/assets/hunters/Operative/212.png","355d50f3aefe59db6bcd1ace3b23d0a15a090b05":"/assets/hunters/Operative/220.png","35a1a8612977e3ab005a673e5a59919fa919d956":"/assets/hunters/Operative/221.png","6a7240e95312ac568433ec4e91dae1cd44d25e14":"/assets/hunters/Operative/222.png","94dde5c18b76dbaf6acc716025712a46d898fae0":"/assets/hunters/Operative/223.png","a24c06a778d615b34d2c2db09a02181df00e3c2f":"/assets/hunters/Operative/230.png","0fe3f7793c7062d3164a6ecac07d0b6a1fc55d65":"/assets/hunters/Operative/231.png","63fdc826a006dc32530ed16e32b56744da96ff99":"/assets/hunters/Operative/232.png","064c956df313d6fc95f3b0998e389483a0fd28c6":"/assets/hunters/Operative/240.png","e0047708adb72841ac537da604a39e9e46dcb0b7":"/assets/hunters/Operative/241.png","1b45c4f82f2dfdabe2742b67d6f5d1d86f0d4283":"/assets/hunters/Operative/242.png","d5fd1f52ecc2d44786465272493728e6d98ede30":"/assets/hunters/Operative/243.png","a48399aab7c43c283dacc9de894b18147bbfccb1":"/assets/hunters/Operative/244.png","46711a97a1363d1975980cfdd5c09dadf31a729b":"/assets/hunters/Operative/250.png","be8be3cef153cefbc4fdf66b8a5c70d7a0fc068f":"/assets/hunters/Operative/251.png","4494a87bef0d5054b9f9ce24f2106cacd5c6fa6e":"/assets/hunters/Operative/252.png","bae7b02fceee628ce289afa0d7014ccca58f83e2":"/assets/hunters/Operative/260.png","695afb5dc6e3bdfadb89b6eb3d12415efca249fe":"/assets/hunters/Operative/hero.png","57212c02193b23f4d17554ef88380fe306c986df":"/assets/hunters/Siren/000.png","58319e672307d1c516bbbbef749a630c6e37767b":"/assets/hunters/Siren/010.png","f485089a7a1ed3611a91eea49618010632c69642":"/assets/hunters/Siren/011.png","60963b8fa9158e8f365e7cad2cf8531f50176af2":"/assets/hunters/Siren/012.png","3088bb213a23ef9fb576896f0efbd732fb2f7f33":"/assets/hunters/Siren/020.png","c554f40fafaaa061e988f98304f493079253d731":"/assets/hunters/Siren/021.png","8ceafe51b741d8b1a8ea744cd29e237fabd3d692":"/assets/hunters/Siren/022.png","8c2d8c8cc3c60d010805912ec61d5749a03f027f":"/assets/hunters/Siren/023.png","6e0a6c9f543c240479b6c1d73d2b13af3125f4e8":"/assets/hunters/Siren/030.png","e57dd3c7611d17ec6142b6a04500c319f2ab8e79":"/assets/hunters/Siren/031.png","dc6a903b77a8a67c4384fb1f354b34ea2fe4b92e":"/assets/hunters/Siren/032.png","f9b122cfa271eeccec58058c80f4aeefbce87c9b":"/assets/hunters/Siren/033.png","d520fa5bd39b828d5746578f15922fd9f0d27ffd":"/assets/hunters/Siren/034.png","6cd40c59f7373893a7bb33d00f8ff24da60349a5":"/assets/hunters/Siren/040.png","aa296237d8c5cf8cf5f2d06231cdcec07b36e509":"/assets/hunters/Siren/041.png","ef80ca78fb970a88688ca0289e8a7843f6b3ddd9":"/assets/hunters/Siren/050.png","e90bfd5bfe9c7a8c03429c1eee49ff26bfc669e1":"/assets/hunters/Siren/051.png","bd6709b152682fc2eb88297361d348a2c2cee9a1":"/assets/hunters/Siren/052.png","0f879d03ec6df9291678cea9ad8d3bef4e0d3b74":"/assets/hunters/Siren/053.png","9d04da9a041282cb37c0d97e83bce85c63a785f2":"/assets/hunters/Siren/060.png","96fdbdeb8ef38823499cf59b446ac20b86db7ee0":"/assets/hunters/Siren/100.png","bda71cc5df9d604cd097d3f8da0c0404a503b1af":"/assets/hunters/Siren/110.png","0280f1bd6a29b9ae6668fb46b4d45371bf539630":"/assets/hunters/Siren/111.png","83b3f792d7952ce470674935f802833771ada128":"/assets/hunters/Siren/112.png","6087f9870b7c431b1087d48b34524f75f4ebdff9":"/assets/hunters/Siren/120.png","30159cf274855c028235426501aaf6eac8a645a2":"/assets/hunters/Siren/121.png","13295df1006186480bb76d038dbab73743e440f2":"/assets/hunters/Siren/122.png","b2c9c54e37c5ff2701a4b6c02ac83f2b04b460a4":"/assets/hunters/Siren/123.png","628ac596fdb6381c784e593e5c242bfe92d6759b":"/assets/hunters/Siren/130.png","a2b8e7c9cb73862413ee6dd41fd50b65727a4681":"/assets/hunters/Siren/131.png","7d0d1fcb4d9a2eb4ceb6d7b108e46cee8ca1e01b":"/assets/hunters/Siren/132.png","cd371cfffd3f085fb5d4e366a7245585d98434ac":"/assets/hunters/Siren/140.png","f76d7c745e7e7f4fe95fe46cd0ab2102b877bd99":"/assets/hunters/Siren/141.png","e1d68cc26a18121171ad00dcaeb4bd0363a60ab1":"/assets/hunters/Siren/142.png","a371dd81416210b59829dd1c6cd9b33b93ce5b8a":"/assets/hunters/Siren/143.png","6d858495a04fe72c3c357fe9cd241f264f133ad5":"/assets/hunters/Siren/150.png","eab92d709b012c7e21ef7c6b2ad8443ce2a7a3f4":"/assets/hunters/Siren/151.png","bed032432c354753eb8a611993498dc53ca2e6e9":"/assets/hunters/Siren/152.png","3fa960d2c12874870a56a9eea8975b1db805e66c":"/assets/hunters/Siren/160.png","4ecfeeb74d55e7d7f57fccefe731c0f33d362deb":"/assets/hunters/Siren/200.png","e640a9ef005cc59f56512f0ada6f5dbd32a1ef5c":"/assets/hunters/Siren/210.png","327b02ecb10ebcddb1c33e52ba08a2cb92712682":"/assets/hunters/Siren/211.png","a797f881e6817655670a0d32dc74ad15fed5c6d8":"/assets/hunters/Siren/212.png","4451f38ff89ff4efab9eedf58b37acb849456720":"/assets/hunters/Siren/220.png","ac195d75dcd3ae551aef64ff80433252467f20ea":"/assets/hunters/Siren/221.png","f7f74c2a2c23b96486054eef8487a3dbd07ece92":"/assets/hunters/Siren/222.png","63405fd1654248ae3f45e4a7fb3c05d513b364f9":"/assets/hunters/Siren/223.png","58e1d50d3d2e48b1858ce394f43f813c12ec1c2c":"/assets/hunters/Siren/230.png","3b272462d3f5622ade8f46bc1c88333e6f62e05f":"/assets/hunters/Siren/231.png","1c2b2485f37289911ef97036094d2c4c5b0ef618":"/assets/hunters/Siren/232.png","fdf3a0d346941525e0e6d1590d264d5c49ef1148":"/assets/hunters/Siren/240.png","a3d38dcf1753639fe32232d6cba92e42036642ac":"/assets/hunters/Siren/241.png","89bdc1c2aa3342c88fb14ae41793799b109484de":"/assets/hunters/Siren/242.png","bad9c3d49d066e545271058d818cc3fca10514e4":"/assets/hunters/Siren/243.png","54753ca6c780d7622417d673c665ab11bc204029":"/assets/hunters/Siren/250.png","ed21a092d748afd5b86f100839d05f4cb5b2d3b2":"/assets/hunters/Siren/251.png","1ea9f714dc662ce8e0a0035de4db7a0a05e334c7":"/assets/hunters/Siren/252.png","50cc650d962be41549a8595ca6df34b4741a8e50":"/assets/hunters/Siren/260.png","88c73b79a233f81fb265f4a5440157968b250a51":"/assets/hunters/Siren/hero.png","da5115eef0fec4fa4125932d2979689e8c9401e0":"/assets/hunters/augment-action.png","6f1cc287ad25e2f0d8ca12256c2f0277e932b8a8":"/assets/hunters/augment-chevron.png","cfb4c486971c9fac258b2288e3511bc78b7b94b9":"/assets/hunters/augment-diamond.png","1a69f37c8ca85b7e15720d4557b7c3e610b5bd13":"/assets/hunters/basic.png","3a03eb4a327cd89d096bd1ed9f95366649e8e259":"/assets/manifest.json","c47ccf1a49c24cc5842430aa75c72ef491292412":"/assets/robots.txt","728e9f004b7b7faa9fb0e43de63e0691fbb9bc54":"/"},"strategy":"changed","responseStrategy":"cache-first","version":"1/10/2020, 10:46:41 PM","name":"webpack-offline","pluginVersion":"5.0.7","relativePaths":false}; !function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(n){return e[n]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="/",n(n.s="+N4f")}({"+N4f":function(e,n,t){"use strict";function r(e,n){return caches.match(e,{cacheName:n}).then(function(t){return o(t)?t:i(t).then(function(t){return caches.open(n).then(function(n){return n.put(e,t)}).then(function(){return t})})}).catch(function(){})}function o(e){return!e||!e.redirected||!e.ok||"opaqueredirect"===e.type}function i(e){return o(e)?Promise.resolve(e):("body"in e?Promise.resolve(e.body):e.blob()).then(function(n){return new Response(n,{headers:e.headers,status:e.status})})}function a(e,n){console.groupCollapsed("[SW]:",e),n.forEach(function(e){console.log("Asset:",e)}),console.groupEnd()}var c,s,u;if(c=ExtendableEvent.prototype.waitUntil,s=FetchEvent.prototype.respondWith,u=new WeakMap,ExtendableEvent.prototype.waitUntil=function(e){var n=this,t=u.get(n);if(!t)return t=[Promise.resolve(e)],u.set(n,t),c.call(n,Promise.resolve().then(function e(){var r=t.length;return Promise.all(t.map(function(e){return e.catch(function(){})})).then(function(){return t.length!=r?e():(u.delete(n),Promise.all(t))})}));t.push(Promise.resolve(e))},FetchEvent.prototype.respondWith=function(e){return this.waitUntil(e),s.call(this,e)},void 0===f)var f=!1;!function(e,n){function t(n){var t=w[n];return caches.open(q).then(function(r){return h(r,t,{bust:e.version,request:b,failAll:"main"===n})}).then(function(){a("Cached assets: "+n,t)}).catch(function(e){throw console.error(e),e})}function o(n){return caches.keys().then(function(e){for(var n=e.length,t=void 0;n--&&0!==(t=e[n]).indexOf(P););if(t){var r=void 0;return caches.open(t).then(function(e){return r=e,e.match(new URL(R,location).toString())}).then(function(e){if(e)return Promise.all([r,r.keys(),e.json()])})}}).then(function(r){if(!r)return t(n);var o=r[0],i=r[1],c=r[2],s=c.hashmap;if(!c.hashmap||c.version===e.version)return t(n);var u=Object.keys(s).map(function(e){return s[e]}),f=i.map(function(e){var n=new URL(e.url);return n.search="",n.hash="",n.toString()}),l=w[n],d=[],p=l.filter(function(e){return-1===f.indexOf(e)||-1===u.indexOf(e)});Object.keys(y).forEach(function(e){var n=y[e];if(-1!==l.indexOf(n)&&-1===p.indexOf(n)&&-1===d.indexOf(n)){var t=s[e];t&&-1!==f.indexOf(t)?d.push([t,n]):p.push(n)}}),a("Changed assets: "+n,p),a("Moved assets: "+n,d);var v=Promise.all(d.map(function(e){return o.match(e[0]).then(function(n){return[e[1],n]})}));return caches.open(q).then(function(t){var r=v.then(function(e){return Promise.all(e.map(function(e){return t.put(e[0],e[1])}))});return Promise.all([r,h(t,p,{bust:e.version,request:b,failAll:"main"===n,deleteFirst:"main"!==n})])})})}function c(){return caches.keys().then(function(e){var n=e.map(function(e){if(0===e.indexOf(P)&&0!==e.indexOf(q))return console.log("[SW]:","Delete cache:",e),caches.delete(e)});return Promise.all(n)})}function s(){return caches.open(q).then(function(n){var t=new Response(JSON.stringify({version:e.version,hashmap:y}));return n.put(new URL(R,location).toString(),t)})}function u(e,n,t){return function(e){if(v&&"function"==typeof v.map&&e.preloadResponse&&"navigate"===e.request.mode){var n=v.map(new URL(e.request.url),e.request);n&&function(e,n){var t=new URL(e,location),r=n.preloadResponse;x.set(r,{url:t,response:r});var o=function(){return x.has(r)},i=r.then(function(e){if(e&&o()){var n=e.clone();return caches.open(O).then(function(e){if(o())return e.put(t,n).then(function(){if(!o())return caches.open(O).then(function(e){return e.delete(t)})})})}});n.waitUntil(i)}(n,e)}}(e),r(t,q).then(function(r){return r?(f&&console.log("[SW]:","URL ["+t+"]("+n+") from cache"),r):fetch(e.request).then(function(r){return r.ok?(f&&console.log("[SW]:","URL ["+n+"] from network"),t===n&&(o=r.clone(),i=caches.open(q).then(function(e){return e.put(n,o)}).then(function(){console.log("[SW]:","Cache asset: "+n)}),e.waitUntil(i)),r):(f&&console.log("[SW]:","URL ["+n+"] wrong response: ["+r.status+"] "+r.type),r);var o,i})})}function l(e){var n=new URL(e.request.url);if(self.registration.navigationPreload&&v&&v.test&&v.test(n,e.request)){var t=function(e){if(x){var n=void 0,t=void 0;return x.forEach(function(r,o){r.url.href===e.href&&(n=r.response,t=o)}),n?(x.delete(t),n):void 0}}(n),o=e.request;return t?(e.waitUntil(caches.open(O).then(function(e){return e.delete(o)})),t):r(o,O).then(function(n){return n&&e.waitUntil(caches.open(O).then(function(e){return e.delete(o)})),n||fetch(e.request)})}}function h(e,n,t){n=n.slice();var r=t.bust,o=!1!==t.failAll,a=!0===t.deleteFirst,c=t.request||{credentials:"omit",mode:"cors"},s=Promise.resolve();return a&&(s=Promise.all(n.map(function(n){return e.delete(n).catch(function(){})}))),Promise.all(n.map(function(e){var n,t,o;return r&&(t=r,o=-1!==(n=e).indexOf("?"),e=n+(o?"&":"?")+"__uncache="+encodeURIComponent(t)),fetch(e,c).then(i).then(function(e){return e.ok?{response:e}:{error:!0}},function(){return{error:!0}})})).then(function(t){return o&&t.some(function(e){return e.error})?Promise.reject(new Error("Wrong response status")):(o||(t=t.filter(function(e,t){return!e.error||(n.splice(t,1),!1)})),s.then(function(){var r=t.map(function(t,r){return e.put(n[r],t.response)});return Promise.all(r)}))})}function d(e){return e.preloadResponse&&!0===v?e.preloadResponse.then(function(n){return n||fetch(e.request)}):fetch(e.request)}var p=n.cacheMaps,v=n.navigationPreload,m=e.strategy,g=e.responseStrategy,w=e.assets,y=e.hashesMap,U=e.externals,b=e.prefetchRequest||{credentials:"same-origin",mode:"cors"},P=e.name,q=P+":"+e.version,O=P+"$preload",R="__offline_webpack__data";Object.keys(w).forEach(function(e){w[e]=w[e].map(function(e){var n=new URL(e,location);return n.hash="",-1===U.indexOf(e)&&(n.search=""),n.toString()})}),y=Object.keys(y).reduce(function(e,n){var t=new URL(y[n],location);return t.search="",t.hash="",e[n]=t.toString(),e},{}),U=U.map(function(e){var n=new URL(e,location);return n.hash="",n.toString()});var S=[].concat(w.main,w.additional,w.optional);self.addEventListener("install",function(e){console.log("[SW]:","Install event");var n=void 0;n="changed"===m?o("main"):t("main"),e.waitUntil(n)}),self.addEventListener("activate",function(e){console.log("[SW]:","Activate event");var n=w.additional.length?(f&&console.log("[SW]:","Caching additional"),("changed"===m?o("additional"):t("additional")).catch(function(){console.error("[SW]:","Cache section `additional` failed to load")})):Promise.resolve();n=(n=(n=n.then(s)).then(c)).then(function(){if(self.clients&&self.clients.claim)return self.clients.claim()}),v&&self.registration.navigationPreload&&(n=Promise.all([n,self.registration.navigationPreload.enable()])),e.waitUntil(n)}),self.addEventListener("fetch",function(e){if("GET"===e.request.method&&("only-if-cached"!==e.request.cache||"same-origin"===e.request.mode)){var n=new URL(e.request.url);n.hash="";var t=n.toString();-1===U.indexOf(t)&&(n.search="",t=n.toString());var o=-1!==S.indexOf(t),i=t;if(!o){var a=function(e){var n=e.url,t=new URL(n),r=void 0;r=function(e){return"navigate"===e.mode||e.headers.get("Upgrade-Insecure-Requests")||-1!==(e.headers.get("Accept")||"").indexOf("text/html")}(e)?"navigate":t.origin===location.origin?"same-origin":"cross-origin";for(var o=0;o